diff options
author | rdevlin.cronin@chromium.org <rdevlin.cronin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-17 18:50:01 +0000 |
---|---|---|
committer | rdevlin.cronin@chromium.org <rdevlin.cronin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-17 18:50:01 +0000 |
commit | d382baa5eb8e2c1a7b86101844bb42b68d936ac0 (patch) | |
tree | 4c503b725b80ae8b198cc0dd326b631462d41cd8 | |
parent | 9e3074b4fc36b51906c94592703e6733058ae92d (diff) | |
download | chromium_src-d382baa5eb8e2c1a7b86101844bb42b68d936ac0.zip chromium_src-d382baa5eb8e2c1a7b86101844bb42b68d936ac0.tar.gz chromium_src-d382baa5eb8e2c1a7b86101844bb42b68d936ac0.tar.bz2 |
Make ExtensionInstallPrompt::Prompt ref-counted
We pass around ExtensionInstallPrompt::Prompt a lot by value and reference,
but should probably just have it ref-counted instead. It's an expensive
object to copy (which we do far too much right now), and passing around
weak references is dangerous (and leads to crashing).
TBR=ben@chromium.org (c/b/ui minus c/b/ui/cocoa)
TBR=kinaba@chromium.org (c/b/chromeos/file_manager)
TBR=koz@chromium.org (c/b/apps)
All TBRs are for strictly mechanical changes.
Review URL: https://codereview.chromium.org/313203004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277823 0039d316-1c4b-4281-b951-d872f2087c98
29 files changed, 234 insertions, 215 deletions
diff --git a/chrome/browser/apps/ephemeral_app_launcher.cc b/chrome/browser/apps/ephemeral_app_launcher.cc index d46942e..90c4482 100644 --- a/chrome/browser/apps/ephemeral_app_launcher.cc +++ b/chrome/browser/apps/ephemeral_app_launcher.cc @@ -156,7 +156,7 @@ WebContents* EphemeralAppLauncher::GetWebContents() const { return web_contents() ? web_contents() : dummy_web_contents_.get(); } -scoped_ptr<ExtensionInstallPrompt::Prompt> +scoped_refptr<ExtensionInstallPrompt::Prompt> EphemeralAppLauncher::CreateInstallPrompt() const { DCHECK(extension_.get() != NULL); @@ -165,9 +165,9 @@ EphemeralAppLauncher::CreateInstallPrompt() const { extensions::PermissionMessages permissions = extension_->permissions_data()->GetPermissionMessages(); if (permissions.empty()) - return scoped_ptr<ExtensionInstallPrompt::Prompt>(); + return NULL; - return make_scoped_ptr(new ExtensionInstallPrompt::Prompt( + return make_scoped_refptr(new ExtensionInstallPrompt::Prompt( ExtensionInstallPrompt::LAUNCH_PROMPT)); } diff --git a/chrome/browser/apps/ephemeral_app_launcher.h b/chrome/browser/apps/ephemeral_app_launcher.h index 92a82a5..a5f62bb 100644 --- a/chrome/browser/apps/ephemeral_app_launcher.h +++ b/chrome/browser/apps/ephemeral_app_launcher.h @@ -70,8 +70,8 @@ class EphemeralAppLauncher : public extensions::WebstoreStandaloneInstaller, virtual bool ShouldShowPostInstallUI() const OVERRIDE; virtual bool ShouldShowAppInstalledBubble() const OVERRIDE; virtual content::WebContents* GetWebContents() const OVERRIDE; - virtual scoped_ptr<ExtensionInstallPrompt::Prompt> - CreateInstallPrompt() const OVERRIDE; + virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() + const OVERRIDE; virtual bool CheckInlineInstallPermitted( const base::DictionaryValue& webstore_data, std::string* error) const OVERRIDE; diff --git a/chrome/browser/chromeos/file_manager/app_installer.cc b/chrome/browser/chromeos/file_manager/app_installer.cc index 637bc2f..65265a4 100644 --- a/chrome/browser/chromeos/file_manager/app_installer.cc +++ b/chrome/browser/chromeos/file_manager/app_installer.cc @@ -62,9 +62,9 @@ const GURL& AppInstaller::GetRequestorURL() const { return GURL::EmptyGURL(); } -scoped_ptr<ExtensionInstallPrompt::Prompt> +scoped_refptr<ExtensionInstallPrompt::Prompt> AppInstaller::CreateInstallPrompt() const { - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt( new ExtensionInstallPrompt::Prompt( ExtensionInstallPrompt::INLINE_INSTALL_PROMPT)); @@ -72,7 +72,7 @@ AppInstaller::CreateInstallPrompt() const { show_user_count(), average_rating(), rating_count()); - return prompt.Pass(); + return prompt; } bool AppInstaller::ShouldShowPostInstallUI() const { diff --git a/chrome/browser/chromeos/file_manager/app_installer.h b/chrome/browser/chromeos/file_manager/app_installer.h index efeff78..e2e6b189 100644 --- a/chrome/browser/chromeos/file_manager/app_installer.h +++ b/chrome/browser/chromeos/file_manager/app_installer.h @@ -42,8 +42,8 @@ class AppInstaller virtual bool ShouldShowPostInstallUI() const OVERRIDE; virtual bool ShouldShowAppInstalledBubble() const OVERRIDE; virtual content::WebContents* GetWebContents() const OVERRIDE; - virtual scoped_ptr<ExtensionInstallPrompt::Prompt> - CreateInstallPrompt() const OVERRIDE; + virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() + const OVERRIDE; virtual bool CheckInlineInstallPermitted( const base::DictionaryValue& webstore_data, std::string* error) const OVERRIDE; diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc index f0ba3c7..87ecb02 100644 --- a/chrome/browser/extensions/extension_install_prompt.cc +++ b/chrome/browser/extensions/extension_install_prompt.cc @@ -493,8 +493,8 @@ ExtensionInstallPrompt::ExtensionInstallPrompt(content::WebContents* contents) bundle_(NULL), install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))), show_params_(contents), - delegate_(NULL), - prompt_(UNSET_PROMPT_TYPE) {} + delegate_(NULL) { +} ExtensionInstallPrompt::ExtensionInstallPrompt( Profile* profile, @@ -505,8 +505,8 @@ ExtensionInstallPrompt::ExtensionInstallPrompt( bundle_(NULL), install_ui_(ExtensionInstallUI::Create(profile)), show_params_(native_window, navigator), - delegate_(NULL), - prompt_(UNSET_PROMPT_TYPE) {} + delegate_(NULL) { +} ExtensionInstallPrompt::~ExtensionInstallPrompt() { } @@ -518,7 +518,7 @@ void ExtensionInstallPrompt::ConfirmBundleInstall( bundle_ = bundle; permissions_ = permissions; delegate_ = bundle; - prompt_.set_type(BUNDLE_INSTALL_PROMPT); + prompt_ = new Prompt(BUNDLE_INSTALL_PROMPT); ShowConfirmation(); } @@ -527,7 +527,7 @@ void ExtensionInstallPrompt::ConfirmStandaloneInstall( Delegate* delegate, const Extension* extension, SkBitmap* icon, - const ExtensionInstallPrompt::Prompt& prompt) { + scoped_refptr<Prompt> prompt) { DCHECK(ui_loop_ == base::MessageLoop::current()); extension_ = extension; permissions_ = extension->permissions_data()->active_permissions(); @@ -558,7 +558,7 @@ void ExtensionInstallPrompt::ConfirmInstall( extension_ = extension; permissions_ = extension->permissions_data()->active_permissions(); delegate_ = delegate; - prompt_.set_type(INSTALL_PROMPT); + prompt_ = new Prompt(INSTALL_PROMPT); show_dialog_callback_ = show_dialog_callback; // We special-case themes to not show any confirm UI. Instead they are @@ -591,12 +591,16 @@ void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate, extension->id(), extensions::Extension::DISABLE_REMOTE_INSTALL); bool is_ephemeral = extensions::util::IsEphemeralApp(extension->id(), install_ui_->profile()); + + PromptType type = UNSET_PROMPT_TYPE; if (is_ephemeral) - prompt_.set_type(LAUNCH_PROMPT); + type = LAUNCH_PROMPT; else if (is_remote_install) - prompt_.set_type(REMOTE_INSTALL_PROMPT); + type = REMOTE_INSTALL_PROMPT; else - prompt_.set_type(RE_ENABLE_PROMPT); + type = RE_ENABLE_PROMPT; + prompt_ = new Prompt(type); + LoadImageIfNeeded(); } @@ -604,7 +608,7 @@ void ExtensionInstallPrompt::ConfirmExternalInstall( Delegate* delegate, const Extension* extension, const ShowDialogCallback& show_dialog_callback, - const Prompt& prompt) { + scoped_refptr<Prompt> prompt) { DCHECK(ui_loop_ == base::MessageLoop::current()); extension_ = extension; permissions_ = extension->permissions_data()->active_permissions(); @@ -623,7 +627,7 @@ void ExtensionInstallPrompt::ConfirmPermissions( extension_ = extension; permissions_ = permissions; delegate_ = delegate; - prompt_.set_type(PERMISSIONS_PROMPT); + prompt_ = new Prompt(PERMISSIONS_PROMPT); LoadImageIfNeeded(); } @@ -635,9 +639,9 @@ void ExtensionInstallPrompt::ReviewPermissions( DCHECK(ui_loop_ == base::MessageLoop::current()); extension_ = extension; permissions_ = extension->permissions_data()->active_permissions(); - prompt_.set_retained_files(retained_file_paths); + prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT); + prompt_->set_retained_files(retained_file_paths); delegate_ = delegate; - prompt_.set_type(POST_INSTALL_PERMISSIONS_PROMPT); LoadImageIfNeeded(); } @@ -703,29 +707,30 @@ void ExtensionInstallPrompt::LoadImageIfNeeded() { } void ExtensionInstallPrompt::ShowConfirmation() { - if (prompt_.type() == INSTALL_PROMPT) - prompt_.set_experiment(ExtensionInstallPromptExperiment::Find()); + if (prompt_->type() == INSTALL_PROMPT) + prompt_->set_experiment(ExtensionInstallPromptExperiment::Find()); else - prompt_.set_experiment(ExtensionInstallPromptExperiment::ControlGroup()); + prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup()); if (permissions_.get()) { if (extension_) { const extensions::PermissionsData* permissions_data = extension_->permissions_data(); - prompt_.SetPermissions(permissions_data->GetPermissionMessageStrings()); - prompt_.SetPermissionsDetails( + prompt_->SetPermissions(permissions_data->GetPermissionMessageStrings()); + prompt_->SetPermissionsDetails( permissions_data->GetPermissionMessageDetailsStrings()); } else { const extensions::PermissionMessageProvider* message_provider = extensions::PermissionMessageProvider::Get(); - prompt_.SetPermissions(message_provider->GetWarningMessages( - permissions_, Manifest::TYPE_UNKNOWN)); - prompt_.SetPermissionsDetails(message_provider->GetWarningMessagesDetails( + prompt_->SetPermissions(message_provider->GetWarningMessages( permissions_, Manifest::TYPE_UNKNOWN)); + prompt_->SetPermissionsDetails( + message_provider->GetWarningMessagesDetails(permissions_, + Manifest::TYPE_UNKNOWN)); } } - switch (prompt_.type()) { + switch (prompt_->type()) { case PERMISSIONS_PROMPT: case RE_ENABLE_PROMPT: case INLINE_INSTALL_PROMPT: @@ -734,12 +739,12 @@ void ExtensionInstallPrompt::ShowConfirmation() { case LAUNCH_PROMPT: case POST_INSTALL_PERMISSIONS_PROMPT: case REMOTE_INSTALL_PROMPT: { - prompt_.set_extension(extension_); - prompt_.set_icon(gfx::Image::CreateFrom1xBitmap(icon_)); + prompt_->set_extension(extension_); + prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_)); break; } case BUNDLE_INSTALL_PROMPT: { - prompt_.set_bundle(bundle_); + prompt_->set_bundle(bundle_); break; } default: diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h index 455701b..57ed542 100644 --- a/chrome/browser/extensions/extension_install_prompt.h +++ b/chrome/browser/extensions/extension_install_prompt.h @@ -11,6 +11,7 @@ #include "base/callback.h" #include "base/compiler_specific.h" #include "base/files/file_path.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" @@ -77,10 +78,11 @@ class ExtensionInstallPrompt // prompt. Gets populated with raw data and exposes getters for formatted // strings so that the GTK/views/Cocoa install dialogs don't have to repeat // that logic. - class Prompt { + // Ref-counted because we pass around the prompt independent of the full + // ExtensionInstallPrompt. + class Prompt : public base::RefCountedThreadSafe<Prompt> { public: explicit Prompt(PromptType type); - ~Prompt(); // Sets the permission list for this prompt. void SetPermissions(const std::vector<base::string16>& permissions); @@ -161,6 +163,10 @@ class ExtensionInstallPrompt } private: + friend class base::RefCountedThreadSafe<Prompt>; + + virtual ~Prompt(); + bool ShouldDisplayRevokeFilesButton() const; PromptType type_; @@ -198,6 +204,8 @@ class ExtensionInstallPrompt std::vector<base::FilePath> retained_files_; scoped_refptr<ExtensionInstallPromptExperiment> experiment_; + + DISALLOW_COPY_AND_ASSIGN(Prompt); }; static const int kMinExtensionRating = 0; @@ -234,7 +242,7 @@ class ExtensionInstallPrompt typedef base::Callback<void(const ExtensionInstallPrompt::ShowParams&, ExtensionInstallPrompt::Delegate*, - const ExtensionInstallPrompt::Prompt&)> + scoped_refptr<ExtensionInstallPrompt::Prompt>)> ShowDialogCallback; // Callback to show the default extension install dialog. @@ -282,7 +290,7 @@ class ExtensionInstallPrompt virtual void ConfirmStandaloneInstall(Delegate* delegate, const extensions::Extension* extension, SkBitmap* icon, - const Prompt& prompt); + scoped_refptr<Prompt> prompt); // This is called by the installer to verify whether the installation from // the webstore should proceed. |show_dialog_callback| is optional and can be @@ -319,7 +327,7 @@ class ExtensionInstallPrompt Delegate* delegate, const extensions::Extension* extension, const ShowDialogCallback& show_dialog_callback, - const Prompt& prompt); + scoped_refptr<Prompt> prompt); // This is called by the extension permissions API to verify whether an // extension may be granted additional permissions. @@ -395,7 +403,7 @@ class ExtensionInstallPrompt Delegate* delegate_; // A pre-filled prompt. - Prompt prompt_; + scoped_refptr<Prompt> prompt_; // Used to show the confirm dialog. ShowDialogCallback show_dialog_callback_; diff --git a/chrome/browser/extensions/external_install_ui.cc b/chrome/browser/extensions/external_install_ui.cc index 901b26c..94cd0e5 100644 --- a/chrome/browser/extensions/external_install_ui.cc +++ b/chrome/browser/extensions/external_install_ui.cc @@ -101,7 +101,7 @@ class ExternalInstallDialogDelegate // The UI for showing the install dialog when enabling. scoped_ptr<ExtensionInstallPrompt> install_ui_; - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt_; + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_; Browser* browser_; base::WeakPtr<ExtensionService> service_weak_; @@ -167,10 +167,11 @@ class ExternalInstallMenuAlert : public GlobalErrorWithStandardBubble, // Shows a menu item and a global error bubble, replacing the install dialog. class ExternalInstallGlobalError : public ExternalInstallMenuAlert { public: - ExternalInstallGlobalError(ExtensionService* service, - const Extension* extension, - ExternalInstallDialogDelegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt); + ExternalInstallGlobalError( + ExtensionService* service, + const Extension* extension, + ExternalInstallDialogDelegate* delegate, + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt); virtual ~ExternalInstallGlobalError(); virtual void ExecuteMenuItem(Browser* browser) OVERRIDE; @@ -189,7 +190,7 @@ class ExternalInstallGlobalError : public ExternalInstallMenuAlert { // having been clicked (perhaps because the user enabled the extension // manually). ExternalInstallDialogDelegate* delegate_; - const ExtensionInstallPrompt::Prompt* prompt_; + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_; private: DISALLOW_COPY_AND_ASSIGN(ExternalInstallGlobalError); @@ -200,7 +201,7 @@ static void CreateExternalInstallGlobalError( const std::string& extension_id, const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* prompt_delegate, - const ExtensionInstallPrompt::Prompt& prompt) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) { if (!service.get()) return; const Extension* extension = service->GetInstalledExtension(extension_id); @@ -242,8 +243,8 @@ ExternalInstallDialogDelegate::ExternalInstallDialogDelegate( use_global_error_(use_global_error) { AddRef(); // Balanced in Proceed or Abort. - prompt_.reset(new ExtensionInstallPrompt::Prompt( - ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT)); + prompt_ = new ExtensionInstallPrompt::Prompt( + ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT); // If we don't have a browser, we can't go to the webstore to fetch data. // This should only happen in tests. @@ -324,7 +325,7 @@ void ExternalInstallDialogDelegate::ShowInstallUI() { extension_id_) : ExtensionInstallPrompt::GetDefaultShowDialogCallback(); - install_ui_->ConfirmExternalInstall(this, extension, callback, *prompt_); + install_ui_->ConfirmExternalInstall(this, extension, callback, prompt_); } ExternalInstallDialogDelegate::~ExternalInstallDialogDelegate() { @@ -461,10 +462,10 @@ ExternalInstallGlobalError::ExternalInstallGlobalError( ExtensionService* service, const Extension* extension, ExternalInstallDialogDelegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) : ExternalInstallMenuAlert(service, extension), delegate_(delegate), - prompt_(&prompt) { + prompt_(prompt) { } ExternalInstallGlobalError::~ExternalInstallGlobalError() { diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc index f857f94..fcdce7c 100644 --- a/chrome/browser/extensions/webstore_inline_installer.cc +++ b/chrome/browser/extensions/webstore_inline_installer.cc @@ -47,9 +47,9 @@ const GURL& WebstoreInlineInstaller::GetRequestorURL() const { return requestor_url_; } -scoped_ptr<ExtensionInstallPrompt::Prompt> +scoped_refptr<ExtensionInstallPrompt::Prompt> WebstoreInlineInstaller::CreateInstallPrompt() const { - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt( new ExtensionInstallPrompt::Prompt( ExtensionInstallPrompt::INLINE_INSTALL_PROMPT)); @@ -60,7 +60,7 @@ WebstoreInlineInstaller::CreateInstallPrompt() const { show_user_count(), average_rating(), rating_count()); - return prompt.Pass(); + return prompt; } bool WebstoreInlineInstaller::ShouldShowPostInstallUI() const { diff --git a/chrome/browser/extensions/webstore_inline_installer.h b/chrome/browser/extensions/webstore_inline_installer.h index 33b278d..7e7e792 100644 --- a/chrome/browser/extensions/webstore_inline_installer.h +++ b/chrome/browser/extensions/webstore_inline_installer.h @@ -47,8 +47,8 @@ class WebstoreInlineInstaller virtual bool ShouldShowPostInstallUI() const OVERRIDE; virtual bool ShouldShowAppInstalledBubble() const OVERRIDE; virtual content::WebContents* GetWebContents() const OVERRIDE; - virtual scoped_ptr<ExtensionInstallPrompt::Prompt> - CreateInstallPrompt() const OVERRIDE; + virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() + const OVERRIDE; virtual bool CheckInlineInstallPermitted( const base::DictionaryValue& webstore_data, std::string* error) const OVERRIDE; diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc index 921cb61..7146bdb 100644 --- a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc +++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc @@ -57,7 +57,7 @@ class ProgrammableInstallPrompt : public ExtensionInstallPrompt { Delegate* delegate, const Extension* extension, SkBitmap* icon, - const ExtensionInstallPrompt::Prompt& prompt) OVERRIDE { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) OVERRIDE { delegate_ = delegate; } diff --git a/chrome/browser/extensions/webstore_install_with_prompt.cc b/chrome/browser/extensions/webstore_install_with_prompt.cc index 4a43388..19ab614 100644 --- a/chrome/browser/extensions/webstore_install_with_prompt.cc +++ b/chrome/browser/extensions/webstore_install_with_prompt.cc @@ -50,12 +50,10 @@ const GURL& WebstoreInstallWithPrompt::GetRequestorURL() const { return dummy_requestor_url_; } -scoped_ptr<ExtensionInstallPrompt::Prompt> +scoped_refptr<ExtensionInstallPrompt::Prompt> WebstoreInstallWithPrompt::CreateInstallPrompt() const { - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt( - new ExtensionInstallPrompt::Prompt( - ExtensionInstallPrompt::INSTALL_PROMPT)); - return prompt.Pass(); + return new ExtensionInstallPrompt::Prompt( + ExtensionInstallPrompt::INSTALL_PROMPT); } scoped_ptr<ExtensionInstallPrompt> diff --git a/chrome/browser/extensions/webstore_install_with_prompt.h b/chrome/browser/extensions/webstore_install_with_prompt.h index b170a12..5afc314 100644 --- a/chrome/browser/extensions/webstore_install_with_prompt.h +++ b/chrome/browser/extensions/webstore_install_with_prompt.h @@ -54,7 +54,7 @@ class WebstoreInstallWithPrompt : public WebstoreStandaloneInstaller, virtual bool ShouldShowPostInstallUI() const OVERRIDE; virtual bool ShouldShowAppInstalledBubble() const OVERRIDE; virtual content::WebContents* GetWebContents() const OVERRIDE; - virtual scoped_ptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() + virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() const OVERRIDE; virtual scoped_ptr<ExtensionInstallPrompt> CreateInstallUI() OVERRIDE; virtual bool CheckInlineInstallPermitted( diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc index ae40c9c..7933097 100644 --- a/chrome/browser/extensions/webstore_standalone_installer.cc +++ b/chrome/browser/extensions/webstore_standalone_installer.cc @@ -325,7 +325,7 @@ void WebstoreStandaloneInstaller::ShowInstallUI() { install_ui_ = CreateInstallUI(); install_ui_->ConfirmStandaloneInstall( - this, localized_extension_for_display_.get(), &icon_, *install_prompt_); + this, localized_extension_for_display_.get(), &icon_, install_prompt_); } void WebstoreStandaloneInstaller::OnWebStoreDataFetcherDone() { diff --git a/chrome/browser/extensions/webstore_standalone_installer.h b/chrome/browser/extensions/webstore_standalone_installer.h index 1013fa7..ecbfa98 100644 --- a/chrome/browser/extensions/webstore_standalone_installer.h +++ b/chrome/browser/extensions/webstore_standalone_installer.h @@ -91,8 +91,8 @@ class WebstoreStandaloneInstaller // Should return an installation prompt with desired properties or NULL if // no prompt should be shown. - virtual scoped_ptr<ExtensionInstallPrompt::Prompt> - CreateInstallPrompt() const = 0; + virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() + const = 0; // Perform all necessary checks to make sure inline install is permitted, // e.g. in the extension's properties in the store. The implementation may @@ -196,7 +196,7 @@ class WebstoreStandaloneInstaller // Installation dialog and its underlying prompt. scoped_ptr<ExtensionInstallPrompt> install_ui_; - scoped_ptr<ExtensionInstallPrompt::Prompt> install_prompt_; + scoped_refptr<ExtensionInstallPrompt::Prompt> install_prompt_; // For fetching webstore JSON data. scoped_ptr<WebstoreDataFetcher> webstore_data_fetcher_; diff --git a/chrome/browser/extensions/webstore_startup_installer.cc b/chrome/browser/extensions/webstore_startup_installer.cc index 283dabc..28ba551 100644 --- a/chrome/browser/extensions/webstore_startup_installer.cc +++ b/chrome/browser/extensions/webstore_startup_installer.cc @@ -18,14 +18,13 @@ WebstoreStartupInstaller::WebstoreStartupInstaller( WebstoreStartupInstaller::~WebstoreStartupInstaller() {} -scoped_ptr<ExtensionInstallPrompt::Prompt> +scoped_refptr<ExtensionInstallPrompt::Prompt> WebstoreStartupInstaller::CreateInstallPrompt() const { - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt; if (show_prompt_) { - prompt.reset(new ExtensionInstallPrompt::Prompt( - ExtensionInstallPrompt::INSTALL_PROMPT)); + return new ExtensionInstallPrompt::Prompt( + ExtensionInstallPrompt::INSTALL_PROMPT); } - return prompt.Pass(); + return NULL; } } // namespace extensions diff --git a/chrome/browser/extensions/webstore_startup_installer.h b/chrome/browser/extensions/webstore_startup_installer.h index de6cb6e..b90eba6 100644 --- a/chrome/browser/extensions/webstore_startup_installer.h +++ b/chrome/browser/extensions/webstore_startup_installer.h @@ -30,8 +30,8 @@ class WebstoreStartupInstaller : public WebstoreInstallWithPrompt { virtual ~WebstoreStartupInstaller(); // Implementations of WebstoreStandaloneInstaller Template Method's hooks. - virtual scoped_ptr<ExtensionInstallPrompt::Prompt> - CreateInstallPrompt() const OVERRIDE; + virtual scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() + const OVERRIDE; private: bool show_prompt_; diff --git a/chrome/browser/ui/android/extensions/extension_install_dialog_android.cc b/chrome/browser/ui/android/extensions/extension_install_dialog_android.cc index ab58ee0..e790932 100644 --- a/chrome/browser/ui/android/extensions/extension_install_dialog_android.cc +++ b/chrome/browser/ui/android/extensions/extension_install_dialog_android.cc @@ -10,7 +10,7 @@ namespace { void ShowExtensionInstallDialogImpl( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) { NOTIMPLEMENTED(); } diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h index 18478ab..37e007e 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h +++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h @@ -26,7 +26,7 @@ class ExtensionInstallDialogController : ExtensionInstallDialogController( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt); + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt); virtual ~ExtensionInstallDialogController(); // ExtensionInstallPrompt::Delegate implementation. diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm index c8edfc8..992c8b9 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm @@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/logging.h" +#include "base/memory/ref_counted.h" #include "base/message_loop/message_loop.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -21,7 +22,7 @@ namespace { void ShowExtensionInstallDialogImpl( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) { // These objects will delete themselves when the dialog closes. if (!show_params.parent_web_contents) { new WindowedInstallDialogController(show_params, delegate, prompt); @@ -36,7 +37,8 @@ void ShowExtensionInstallDialogImpl( ExtensionInstallDialogController::ExtensionInstallDialogController( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) : delegate_(delegate) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) + : delegate_(delegate) { view_controller_.reset([[ExtensionInstallViewController alloc] initWithNavigator:show_params.navigator delegate:this diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm index 4053c75..d458b0e 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm @@ -31,7 +31,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogControllerTest, BasicTest) { ExtensionInstallPrompt::ShowParams show_params(tab); chrome::MockExtensionInstallPromptDelegate delegate; - ExtensionInstallPrompt::Prompt prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); ExtensionInstallDialogController* controller = @@ -56,7 +56,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogControllerTest, ExtensionInstallPrompt::ShowParams show_params(tab); chrome::MockExtensionInstallPromptDelegate delegate; - ExtensionInstallPrompt::Prompt prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get()); ExtensionInstallDialogController* controller = diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h index a6d6053..a0738b4 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h +++ b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h @@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALL_PROMPT_TEST_UTILS_H_ #define CHROME_BROWSER_UI_COCOA_EXTENSIONS_EXTENSION_INSTALL_PROMPT_TEST_UTILS_H_ +#include "base/memory/ref_counted.h" #include "chrome/browser/extensions/extension_install_prompt.h" namespace chrome { @@ -42,11 +43,12 @@ scoped_refptr<extensions::Extension> LoadInstallPromptExtension(); gfx::Image LoadInstallPromptIcon(); // Builds a prompt using the given extension. -ExtensionInstallPrompt::Prompt BuildExtensionInstallPrompt( +scoped_refptr<ExtensionInstallPrompt::Prompt> BuildExtensionInstallPrompt( extensions::Extension* extension); -ExtensionInstallPrompt::Prompt BuildExtensionPostInstallPermissionsPrompt( - extensions::Extension* extension); +scoped_refptr<ExtensionInstallPrompt::Prompt> + BuildExtensionPostInstallPermissionsPrompt( + extensions::Extension* extension); } // namespace chrome diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm index a6cd778..2433752 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm @@ -71,20 +71,23 @@ gfx::Image LoadInstallPromptIcon() { file_contents.length()); } -ExtensionInstallPrompt::Prompt BuildExtensionInstallPrompt( +scoped_refptr<ExtensionInstallPrompt::Prompt> BuildExtensionInstallPrompt( Extension* extension) { - ExtensionInstallPrompt::Prompt prompt(ExtensionInstallPrompt::INSTALL_PROMPT); - prompt.set_extension(extension); - prompt.set_icon(LoadInstallPromptIcon()); + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = + new ExtensionInstallPrompt::Prompt( + ExtensionInstallPrompt::INSTALL_PROMPT); + prompt->set_extension(extension); + prompt->set_icon(LoadInstallPromptIcon()); return prompt; } -ExtensionInstallPrompt::Prompt BuildExtensionPostInstallPermissionsPrompt( - Extension* extension) { - ExtensionInstallPrompt::Prompt prompt( - ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT); - prompt.set_extension(extension); - prompt.set_icon(LoadInstallPromptIcon()); +scoped_refptr<ExtensionInstallPrompt::Prompt> +BuildExtensionPostInstallPermissionsPrompt(Extension* extension) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = + new ExtensionInstallPrompt::Prompt( + ExtensionInstallPrompt::POST_INSTALL_PERMISSIONS_PROMPT); + prompt->set_extension(extension); + prompt->set_icon(LoadInstallPromptIcon()); return prompt; } diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h index bebb613..2b403a1 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h +++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.h @@ -10,7 +10,7 @@ #import <Cocoa/Cocoa.h> #include "base/mac/scoped_nsobject.h" -#include "base/memory/scoped_ptr.h" +#include "base/memory/ref_counted.h" #include "base/strings/string16.h" #include "chrome/browser/extensions/extension_install_prompt.h" #include "ui/gfx/image/image_skia.h" @@ -43,7 +43,7 @@ class PageNavigator; content::PageNavigator* navigator_; // weak ExtensionInstallPrompt::Delegate* delegate_; // weak - scoped_ptr<ExtensionInstallPrompt::Prompt> prompt_; + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_; base::scoped_nsobject<NSArray> warnings_; BOOL isComputingRowHeight_; @@ -64,7 +64,7 @@ class PageNavigator; - (id)initWithNavigator:(content::PageNavigator*)navigator delegate:(ExtensionInstallPrompt::Delegate*)delegate - prompt:(const ExtensionInstallPrompt::Prompt&)prompt; + prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt; - (IBAction)storeLinkClicked:(id)sender; // Callback for "View details" link. - (IBAction)cancel:(id)sender; - (IBAction)ok:(id)sender; diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm index eeb45a3..62c482e 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm @@ -180,17 +180,17 @@ bool HasAttribute(id item, CellAttributesMask attributeMask) { - (id)initWithNavigator:(content::PageNavigator*)navigator delegate:(ExtensionInstallPrompt::Delegate*)delegate - prompt:(const ExtensionInstallPrompt::Prompt&)prompt { + prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt { // We use a different XIB in the case of bundle installs, installs with // webstore data, or no permission warnings. These are laid out nicely for // the data they display. NSString* nibName = nil; - if (prompt.type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT) { + if (prompt->type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT) { nibName = @"ExtensionInstallPromptBundle"; - } else if (prompt.has_webstore_data()) { + } else if (prompt->has_webstore_data()) { nibName = @"ExtensionInstallPromptWebstoreData"; - } else if (!prompt.ShouldShowPermissions() && - prompt.GetRetainedFileCount() == 0) { + } else if (!prompt->ShouldShowPermissions() && + prompt->GetRetainedFileCount() == 0) { nibName = @"ExtensionInstallPromptNoWarnings"; } else { nibName = @"ExtensionInstallPrompt"; @@ -200,8 +200,8 @@ bool HasAttribute(id item, CellAttributesMask attributeMask) { bundle:base::mac::FrameworkBundle()])) { navigator_ = navigator; delegate_ = delegate; - prompt_.reset(new ExtensionInstallPrompt::Prompt(prompt)); - warnings_.reset([[self buildWarnings:prompt] retain]); + prompt_ = prompt; + warnings_.reset([[self buildWarnings:*prompt] retain]); } return self; } diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm index e23ac4f..d429550 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller_unittest.mm @@ -34,16 +34,16 @@ class ExtensionInstallViewControllerTest : public CocoaProfileTest { TEST_F(ExtensionInstallViewControllerTest, BasicsNormalCancel) { chrome::MockExtensionInstallPromptDelegate delegate; - ExtensionInstallPrompt::Prompt prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); std::vector<base::string16> permissions; permissions.push_back(base::UTF8ToUTF16("warning 1")); - prompt.SetPermissions(permissions); + prompt->SetPermissions(permissions); // No details provided with this permission. std::vector<base::string16> details; details.push_back(base::string16()); - prompt.SetPermissionsDetails(details); + prompt->SetPermissionsDetails(details); base::scoped_nsobject<ExtensionInstallViewController> controller( [[ExtensionInstallViewController alloc] initWithNavigator:browser() @@ -68,7 +68,7 @@ TEST_F(ExtensionInstallViewControllerTest, BasicsNormalCancel) { NSOutlineView* outlineView = [controller outlineView]; EXPECT_TRUE(outlineView); EXPECT_EQ(2, [outlineView numberOfRows]); - EXPECT_NSEQ(base::SysUTF16ToNSString(prompt.GetPermission(0)), + EXPECT_NSEQ(base::SysUTF16ToNSString(prompt->GetPermission(0)), [[outlineView dataSource] outlineView:outlineView objectValueForTableColumn:nil byItem:[outlineView itemAtRow:1]]); @@ -90,15 +90,15 @@ TEST_F(ExtensionInstallViewControllerTest, BasicsNormalCancel) { TEST_F(ExtensionInstallViewControllerTest, BasicsNormalOK) { chrome::MockExtensionInstallPromptDelegate delegate; - ExtensionInstallPrompt::Prompt prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); std::vector<base::string16> permissions; permissions.push_back(base::UTF8ToUTF16("warning 1")); - prompt.SetPermissions(permissions); + prompt->SetPermissions(permissions); // No details provided with this permission. std::vector<base::string16> details; details.push_back(base::string16()); - prompt.SetPermissionsDetails(details); + prompt->SetPermissionsDetails(details); base::scoped_nsobject<ExtensionInstallViewController> controller( [[ExtensionInstallViewController alloc] initWithNavigator:browser() @@ -118,23 +118,23 @@ TEST_F(ExtensionInstallViewControllerTest, MultipleWarnings) { chrome::MockExtensionInstallPromptDelegate delegate1; chrome::MockExtensionInstallPromptDelegate delegate2; - ExtensionInstallPrompt::Prompt one_warning_prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> one_warning_prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); std::vector<base::string16> permissions; permissions.push_back(base::UTF8ToUTF16("warning 1")); - one_warning_prompt.SetPermissions(permissions); + one_warning_prompt->SetPermissions(permissions); // No details provided with this permission. std::vector<base::string16> details; details.push_back(base::string16()); - one_warning_prompt.SetPermissionsDetails(details); + one_warning_prompt->SetPermissionsDetails(details); - ExtensionInstallPrompt::Prompt two_warnings_prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> two_warnings_prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); permissions.push_back(base::UTF8ToUTF16("warning 2")); - two_warnings_prompt.SetPermissions(permissions); + two_warnings_prompt->SetPermissions(permissions); // No details provided with this permission. details.push_back(base::string16()); - two_warnings_prompt.SetPermissionsDetails(details); + two_warnings_prompt->SetPermissionsDetails(details); base::scoped_nsobject<ExtensionInstallViewController> controller1( [[ExtensionInstallViewController alloc] @@ -168,7 +168,7 @@ TEST_F(ExtensionInstallViewControllerTest, BasicsSkinny) { chrome::MockExtensionInstallPromptDelegate delegate; // No warnings should trigger skinny prompt. - ExtensionInstallPrompt::Prompt no_warnings_prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> no_warnings_prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); base::scoped_nsobject<ExtensionInstallViewController> controller( @@ -209,11 +209,12 @@ TEST_F(ExtensionInstallViewControllerTest, BasicsInline) { chrome::MockExtensionInstallPromptDelegate delegate; // No warnings should trigger skinny prompt. - ExtensionInstallPrompt::Prompt inline_prompt( - ExtensionInstallPrompt::INLINE_INSTALL_PROMPT); - inline_prompt.SetWebstoreData("1,000", true, 3.5, 200); - inline_prompt.set_extension(extension_.get()); - inline_prompt.set_icon(chrome::LoadInstallPromptIcon()); + scoped_refptr<ExtensionInstallPrompt::Prompt> inline_prompt = + new ExtensionInstallPrompt::Prompt( + ExtensionInstallPrompt::INLINE_INSTALL_PROMPT); + inline_prompt->SetWebstoreData("1,000", true, 3.5, 200); + inline_prompt->set_extension(extension_.get()); + inline_prompt->set_icon(chrome::LoadInstallPromptIcon()); base::scoped_nsobject<ExtensionInstallViewController> controller( [[ExtensionInstallViewController alloc] initWithNavigator:browser() @@ -265,15 +266,15 @@ TEST_F(ExtensionInstallViewControllerTest, BasicsInline) { TEST_F(ExtensionInstallViewControllerTest, PostInstallPermissionsPrompt) { chrome::MockExtensionInstallPromptDelegate delegate; - ExtensionInstallPrompt::Prompt prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = chrome::BuildExtensionPostInstallPermissionsPrompt(extension_.get()); std::vector<base::string16> permissions; permissions.push_back(base::UTF8ToUTF16("warning 1")); - prompt.SetPermissions(permissions); + prompt->SetPermissions(permissions); // No details provided with this permission. std::vector<base::string16> details; details.push_back(base::string16()); - prompt.SetPermissionsDetails(details); + prompt->SetPermissionsDetails(details); base::scoped_nsobject<ExtensionInstallViewController> controller( [[ExtensionInstallViewController alloc] initWithNavigator:browser() @@ -293,16 +294,16 @@ TEST_F(ExtensionInstallViewControllerTest, PostInstallPermissionsPrompt) { TEST_F(ExtensionInstallViewControllerTest, PermissionsDetails) { chrome::MockExtensionInstallPromptDelegate delegate; - ExtensionInstallPrompt::Prompt prompt = + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt = chrome::BuildExtensionInstallPrompt(extension_.get()); std::vector<base::string16> permissions; permissions.push_back(base::UTF8ToUTF16("warning 1")); std::vector<base::string16> permissions_details; permissions_details.push_back(base::UTF8ToUTF16("Detail 1")); - prompt.SetPermissions(permissions); - prompt.SetPermissionsDetails(permissions_details); - prompt.SetIsShowingDetails( + prompt->SetPermissions(permissions); + prompt->SetPermissionsDetails(permissions_details); + prompt->SetIsShowingDetails( ExtensionInstallPrompt::PERMISSIONS_DETAILS, 0, true); base::scoped_nsobject<ExtensionInstallViewController> controller( @@ -315,7 +316,7 @@ TEST_F(ExtensionInstallViewControllerTest, PermissionsDetails) { NSOutlineView* outlineView = [controller outlineView]; EXPECT_TRUE(outlineView); EXPECT_EQ(4, [outlineView numberOfRows]); - EXPECT_NSEQ(base::SysUTF16ToNSString(prompt.GetPermissionsDetails(0)), + EXPECT_NSEQ(base::SysUTF16ToNSString(prompt->GetPermissionsDetails(0)), [[outlineView dataSource] outlineView:outlineView objectValueForTableColumn:nil byItem:[outlineView itemAtRow:2]]); diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h index 1a47a78..55dd58c 100644 --- a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h +++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.h @@ -24,7 +24,7 @@ class WindowedInstallDialogController WindowedInstallDialogController( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt); + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt); virtual ~WindowedInstallDialogController(); // Invoked by the -[NSWindow windowWillClose:] notification after a dialog diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm index d1128ab..c457869 100644 --- a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm @@ -21,14 +21,14 @@ - (id)initWithNavigator:(content::PageNavigator*)navigator delegate:(WindowedInstallDialogController*)delegate - prompt:(const ExtensionInstallPrompt::Prompt&)prompt; + prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt; @end WindowedInstallDialogController::WindowedInstallDialogController( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) : delegate_(delegate) { install_controller_.reset([[WindowedInstallController alloc] initWithNavigator:show_params.navigator @@ -72,7 +72,7 @@ void WindowedInstallDialogController::InstallUIAbort(bool user_initiated) { - (id)initWithNavigator:(content::PageNavigator*)navigator delegate:(WindowedInstallDialogController*)delegate - prompt:(const ExtensionInstallPrompt::Prompt&)prompt { + prompt:(scoped_refptr<ExtensionInstallPrompt::Prompt>)prompt { base::scoped_nsobject<NSWindow> controlledPanel( [[NSPanel alloc] initWithContentRect:ui::kWindowSizeDeterminedLater styleMask:NSTitledWindowMask @@ -94,7 +94,7 @@ void WindowedInstallDialogController::InstallUIAbort(bool user_initiated) { if ([window respondsToSelector:@selector(setAnimationBehavior:)]) [window setAnimationBehavior:NSWindowAnimationBehaviorAlertPanel]; - [window setTitle:base::SysUTF16ToNSString(prompt.GetDialogTitle())]; + [window setTitle:base::SysUTF16ToNSString(prompt->GetDialogTitle())]; NSRect viewFrame = [[installViewController_ view] frame]; [window setFrame:[window frameRectForContentRect:viewFrame] display:NO]; diff --git a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm index a8420d3..2993e8a 100644 --- a/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm +++ b/chrome/browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm @@ -21,7 +21,7 @@ void TestingShowAppListInstallDialogController( WindowedInstallDialogController** controller, const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) { *controller = new WindowedInstallDialogController(show_params, delegate, prompt); } diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc index f0c9fc3..a33e9e2 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc @@ -134,9 +134,10 @@ class ExtensionInstallDialogView : public views::DialogDelegateView, public views::LinkListener, public views::ButtonListener { public: - ExtensionInstallDialogView(content::PageNavigator* navigator, - ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt); + ExtensionInstallDialogView( + content::PageNavigator* navigator, + ExtensionInstallPrompt::Delegate* delegate, + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt); virtual ~ExtensionInstallDialogView(); // Called when one of the child elements has expanded/collapsed. @@ -175,15 +176,15 @@ class ExtensionInstallDialogView : public views::DialogDelegateView, bool single_detail_row) const; bool is_inline_install() const { - return prompt_.type() == ExtensionInstallPrompt::INLINE_INSTALL_PROMPT; + return prompt_->type() == ExtensionInstallPrompt::INLINE_INSTALL_PROMPT; } bool is_bundle_install() const { - return prompt_.type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT; + return prompt_->type() == ExtensionInstallPrompt::BUNDLE_INSTALL_PROMPT; } bool is_external_install() const { - return prompt_.type() == ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT; + return prompt_->type() == ExtensionInstallPrompt::EXTERNAL_INSTALL_PROMPT; } // Updates the histogram that holds installation accepted/aborted data. @@ -195,7 +196,7 @@ class ExtensionInstallDialogView : public views::DialogDelegateView, content::PageNavigator* navigator_; ExtensionInstallPrompt::Delegate* delegate_; - const ExtensionInstallPrompt::Prompt& prompt_; + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt_; // The scroll view containing all the details for the dialog (including all // collapsible/expandable sections). @@ -385,7 +386,7 @@ class ExpandableContainerView : public views::View, void ShowExtensionInstallDialogImpl( const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) { + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); CreateBrowserModalDialogViews( new ExtensionInstallDialogView(show_params.navigator, delegate, prompt), @@ -405,7 +406,7 @@ void CustomScrollableView::Layout() { ExtensionInstallDialogView::ExtensionInstallDialogView( content::PageNavigator* navigator, ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) + scoped_refptr<ExtensionInstallPrompt::Prompt> prompt) : navigator_(navigator), delegate_(delegate), prompt_(prompt), @@ -496,9 +497,9 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( // the dialog depending on the experiment group. int left_column_width = - (prompt.ShouldShowPermissions() + - prompt.GetRetainedFileCount()) > 0 ? - kPermissionsLeftColumnWidth : kNoPermissionsLeftColumnWidth; + (prompt->ShouldShowPermissions() + prompt->GetRetainedFileCount()) > 0 + ? kPermissionsLeftColumnWidth + : kNoPermissionsLeftColumnWidth; if (is_bundle_install()) left_column_width = kBundleLeftColumnWidth; if (is_external_install()) @@ -516,8 +517,8 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( scrollable_, left_column_width, column_set_id, false); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - if (prompt.ShouldShowPermissions() && - prompt.experiment()->should_show_expandable_permission_list()) { + if (prompt->ShouldShowPermissions() && + prompt->experiment()->should_show_expandable_permission_list()) { // If the experiment should hide the permission list initially, create a // simple layout that contains only the header, extension name and icon. scrollable_header_only_ = new CustomScrollableView(); @@ -534,28 +535,28 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( // Widen the dialog for experiment with checkboxes so that the information // label fits the area to the left of the buttons. - if (prompt.experiment()->show_checkboxes()) + if (prompt->experiment()->show_checkboxes()) dialog_width += 4 * views::kPanelHorizMargin; - if (prompt.has_webstore_data()) { + if (prompt->has_webstore_data()) { layout->StartRow(0, column_set_id); views::View* rating = new views::View(); rating->SetLayoutManager(new views::BoxLayout( views::BoxLayout::kHorizontal, 0, 0, 0)); layout->AddView(rating); - prompt.AppendRatingStars(AddResourceIcon, rating); + prompt->AppendRatingStars(AddResourceIcon, rating); const gfx::FontList& small_font_list = rb.GetFontList(ui::ResourceBundle::SmallFont); views::Label* rating_count = - new views::Label(prompt.GetRatingCount(), small_font_list); + new views::Label(prompt->GetRatingCount(), small_font_list); // Add some space between the stars and the rating count. rating_count->SetBorder(views::Border::CreateEmptyBorder(0, 2, 0, 0)); rating->AddChildView(rating_count); layout->StartRow(0, column_set_id); views::Label* user_count = - new views::Label(prompt.GetUserCount(), small_font_list); + new views::Label(prompt->GetUserCount(), small_font_list); user_count->SetAutoColorReadabilityEnabled(false); user_count->SetEnabledColor(SK_ColorGRAY); layout->AddView(user_count); @@ -569,7 +570,7 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( } if (is_bundle_install()) { - BundleInstaller::ItemList items = prompt.bundle()->GetItemsWithState( + BundleInstaller::ItemList items = prompt->bundle()->GetItemsWithState( BundleInstaller::Item::STATE_PENDING); for (size_t i = 0; i < items.size(); ++i) { base::string16 extension_name = @@ -586,10 +587,10 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( } } - if (prompt.ShouldShowPermissions()) { + if (prompt->ShouldShowPermissions()) { layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); - if (prompt.GetPermissionCount() > 0) { + if (prompt->GetPermissionCount() > 0) { if (is_inline_install()) { layout->StartRow(0, column_set_id); layout->AddView(new views::Separator(views::Separator::HORIZONTAL), @@ -603,31 +604,31 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( // We need to pass the FontList in the constructor, rather than calling // SetFontList later, because otherwise SizeToFit mis-judges the width // of the line. - permissions_header = new views::Label( - prompt.GetPermissionsHeading(), - rb.GetFontList(ui::ResourceBundle::MediumFont)); + permissions_header = + new views::Label(prompt->GetPermissionsHeading(), + rb.GetFontList(ui::ResourceBundle::MediumFont)); } else { - permissions_header = new views::Label(prompt.GetPermissionsHeading()); + permissions_header = new views::Label(prompt->GetPermissionsHeading()); } permissions_header->SetMultiLine(true); permissions_header->SetHorizontalAlignment(gfx::ALIGN_LEFT); permissions_header->SizeToFit(left_column_width); layout->AddView(permissions_header); - for (size_t i = 0; i < prompt.GetPermissionCount(); ++i) { + for (size_t i = 0; i < prompt->GetPermissionCount(); ++i) { layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); layout->StartRow(0, column_set_id); views::Label* permission_label = - new views::Label(prompt.GetPermission(i)); + new views::Label(prompt->GetPermission(i)); const SkColor kTextHighlight = SK_ColorRED; const SkColor kBackgroundHighlight = SkColorSetRGB(0xFB, 0xF7, 0xA3); - if (prompt.experiment()->ShouldHighlightText( - prompt.GetPermission(i))) { + if (prompt->experiment()->ShouldHighlightText( + prompt->GetPermission(i))) { permission_label->SetAutoColorReadabilityEnabled(false); permission_label->SetEnabledColor(kTextHighlight); - } else if (prompt.experiment()->ShouldHighlightBackground( - prompt.GetPermission(i))) { + } else if (prompt->experiment()->ShouldHighlightBackground( + prompt->GetPermission(i))) { permission_label->SetLineHeight(18); permission_label->set_background( views::Background::CreateSolidBackground(kBackgroundHighlight)); @@ -637,18 +638,18 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( permission_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); permission_label->SizeToFit(left_column_width); - if (prompt.experiment()->show_checkboxes()) { + if (prompt->experiment()->show_checkboxes()) { layout->AddView(new CheckboxedView(permission_label, this)); ++unchecked_boxes_; } else { layout->AddView(new BulletedView(permission_label)); } // If we have more details to provide, show them in collapsed form. - if (!prompt.GetPermissionsDetails(i).empty()) { + if (!prompt->GetPermissionsDetails(i).empty()) { layout->StartRow(0, column_set_id); PermissionDetails details; details.push_back( - PrepareForDisplay(prompt.GetPermissionsDetails(i), false)); + PrepareForDisplay(prompt->GetPermissionsDetails(i), false)); ExpandableContainerView* details_container = new ExpandableContainerView( this, base::string16(), details, left_column_width, @@ -656,10 +657,10 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( layout->AddView(details_container); } - if (prompt.experiment()->should_show_inline_explanations()) { + if (prompt->experiment()->should_show_inline_explanations()) { base::string16 explanation = - prompt.experiment()->GetInlineExplanation( - prompt.GetPermission(i)); + prompt->experiment()->GetInlineExplanation( + prompt->GetPermission(i)); if (!explanation.empty()) { PermissionDetails details; details.push_back(explanation); @@ -669,7 +670,7 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( false, false, true); // Inline explanations are expanded by default if there is // no "Show details" link. - if (!prompt.experiment()->show_details_link()) + if (!prompt->experiment()->show_details_link()) container->ExpandWithoutAnimation(); layout->StartRow(0, column_set_id); layout->AddView(container); @@ -689,13 +690,13 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( } } - if (prompt.GetRetainedFileCount()) { + if (prompt->GetRetainedFileCount()) { // Slide in under the permissions, if there are any. If there are // either, the retained files prompt stretches all the way to the // right of the dialog. If there are no permissions, the retained // files prompt just takes up the left column. int space_for_files = left_column_width; - if (prompt.GetPermissionCount()) { + if (prompt->GetPermissionCount()) { space_for_files += kIconSize; views::ColumnSet* column_set = layout->AddColumnSet(++column_set_id); column_set->AddColumn(views::GridLayout::FILL, @@ -710,8 +711,7 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( layout->StartRow(0, column_set_id); views::Label* retained_files_header = NULL; - retained_files_header = - new views::Label(prompt.GetRetainedFilesHeading()); + retained_files_header = new views::Label(prompt->GetRetainedFilesHeading()); retained_files_header->SetMultiLine(true); retained_files_header->SetHorizontalAlignment(gfx::ALIGN_LEFT); retained_files_header->SizeToFit(space_for_files); @@ -719,8 +719,8 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( layout->StartRow(0, column_set_id); PermissionDetails details; - for (size_t i = 0; i < prompt.GetRetainedFileCount(); ++i) - details.push_back(prompt.GetRetainedFile(i)); + for (size_t i = 0; i < prompt->GetRetainedFileCount(); ++i) + details.push_back(prompt->GetRetainedFile(i)); ExpandableContainerView* issue_advice_view = new ExpandableContainerView( this, base::string16(), details, space_for_files, @@ -728,13 +728,13 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( layout->AddView(issue_advice_view); } - DCHECK(prompt.type() >= 0); + DCHECK(prompt->type() >= 0); UMA_HISTOGRAM_ENUMERATION("Extensions.InstallPrompt.Type", - prompt.type(), + prompt->type(), ExtensionInstallPrompt::NUM_PROMPT_TYPES); - if (prompt.ShouldShowPermissions()) { - if (prompt.ShouldShowExplanationText()) { + if (prompt->ShouldShowPermissions()) { + if (prompt->ShouldShowExplanationText()) { views::ColumnSet* column_set = layout->AddColumnSet(++column_set_id); column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, @@ -746,26 +746,26 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( layout->AddPaddingRow(0, 2 * views::kRelatedControlVerticalSpacing); layout->StartRow(0, column_set_id); - views::Label* explanation = new views::Label( - prompt.experiment()->GetExplanationText()); + views::Label* explanation = + new views::Label(prompt->experiment()->GetExplanationText()); explanation->SetMultiLine(true); explanation->SetHorizontalAlignment(gfx::ALIGN_LEFT); explanation->SizeToFit(left_column_width + kIconSize); layout->AddView(explanation); } - if (prompt.experiment()->should_show_expandable_permission_list() || - (prompt.experiment()->show_details_link() && - prompt.experiment()->should_show_inline_explanations() && - !inline_explanations_.empty())) { + if (prompt->experiment()->should_show_expandable_permission_list() || + (prompt->experiment()->show_details_link() && + prompt->experiment()->should_show_inline_explanations() && + !inline_explanations_.empty())) { // Don't show the "Show details" link if there are retained // files. These have their own "Show details" links and having // multiple levels of links is confusing. - if (prompt.GetRetainedFileCount() == 0) { + if (prompt->GetRetainedFileCount() == 0) { int text_id = - prompt.experiment()->should_show_expandable_permission_list() ? - IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_PERMISSIONS : - IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_DETAILS; + prompt->experiment()->should_show_expandable_permission_list() + ? IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_PERMISSIONS + : IDS_EXTENSION_PROMPT_EXPERIMENT_SHOW_DETAILS; show_details_link_ = new views::Link( l10n_util::GetStringUTF16(text_id)); show_details_link_->SetHorizontalAlignment(gfx::ALIGN_LEFT); @@ -776,7 +776,7 @@ ExtensionInstallDialogView::ExtensionInstallDialogView( } } - if (prompt.experiment()->show_checkboxes()) { + if (prompt->experiment()->show_checkboxes()) { checkbox_info_label_ = new views::Label( l10n_util::GetStringUTF16( IDS_EXTENSION_PROMPT_EXPERIMENT_CHECKBOX_INFO)); @@ -833,7 +833,7 @@ views::GridLayout* ExtensionInstallDialogView::CreateLayout( ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); views::Label* heading = new views::Label( - prompt_.GetHeading(), rb.GetFontList(ui::ResourceBundle::MediumFont)); + prompt_->GetHeading(), rb.GetFontList(ui::ResourceBundle::MediumFont)); heading->SetMultiLine(true); heading->SetHorizontalAlignment(gfx::ALIGN_LEFT); heading->SizeToFit(left_column_width); @@ -841,7 +841,7 @@ views::GridLayout* ExtensionInstallDialogView::CreateLayout( if (!is_bundle_install()) { // Scale down to icon size, but allow smaller icons (don't scale up). - const gfx::ImageSkia* image = prompt_.icon().ToImageSkia(); + const gfx::ImageSkia* image = prompt_->icon().ToImageSkia(); gfx::Size size(image->width(), image->height()); if (size.width() > kIconSize || size.height() > kIconSize) size = gfx::Size(kIconSize, kIconSize); @@ -857,13 +857,13 @@ views::GridLayout* ExtensionInstallDialogView::CreateLayout( if (is_inline_install()) { // Also span the rating, user_count and store_link rows. icon_row_span = 4; - } else if (prompt_.ShouldShowPermissions()) { - size_t permission_count = prompt_.GetPermissionCount(); + } else if (prompt_->ShouldShowPermissions()) { + size_t permission_count = prompt_->GetPermissionCount(); // Also span the permission header and each of the permission rows (all // have a padding row above it). This also works for the 'no special // permissions' case. icon_row_span = 3 + permission_count * 2; - } else if (prompt_.GetRetainedFileCount()) { + } else if (prompt_->GetRetainedFileCount()) { // Also span the permission header and the retained files container. icon_row_span = 4; } @@ -900,7 +900,7 @@ void ExtensionInstallDialogView::ViewHierarchyChanged( } int ExtensionInstallDialogView::GetDialogButtons() const { - int buttons = prompt_.GetDialogButtons(); + int buttons = prompt_->GetDialogButtons(); // Simply having just an OK button is *not* supported. See comment on function // GetDialogButtons in dialog_delegate.h for reasons. DCHECK_GT(buttons & ui::DIALOG_BUTTON_CANCEL, 0); @@ -911,11 +911,11 @@ base::string16 ExtensionInstallDialogView::GetDialogButtonLabel( ui::DialogButton button) const { switch (button) { case ui::DIALOG_BUTTON_OK: - return prompt_.GetAcceptButtonLabel(); + return prompt_->GetAcceptButtonLabel(); case ui::DIALOG_BUTTON_CANCEL: - return prompt_.HasAbortButtonLabel() ? - prompt_.GetAbortButtonLabel() : - l10n_util::GetStringUTF16(IDS_CANCEL); + return prompt_->HasAbortButtonLabel() + ? prompt_->GetAbortButtonLabel() + : l10n_util::GetStringUTF16(IDS_CANCEL); default: NOTREACHED(); return base::string16(); @@ -943,7 +943,7 @@ ui::ModalType ExtensionInstallDialogView::GetModalType() const { } base::string16 ExtensionInstallDialogView::GetWindowTitle() const { - return prompt_.GetDialogTitle(); + return prompt_->GetDialogTitle(); } void ExtensionInstallDialogView::LinkClicked(views::Link* source, @@ -952,7 +952,7 @@ void ExtensionInstallDialogView::LinkClicked(views::Link* source, UpdateLinkActionHistogram(LINK_CLICKED); // Show details link is used to either reveal whole permission list or to // reveal inline explanations. - if (prompt_.experiment()->should_show_expandable_permission_list()) { + if (prompt_->experiment()->should_show_expandable_permission_list()) { gfx::Rect bounds = GetWidget()->GetWindowBoundsInScreen(); int spacing = bounds.height() - scrollable_header_only_->GetPreferredSize().height(); @@ -968,7 +968,7 @@ void ExtensionInstallDialogView::LinkClicked(views::Link* source, show_details_link_->SetVisible(false); } else { GURL store_url(extension_urls::GetWebstoreItemDetailURLPrefix() + - prompt_.extension()->id()); + prompt_->extension()->id()); OpenURLParams params( store_url, Referrer(), NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_LINK, @@ -1017,7 +1017,7 @@ void ExtensionInstallDialogView::Layout() { } // Disable accept button if there are unchecked boxes and // the experiment is on. - if (prompt_.experiment()->show_checkboxes()) + if (prompt_->experiment()->show_checkboxes()) GetDialogClientView()->ok_button()->SetEnabled(unchecked_boxes_ == 0); DialogDelegateView::Layout(); @@ -1043,13 +1043,13 @@ void ExtensionInstallDialogView::ButtonPressed(views::Button* sender, void ExtensionInstallDialogView::UpdateInstallResultHistogram(bool accepted) const { - if (prompt_.type() == ExtensionInstallPrompt::INSTALL_PROMPT) + if (prompt_->type() == ExtensionInstallPrompt::INSTALL_PROMPT) UMA_HISTOGRAM_BOOLEAN("Extensions.InstallPrompt.Accepted", accepted); } void ExtensionInstallDialogView::UpdateLinkActionHistogram(int action_type) const { - if (prompt_.experiment()->should_show_expandable_permission_list()) { + if (prompt_->experiment()->should_show_expandable_permission_list()) { // The clickable link in the UI is "Show Permissions". UMA_HISTOGRAM_ENUMERATION( "Extensions.InstallPromptExperiment.ShowPermissions", |