summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorrdevlin.cronin <rdevlin.cronin@chromium.org>2016-01-07 17:40:12 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-08 01:41:19 +0000
commit415930557c280022fed6a6ddd01f80f443704683 (patch)
tree69c08b49d6335013844a45cd70234f2689730433 /extensions
parent2ab2a401d6b48955715bed6fa5b93692ffaa1664 (diff)
downloadchromium_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.cc28
-rw-r--r--extensions/browser/api/management/management_api.h5
-rw-r--r--extensions/browser/api/management/management_api_delegate.h7
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;