diff options
author | rdevlin.cronin <rdevlin.cronin@chromium.org> | 2016-01-07 17:40:12 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-08 01:41:19 +0000 |
commit | 415930557c280022fed6a6ddd01f80f443704683 (patch) | |
tree | 69c08b49d6335013844a45cd70234f2689730433 /extensions | |
parent | 2ab2a401d6b48955715bed6fa5b93692ffaa1664 (diff) | |
download | chromium_src-415930557c280022fed6a6ddd01f80f443704683.zip chromium_src-415930557c280022fed6a6ddd01f80f443704683.tar.gz chromium_src-415930557c280022fed6a6ddd01f80f443704683.tar.bz2 |
[Extensions] Migrate ExtensionInstallPrompt::Delegate to be a callback
The ExtensionInstallPrompt + Delegate setup is prone to lifetime issues because
the caller of the delegate is a UI element, whereas the delegate is usually
somehow part of the extension system. At best, this makes lifetime management a
little confusing, but at worst, it's fundamentally flawed because UI ownership
and extension system ownership are very complicated at times like shutdown.
Instead, migrate the delegate to be a callback, where lifetime management is
more explicit (and safe if the fka delegate is deleted). Also update a few
confusing parts of the Cocoa install prompt API.
BUG=567844
TBR=benwells@chromium.org (small c/b/ui/extensions changes)
Review URL: https://codereview.chromium.org/1534123002
Cr-Commit-Position: refs/heads/master@{#368238}
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/browser/api/management/management_api.cc | 28 | ||||
-rw-r--r-- | extensions/browser/api/management/management_api.h | 5 | ||||
-rw-r--r-- | extensions/browser/api/management/management_api_delegate.h | 7 |
3 files changed, 22 insertions, 18 deletions
diff --git a/extensions/browser/api/management/management_api.cc b/extensions/browser/api/management/management_api.cc index 81fe012..2511aee 100644 --- a/extensions/browser/api/management/management_api.cc +++ b/extensions/browser/api/management/management_api.cc @@ -451,8 +451,10 @@ ExtensionFunction::ResponseAction ManagementSetEnabledFunction::Run() { if (!user_gesture()) return RespondNow(Error(keys::kGestureNeededForEscalationError)); - AddRef(); // Matched in InstallUIProceed/InstallUIAbort - install_prompt_ = delegate->SetEnabledFunctionDelegate(this, extension); + AddRef(); // Matched in OnInstallPromptDone(). + install_prompt_ = delegate->SetEnabledFunctionDelegate( + GetSenderWebContents(), browser_context(), extension, + base::Bind(&ManagementSetEnabledFunction::OnInstallPromptDone, this)); return RespondLater(); } if (prefs->GetDisableReasons(extension_id_) & @@ -474,18 +476,18 @@ ExtensionFunction::ResponseAction ManagementSetEnabledFunction::Run() { return RespondNow(NoArguments()); } -void ManagementSetEnabledFunction::InstallUIProceed() { - ManagementAPI::GetFactoryInstance() - ->Get(browser_context()) - ->GetDelegate() - ->EnableExtension(browser_context(), extension_id_); - Respond(OneArgument(new base::FundamentalValue(true))); - Release(); -} +void ManagementSetEnabledFunction::OnInstallPromptDone(bool did_accept) { + if (did_accept) { + ManagementAPI::GetFactoryInstance() + ->Get(browser_context()) + ->GetDelegate() + ->EnableExtension(browser_context(), extension_id_); + Respond(OneArgument(new base::FundamentalValue(true))); + } else { + Respond(Error(keys::kUserDidNotReEnableError)); + } -void ManagementSetEnabledFunction::InstallUIAbort(bool user_initiated) { - Respond(Error(keys::kUserDidNotReEnableError)); - Release(); + Release(); // Balanced in Run(). } void ManagementSetEnabledFunction::OnRequirementsChecked( diff --git a/extensions/browser/api/management/management_api.h b/extensions/browser/api/management/management_api.h index f37e9c9..fc9b563 100644 --- a/extensions/browser/api/management/management_api.h +++ b/extensions/browser/api/management/management_api.h @@ -114,9 +114,6 @@ class ManagementSetEnabledFunction : public UIThreadExtensionFunction { ManagementSetEnabledFunction(); - void InstallUIProceed(); - void InstallUIAbort(bool user_initiated); - protected: ~ManagementSetEnabledFunction() override; @@ -124,6 +121,8 @@ class ManagementSetEnabledFunction : public UIThreadExtensionFunction { ResponseAction Run() override; private: + void OnInstallPromptDone(bool did_accept); + void OnRequirementsChecked(const std::vector<std::string>& requirements); std::string extension_id_; diff --git a/extensions/browser/api/management/management_api_delegate.h b/extensions/browser/api/management/management_api_delegate.h index f7b15a7..9e127ee 100644 --- a/extensions/browser/api/management/management_api_delegate.h +++ b/extensions/browser/api/management/management_api_delegate.h @@ -14,6 +14,7 @@ namespace content { class BrowserContext; +class WebContents; } // namespace content namespace extensions { @@ -78,8 +79,10 @@ class ManagementAPIDelegate { // Used to show a dialog prompt in chrome when management.setEnabled extension // function is called. virtual scoped_ptr<InstallPromptDelegate> SetEnabledFunctionDelegate( - ManagementSetEnabledFunction* function, - const Extension* extension) const = 0; + content::WebContents* web_contents, + content::BrowserContext* browser_context, + const Extension* extension, + const base::Callback<void(bool)>& callback) const = 0; // Returns a new RequirementsChecker. virtual scoped_ptr<RequirementsChecker> CreateRequirementsChecker() const = 0; |