From 5db2e88854f6dfc365544a7aecedeee29fb539a8 Mon Sep 17 00:00:00 2001 From: "xiyuan@chromium.org" Date: Thu, 20 Dec 2012 10:17:26 +0000 Subject: [PATCH] Allow ExtensionInstallPrompt be created with a parent native view. - Add a ShowParams that takes either a parent web contents or a native window + page navigator for ShowDialogCallback; - Add a ExtensionInstallPrompt ctor that takes a profile, a parent native window and a page navigator; Clean-ups: - Consolidate prompt_type_ into prompt_; - Remove profile_ from ExtensionInstallPrompt and use install_ui_->profile() instead; - Remove profile_ from Prompt and add a SetUserNameFromProfile instead; BUG=157996 TEST=Code compiles on all platforms and no test regressions. R=sail@chromium.org,benwells@chromium.org Review URL: https://chromiumcodereview.appspot.com/11608007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174120 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/extensions/extension_install_prompt.cc | 106 ++++++++++++++------- .../browser/extensions/extension_install_prompt.h | 43 +++++++-- .../extensions/webstore_standalone_installer.cc | 12 +-- .../extensions/extension_install_dialog_android.cc | 2 +- .../extension_install_dialog_controller.h | 2 +- .../extension_install_dialog_controller.mm | 19 ++-- ...ension_install_dialog_controller_browsertest.mm | 3 +- .../extension_install_prompt_test_utils.mm | 3 +- .../extension_install_view_controller_unittest.mm | 2 +- .../gtk/extensions/extension_install_dialog_gtk.cc | 14 ++- chrome/browser/ui/intents/web_intent_picker.cc | 4 +- chrome/browser/ui/intents/web_intent_picker.h | 2 +- .../ui/intents/web_intent_picker_controller.cc | 12 +-- .../ui/intents/web_intent_picker_controller.h | 2 +- .../extensions/extension_install_dialog_view.cc | 27 +++--- 15 files changed, 151 insertions(+), 102 deletions(-) diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc index 6276fad0ff2c..77915bdefc59 100644 --- a/chrome/browser/extensions/extension_install_prompt.cc +++ b/chrome/browser/extensions/extension_install_prompt.cc @@ -32,6 +32,7 @@ #include "chrome/common/extensions/permissions/permission_set.h" #include "chrome/common/pref_names.h" #include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_view.h" #include "extensions/common/url_pattern.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" @@ -155,15 +156,21 @@ Profile* ProfileForWebContents(content::WebContents* web_contents) { return Profile::FromBrowserContext(web_contents->GetBrowserContext()); } +gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) { + if (!contents) + return NULL; + + return contents->GetView()->GetTopLevelNativeWindow(); +} + } // namespace -ExtensionInstallPrompt::Prompt::Prompt(Profile* profile, PromptType type) +ExtensionInstallPrompt::Prompt::Prompt(PromptType type) : type_(type), extension_(NULL), bundle_(NULL), average_rating_(0.0), - rating_count_(0), - profile_(profile) { + rating_count_(0) { } ExtensionInstallPrompt::Prompt::~Prompt() { @@ -179,6 +186,16 @@ void ExtensionInstallPrompt::Prompt::SetOAuthIssueAdvice( oauth_issue_advice_ = issue_advice; } +void ExtensionInstallPrompt::Prompt::SetUserNameFromProfile(Profile* profile) { + // |profile| can be NULL in unit tests. + if (profile) { + oauth_user_name_ = UTF8ToUTF16(profile->GetPrefs()->GetString( + prefs::kGoogleServicesUsername)); + } else { + oauth_user_name_.clear(); + } +} + void ExtensionInstallPrompt::Prompt::SetInlineInstallWebstoreData( const std::string& localized_user_count, double average_rating, @@ -255,14 +272,7 @@ string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const { } string16 ExtensionInstallPrompt::Prompt::GetOAuthHeading() const { - string16 username(ASCIIToUTF16("username@example.com")); - // |profile_| can be NULL in unit tests. - if (profile_) { - username = UTF8ToUTF16(profile_->GetPrefs()->GetString( - prefs::kGoogleServicesUsername)); - } - int resource_id = kOAuthHeaderIds[type_]; - return l10n_util::GetStringFUTF16(resource_id, username); + return l10n_util::GetStringFUTF16(kOAuthHeaderIds[type_], oauth_user_name_); } void ExtensionInstallPrompt::Prompt::AppendRatingStars( @@ -327,6 +337,20 @@ const IssueAdviceInfoEntry& ExtensionInstallPrompt::Prompt::GetOAuthIssue( return oauth_issue_advice_[index]; } +ExtensionInstallPrompt::ShowParams::ShowParams(content::WebContents* contents) + : parent_web_contents(contents), + parent_window(NativeWindowForWebContents(contents)), + navigator(contents) { +} + +ExtensionInstallPrompt::ShowParams::ShowParams( + gfx::NativeWindow window, + content::PageNavigator* navigator) + : parent_web_contents(NULL), + parent_window(window), + navigator(navigator) { +} + // static scoped_refptr ExtensionInstallPrompt::GetLocalizedExtensionForDisplay( @@ -361,14 +385,27 @@ scoped_refptr ExtensionInstallPrompt::ExtensionInstallPrompt( content::WebContents* contents) : record_oauth2_grant_(false), - parent_web_contents_(contents), ui_loop_(MessageLoop::current()), extension_(NULL), install_ui_(ExtensionInstallUI::Create(ProfileForWebContents(contents))), + show_params_(contents), delegate_(NULL), - profile_(ProfileForWebContents(contents)), - prompt_(profile_, UNSET_PROMPT_TYPE), - prompt_type_(UNSET_PROMPT_TYPE) { + prompt_(UNSET_PROMPT_TYPE) { + prompt_.SetUserNameFromProfile(install_ui_->profile()); +} + +ExtensionInstallPrompt::ExtensionInstallPrompt( + Profile* profile, + gfx::NativeWindow native_window, + content::PageNavigator* navigator) + : record_oauth2_grant_(false), + ui_loop_(MessageLoop::current()), + extension_(NULL), + install_ui_(ExtensionInstallUI::Create(profile)), + show_params_(native_window, navigator), + delegate_(NULL), + prompt_(UNSET_PROMPT_TYPE) { + prompt_.SetUserNameFromProfile(install_ui_->profile()); } ExtensionInstallPrompt::~ExtensionInstallPrompt() { @@ -381,7 +418,7 @@ void ExtensionInstallPrompt::ConfirmBundleInstall( bundle_ = bundle; permissions_ = permissions; delegate_ = bundle; - prompt_type_ = BUNDLE_INSTALL_PROMPT; + prompt_.set_type(BUNDLE_INSTALL_PROMPT); FetchOAuthIssueAdviceIfNeeded(); } @@ -396,7 +433,6 @@ void ExtensionInstallPrompt::ConfirmStandaloneInstall( permissions_ = extension->GetActivePermissions(); delegate_ = delegate; prompt_ = prompt; - prompt_type_ = prompt.type(); SetIcon(icon); FetchOAuthIssueAdviceIfNeeded(); @@ -422,7 +458,7 @@ void ExtensionInstallPrompt::ConfirmInstall( extension_ = extension; permissions_ = extension->GetActivePermissions(); delegate_ = delegate; - prompt_type_ = INSTALL_PROMPT; + prompt_.set_type(INSTALL_PROMPT); show_dialog_callback_ = show_dialog_callback; // We special-case themes to not show any confirm UI. Instead they are @@ -449,7 +485,7 @@ void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate, extension_ = extension; permissions_ = extension->GetActivePermissions(); delegate_ = delegate; - prompt_type_ = RE_ENABLE_PROMPT; + prompt_.set_type(RE_ENABLE_PROMPT); LoadImageIfNeeded(); } @@ -460,7 +496,7 @@ void ExtensionInstallPrompt::ConfirmExternalInstall( extension_ = extension; permissions_ = extension->GetActivePermissions(); delegate_ = delegate; - prompt_type_ = EXTERNAL_INSTALL_PROMPT; + prompt_.set_type(EXTERNAL_INSTALL_PROMPT); LoadImageIfNeeded(); } @@ -473,7 +509,7 @@ void ExtensionInstallPrompt::ConfirmPermissions( extension_ = extension; permissions_ = permissions; delegate_ = delegate; - prompt_type_ = PERMISSIONS_PROMPT; + prompt_.set_type(PERMISSIONS_PROMPT); LoadImageIfNeeded(); } @@ -485,7 +521,7 @@ void ExtensionInstallPrompt::ConfirmIssueAdvice( DCHECK(ui_loop_ == MessageLoop::current()); extension_ = extension; delegate_ = delegate; - prompt_type_ = PERMISSIONS_PROMPT; + prompt_.set_type(PERMISSIONS_PROMPT); record_oauth2_grant_ = true; prompt_.SetOAuthIssueAdvice(issue_advice); @@ -526,8 +562,8 @@ void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image) { void ExtensionInstallPrompt::LoadImageIfNeeded() { // Bundle install prompts do not have an icon. - // Also |profile_| can be NULL in unit tests. - if (!icon_.empty() || !profile_) { + // Also |install_ui_.profile()| can be NULL in unit tests. + if (!icon_.empty() || !install_ui_->profile()) { FetchOAuthIssueAdviceIfNeeded(); return; } @@ -541,7 +577,7 @@ void ExtensionInstallPrompt::LoadImageIfNeeded() { // TODO(tbarzic): We should use IconImage here and load the required bitmap // lazily. int pixel_size = GetSizeForMaxScaleFactor(kIconSize); - extensions::ImageLoader::Get(profile_)->LoadImageAsync( + extensions::ImageLoader::Get(install_ui_->profile())->LoadImageAsync( extension_, image, gfx::Size(pixel_size, pixel_size), base::Bind(&ExtensionInstallPrompt::OnImageLoaded, AsWeakPtr())); } @@ -549,9 +585,9 @@ void ExtensionInstallPrompt::LoadImageIfNeeded() { void ExtensionInstallPrompt::FetchOAuthIssueAdviceIfNeeded() { // |extension_| may be NULL, e.g. in the bundle install case. if (!extension_ || - prompt_type_ == BUNDLE_INSTALL_PROMPT || - prompt_type_ == INLINE_INSTALL_PROMPT || - prompt_type_ == EXTERNAL_INSTALL_PROMPT || + prompt_.type() == BUNDLE_INSTALL_PROMPT || + prompt_.type() == INLINE_INSTALL_PROMPT || + prompt_.type() == EXTERNAL_INSTALL_PROMPT || prompt_.GetOAuthIssueCount() != 0U) { ShowConfirmation(); return; @@ -592,8 +628,6 @@ void ExtensionInstallPrompt::OnMintTokenFailure( } void ExtensionInstallPrompt::ShowConfirmation() { - prompt_.set_type(prompt_type_); - if (permissions_ && (!extension_ || !extension_->ShouldSkipPermissionWarnings())) { Extension::Type extension_type = extension_ ? extension_->GetType() : @@ -601,7 +635,7 @@ void ExtensionInstallPrompt::ShowConfirmation() { prompt_.SetPermissions(permissions_->GetWarningMessages(extension_type)); } - switch (prompt_type_) { + switch (prompt_.type()) { case PERMISSIONS_PROMPT: case RE_ENABLE_PROMPT: case INLINE_INSTALL_PROMPT: @@ -623,10 +657,8 @@ void ExtensionInstallPrompt::ShowConfirmation() { if (AutoConfirmPrompt(delegate_)) return; - if (show_dialog_callback_.is_null()) { - GetDefaultShowDialogCallback().Run( - parent_web_contents_, delegate_, prompt_); - } else { - show_dialog_callback_.Run(parent_web_contents_, delegate_, prompt_); - } + if (show_dialog_callback_.is_null()) + GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_); + else + show_dialog_callback_.Run(show_params_, delegate_, prompt_); } diff --git a/chrome/browser/extensions/extension_install_prompt.h b/chrome/browser/extensions/extension_install_prompt.h index ad89799b7b26..4468bbfdd9f9 100644 --- a/chrome/browser/extensions/extension_install_prompt.h +++ b/chrome/browser/extensions/extension_install_prompt.h @@ -31,6 +31,7 @@ class DictionaryValue; } // namespace base namespace content { +class PageNavigator; class WebContents; } @@ -63,7 +64,7 @@ class ExtensionInstallPrompt // that logic. class Prompt { public: - Prompt(Profile* profile, PromptType type); + explicit Prompt(PromptType type); ~Prompt(); void SetPermissions(const std::vector& permissions); @@ -71,6 +72,7 @@ class ExtensionInstallPrompt double average_rating, int rating_count); void SetOAuthIssueAdvice(const IssueAdviceInfo& issue_advice); + void SetUserNameFromProfile(Profile* profile); PromptType type() const { return type_; } void set_type(PromptType type) { type_ = type; } @@ -117,6 +119,7 @@ class ExtensionInstallPrompt private: PromptType type_; + // Permissions that are being requested (may not be all of an extension's // permissions if only additional ones are being requested) std::vector permissions_; @@ -125,6 +128,9 @@ class ExtensionInstallPrompt // These correspond to permission scopes. IssueAdviceInfo oauth_issue_advice_; + // User name to be used in Oauth heading label. + string16 oauth_user_name_; + // The extension or bundle being installed. const extensions::Extension* extension_; const extensions::BundleInstaller* bundle_; @@ -139,8 +145,6 @@ class ExtensionInstallPrompt // Range is kMinExtensionRating to kMaxExtensionRating double average_rating_; int rating_count_; - - Profile* profile_; }; static const int kMinExtensionRating = 0; @@ -159,7 +163,23 @@ class ExtensionInstallPrompt virtual ~Delegate() {} }; - typedef base::Callback ShowDialogCallback; @@ -180,6 +200,12 @@ class ExtensionInstallPrompt // Creates a prompt with a parent web content. explicit ExtensionInstallPrompt(content::WebContents* contents); + + // Creates a prompt with a profile, a native window and a page navigator. + ExtensionInstallPrompt(Profile* profile, + gfx::NativeWindow native_window, + content::PageNavigator* navigator); + virtual ~ExtensionInstallPrompt(); ExtensionInstallUI* install_ui() const { return install_ui_.get(); } @@ -295,7 +321,6 @@ class ExtensionInstallPrompt // Shows the actual UI (the icon should already be loaded). void ShowConfirmation(); - content::WebContents* parent_web_contents_; MessageLoop* ui_loop_; // The extensions installation icon. @@ -314,17 +339,15 @@ class ExtensionInstallPrompt // The object responsible for doing the UI specific actions. scoped_ptr install_ui_; + // Parameters to show the confirmation UI. + ShowParams show_params_; + // The delegate we will call Proceed/Abort on after confirmation UI. Delegate* delegate_; - Profile* profile_; - // A pre-filled prompt. Prompt prompt_; - // The type of prompt we are going to show. - PromptType prompt_type_; - scoped_ptr token_flow_; // Used to show the confirm dialog. diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc index 7686908ae407..282e8528ce22 100644 --- a/chrome/browser/extensions/webstore_standalone_installer.cc +++ b/chrome/browser/extensions/webstore_standalone_installer.cc @@ -168,7 +168,7 @@ WebstoreStandaloneInstaller::WebstoreStandaloneInstaller( } void WebstoreStandaloneInstaller::BeginInstall() { - AddRef(); // Balanced in CompleteInstall or WebContentsDestroyed. + AddRef(); // Balanced in CompleteInstall or WebContentsDestroyed. if (!Extension::IdIsValid(id_)) { CompleteInstall(kInvalidWebstoreItemId); @@ -319,7 +319,7 @@ void WebstoreStandaloneInstaller::OnWebstoreResponseParseSuccess( this, id_, manifest, - "", // We don't have any icon data. + "", // We don't have any icon data. icon_url, Profile::FromBrowserContext(web_contents()->GetBrowserContext())-> GetRequestContext()); @@ -347,12 +347,10 @@ void WebstoreStandaloneInstaller::OnWebstoreParseSuccess( manifest_.reset(manifest); icon_ = icon; - Profile* profile = Profile::FromBrowserContext( - web_contents()->GetBrowserContext()); ExtensionInstallPrompt::PromptType prompt_type = use_inline_prompt_ ? ExtensionInstallPrompt::INLINE_INSTALL_PROMPT : ExtensionInstallPrompt::INSTALL_PROMPT; - ExtensionInstallPrompt::Prompt prompt(profile, prompt_type); + ExtensionInstallPrompt::Prompt prompt(prompt_type); if (use_inline_prompt_) { prompt.SetInlineInstallWebstoreData(localized_user_count_, average_rating_, @@ -420,7 +418,7 @@ void WebstoreStandaloneInstaller::WebContentsDestroyed( // Abort any in-progress fetches. if (webstore_data_url_fetcher_.get()) { webstore_data_url_fetcher_.reset(); - Release(); // Matches the AddRef in BeginInstall. + Release(); // Matches the AddRef in BeginInstall. } } @@ -442,7 +440,7 @@ void WebstoreStandaloneInstaller::CompleteInstall(const std::string& error) { if (!callback_.is_null()) callback_.Run(error.empty(), error); - Release(); // Matches the AddRef in BeginInstall. + Release(); // Matches the AddRef in BeginInstall. } // static 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 49b385fb4f2e..ab58ee01e3f3 100644 --- a/chrome/browser/ui/android/extensions/extension_install_dialog_android.cc +++ b/chrome/browser/ui/android/extensions/extension_install_dialog_android.cc @@ -8,7 +8,7 @@ namespace { void ShowExtensionInstallDialogImpl( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const 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 8392589a7cfb..c9ada3aacd2f 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h +++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h @@ -24,7 +24,7 @@ class ExtensionInstallDialogController : public ConstrainedWindowMacDelegate { public: ExtensionInstallDialogController( - content::WebContents* web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt); virtual ~ExtensionInstallDialogController(); 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 99bef89000c9..2703d7b2e588 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.mm @@ -5,6 +5,7 @@ #import "chrome/browser/ui/cocoa/extensions/extension_install_dialog_controller.h" #include "base/bind.h" +#include "base/logging.h" #include "base/message_loop.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" @@ -17,23 +18,27 @@ namespace { void ShowExtensionInstallDialogImpl( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt) { + if (!show_params.parent_web_contents) { + // TODO(sail): Add support for showing the dialog without a parent window. + NOTIMPLEMENTED(); + return; + } + // This object will delete itself when the dialog closes. - new ExtensionInstallDialogController(parent_web_contents, - delegate, - prompt); + new ExtensionInstallDialogController(show_params, delegate, prompt); } } // namespace ExtensionInstallDialogController::ExtensionInstallDialogController( - content::WebContents* web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt) : delegate_(delegate) { view_controller_.reset([[ExtensionInstallViewController alloc] - initWithNavigator:web_contents + initWithNavigator:show_params.navigator delegate:this prompt:prompt]); @@ -45,7 +50,7 @@ ExtensionInstallDialogController::ExtensionInstallDialogController( [[CustomConstrainedWindowSheet alloc] initWithCustomWindow:window]); constrained_window_.reset(new ConstrainedWindowMac( - this, web_contents, sheet)); + this, show_params.parent_web_contents, sheet)); } ExtensionInstallDialogController::~ExtensionInstallDialogController() { 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 2468d43a9839..c23412537e80 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 @@ -26,13 +26,14 @@ public: IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogControllerTest, BasicTest) { content::WebContents* tab = browser()->tab_strip_model()->GetWebContentsAt(0); + ExtensionInstallPrompt::ShowParams show_params(tab); chrome::MockExtensionInstallPromptDelegate delegate; ExtensionInstallPrompt::Prompt prompt = chrome::BuildExtensionInstallPrompt(extension_); ExtensionInstallDialogController* controller = - new ExtensionInstallDialogController(tab, + new ExtensionInstallDialogController(show_params, &delegate, prompt); 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 7afbc562d81e..8dad9f29fcf5 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 @@ -66,8 +66,7 @@ gfx::Image LoadInstallPromptIcon() { ExtensionInstallPrompt::Prompt BuildExtensionInstallPrompt( Extension* extension) { - ExtensionInstallPrompt::Prompt prompt( - NULL, ExtensionInstallPrompt::INSTALL_PROMPT); + ExtensionInstallPrompt::Prompt prompt(ExtensionInstallPrompt::INSTALL_PROMPT); prompt.set_extension(extension); prompt.set_icon(LoadInstallPromptIcon()); return prompt; 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 8dcfe28a221c..e5640ba8f17a 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 @@ -197,7 +197,7 @@ TEST_F(ExtensionInstallViewControllerTest, BasicsInline) { // No warnings should trigger skinny prompt. ExtensionInstallPrompt::Prompt inline_prompt( - NULL, ExtensionInstallPrompt::INLINE_INSTALL_PROMPT); + ExtensionInstallPrompt::INLINE_INSTALL_PROMPT); inline_prompt.SetInlineInstallWebstoreData("1,000", 3.5, 200); inline_prompt.set_extension(extension_.get()); inline_prompt.set_icon(chrome::LoadInstallPromptIcon()); diff --git a/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc b/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc index 32392e11c768..c11b9dc7420e 100644 --- a/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc +++ b/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc @@ -86,7 +86,7 @@ namespace chrome { // ExtensionInstallPrompt::Delegate instance. class ExtensionInstallDialog { public: - ExtensionInstallDialog(content::WebContents* parent_web_contents, + ExtensionInstallDialog(const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt); private: @@ -105,10 +105,10 @@ class ExtensionInstallDialog { }; ExtensionInstallDialog::ExtensionInstallDialog( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate *delegate, const ExtensionInstallPrompt::Prompt& prompt) - : navigator_(parent_web_contents), + : navigator_(show_params.navigator), delegate_(delegate), dialog_(NULL) { bool show_permissions = prompt.GetPermissionCount() > 0; @@ -124,9 +124,7 @@ ExtensionInstallDialog::ExtensionInstallDialog( extension_id_ = prompt.extension()->id(); // Build the dialog. - gfx::NativeWindow parent = NULL; - if (parent_web_contents) - parent = parent_web_contents->GetView()->GetTopLevelNativeWindow(); + gfx::NativeWindow parent = show_params.parent_window; dialog_ = gtk_dialog_new_with_buttons( UTF16ToUTF8(prompt.GetDialogTitle()).c_str(), parent, @@ -396,10 +394,10 @@ GtkWidget* ExtensionInstallDialog::CreateWidgetForIssueAdvice( namespace { void ShowExtensionInstallDialogImpl( - content::WebContents* parent_web_content, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt) { - new chrome::ExtensionInstallDialog(parent_web_content, delegate, prompt); + new chrome::ExtensionInstallDialog(show_params, delegate, prompt); } } // namespace diff --git a/chrome/browser/ui/intents/web_intent_picker.cc b/chrome/browser/ui/intents/web_intent_picker.cc index 0a9f041d8536..094a540d9af3 100644 --- a/chrome/browser/ui/intents/web_intent_picker.cc +++ b/chrome/browser/ui/intents/web_intent_picker.cc @@ -25,11 +25,11 @@ const int kMaxInlineDispositionHeight = 900; } // namespace void WebIntentPicker::OnShowExtensionInstallDialog( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt) { ExtensionInstallPrompt::GetDefaultShowDialogCallback().Run( - parent_web_contents, delegate, prompt); + show_params, delegate, prompt); } gfx::Size WebIntentPicker::GetMinInlineDispositionSize() { diff --git a/chrome/browser/ui/intents/web_intent_picker.h b/chrome/browser/ui/intents/web_intent_picker.h index 7c898b624778..6ba3c4c02e51 100644 --- a/chrome/browser/ui/intents/web_intent_picker.h +++ b/chrome/browser/ui/intents/web_intent_picker.h @@ -88,7 +88,7 @@ class WebIntentPicker { // dialog. We *MUST* eventually call either Proceed() or Abort() on // |delegate|. virtual void OnShowExtensionInstallDialog( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt); diff --git a/chrome/browser/ui/intents/web_intent_picker_controller.cc b/chrome/browser/ui/intents/web_intent_picker_controller.cc index b689077b76b9..f7bb3dd6b7e3 100644 --- a/chrome/browser/ui/intents/web_intent_picker_controller.cc +++ b/chrome/browser/ui/intents/web_intent_picker_controller.cc @@ -709,15 +709,13 @@ void WebIntentPickerController::Reset() { } void WebIntentPickerController::OnShowExtensionInstallDialog( - content::WebContents* parent_web_contents, - ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) { + const ExtensionInstallPrompt::ShowParams& show_params, + ExtensionInstallPrompt::Delegate* delegate, + const ExtensionInstallPrompt::Prompt& prompt) { picker_model_->SetPendingExtensionInstallDelegate(delegate); picker_model_->SetPendingExtensionInstallPrompt(prompt); - if (picker_) { - picker_->OnShowExtensionInstallDialog( - parent_web_contents, delegate, prompt); - } + if (picker_) + picker_->OnShowExtensionInstallDialog(show_params, delegate, prompt); } void WebIntentPickerController::SetWindowDispositionSource( diff --git a/chrome/browser/ui/intents/web_intent_picker_controller.h b/chrome/browser/ui/intents/web_intent_picker_controller.h index fb4f6efb29d1..37d1124c2169 100644 --- a/chrome/browser/ui/intents/web_intent_picker_controller.h +++ b/chrome/browser/ui/intents/web_intent_picker_controller.h @@ -219,7 +219,7 @@ class WebIntentPickerController // Called to show a custom extension install dialog. void OnShowExtensionInstallDialog( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& 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 3e81f230169c..5624a7e3b436 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc @@ -18,7 +18,6 @@ #include "chrome/installer/util/browser_distribution.h" #include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents.h" -#include "content/public/browser/web_contents_view.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/google_chrome_strings.h" @@ -197,25 +196,23 @@ class IssueAdviceView : public views::View, DISALLOW_COPY_AND_ASSIGN(IssueAdviceView); }; -void DoShowDialog(content::WebContents* parent_web_contents, +void DoShowDialog(const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt, bool show_launcher_opt_in) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); - gfx::NativeWindow parent = NULL; - if (parent_web_contents) - parent = parent_web_contents->GetView()->GetTopLevelNativeWindow(); views::Widget::CreateWindowWithParent( - new ExtensionInstallDialogView(parent_web_contents, delegate, prompt, + new ExtensionInstallDialogView(show_params.navigator, delegate, prompt, show_launcher_opt_in), - parent)->Show(); + show_params.parent_window)->Show(); } // Runs on the FILE thread. Check if the launcher is present and then show // the install dialog with an appropriate |show_launcher_opt_in|. -void CheckLauncherAndShowDialog(content::WebContents* parent_web_contents, - ExtensionInstallPrompt::Delegate* delegate, - const ExtensionInstallPrompt::Prompt& prompt) { +void CheckLauncherAndShowDialog( + const ExtensionInstallPrompt::ShowParams& show_params, + ExtensionInstallPrompt::Delegate* delegate, + const ExtensionInstallPrompt::Prompt& prompt) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); #if defined(OS_WIN) bool present = chrome_launcher_support::IsAppLauncherPresent(); @@ -226,12 +223,11 @@ void CheckLauncherAndShowDialog(content::WebContents* parent_web_contents, content::BrowserThread::PostTask( content::BrowserThread::UI, FROM_HERE, - base::Bind(&DoShowDialog, parent_web_contents, delegate, prompt, - !present)); + base::Bind(&DoShowDialog, show_params, delegate, prompt, !present)); } void ShowExtensionInstallDialogImpl( - content::WebContents* parent_web_contents, + const ExtensionInstallPrompt::ShowParams& show_params, ExtensionInstallPrompt::Delegate* delegate, const ExtensionInstallPrompt::Prompt& prompt) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); @@ -243,12 +239,11 @@ void ShowExtensionInstallDialogImpl( content::BrowserThread::PostTask( content::BrowserThread::FILE, FROM_HERE, - base::Bind(&CheckLauncherAndShowDialog, parent_web_contents, delegate, - prompt)); + base::Bind(&CheckLauncherAndShowDialog, show_params, delegate, prompt)); return; } #endif - DoShowDialog(parent_web_contents, delegate, prompt, false); + DoShowDialog(show_params, delegate, prompt, false); } } // namespace -- 2.11.4.GIT