diff options
author | yumiOS.art@gmail.com <yumiOS.art@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-29 22:56:43 +0000 |
---|---|---|
committer | yumiOS.art@gmail.com <yumiOS.art@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-29 22:56:43 +0000 |
commit | 55df9099f9350d906d7b03a4390687ac95269210 (patch) | |
tree | bc1282df838f668fa9323b11e6b39ea14986ed02 | |
parent | ff10b13ea905ed7f9813f62ab95fa7fef3cc7390 (diff) | |
download | chromium_src-55df9099f9350d906d7b03a4390687ac95269210.zip chromium_src-55df9099f9350d906d7b03a4390687ac95269210.tar.gz chromium_src-55df9099f9350d906d7b03a4390687ac95269210.tar.bz2 |
Refine the dialog box to show a extension name when the dialog box is created by the extension.
Contributed by yumios.art@gmail.com
BUG=112637
TEST=Try to create dialog boxes by a extension and a website(localhost).
Review URL: http://codereview.chromium.org/9426022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124275 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.cc | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_host.h | 5 | ||||
-rw-r--r-- | chrome/browser/ui/app_modal_dialogs/message_box_handler.cc | 84 | ||||
-rw-r--r-- | chrome/browser/ui/app_modal_dialogs/message_box_handler.h | 11 | ||||
-rw-r--r-- | content/browser/tab_contents/tab_contents.cc | 23 | ||||
-rw-r--r-- | content/public/browser/javascript_dialogs.h | 14 |
7 files changed, 89 insertions, 54 deletions
@@ -165,3 +165,4 @@ Mao Yujie <maojie0924@gmail.com> Aaron Leventhal <aaronlevbugs@gmail.com> Peter Collingbourne <peter@pcc.me.uk> Aaron Randolph <aaron.randolph@gmail.com> +Yumikiyo Osanai <yumios.art@gmail.com> diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 3b91af0..7b80757 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -509,7 +509,10 @@ void ExtensionHost::RenderViewDeleted(RenderViewHost* render_view_host) { } content::JavaScriptDialogCreator* ExtensionHost::GetJavaScriptDialogCreator() { - return GetJavaScriptDialogCreatorInstance(); + if (!dialog_creator_.get()) { + dialog_creator_.reset(CreateJavaScriptDialogCreatorInstance(this)); + } + return dialog_creator_.get(); } void ExtensionHost::RunFileChooser(WebContents* tab, diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h index 6d27b68..5047b22 100644 --- a/chrome/browser/extensions/extension_host.h +++ b/chrome/browser/extensions/extension_host.h @@ -227,6 +227,11 @@ class ExtensionHost : public content::WebContentsDelegate, // Optional view that shows the rendered content in the UI. scoped_ptr<PlatformExtensionView> view_; + // Used to create dialog boxes. + // It must outlive host_contents_ as host_contents_ will access it + // during destruction. + scoped_ptr<content::JavaScriptDialogCreator> dialog_creator_; + // The host for our HTML content. scoped_ptr<content::WebContents> host_contents_; diff --git a/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc b/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc index be6cef6..ae82126 100644 --- a/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc +++ b/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc @@ -10,10 +10,14 @@ #include "base/memory/singleton.h" #include "base/utf_string_conversions.h" #include "base/i18n/rtl.h" +#include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h" #include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h" #include "chrome/common/chrome_constants.h" +#include "content/public/common/content_client.h" #include "grit/generated_resources.h" +#include "net/base/net_util.h" #include "ui/base/javascript_message_type.h" #include "ui/base/l10n/l10n_util.h" @@ -24,10 +28,13 @@ class ChromeJavaScriptDialogCreator : public JavaScriptDialogCreator { public: static ChromeJavaScriptDialogCreator* GetInstance(); + explicit ChromeJavaScriptDialogCreator(ExtensionHost* extension_host); + virtual ~ChromeJavaScriptDialogCreator(); + virtual void RunJavaScriptDialog( WebContents* web_contents, - TitleType title_type, - const string16& title, + const GURL& origin_url, + const std::string& accept_lang, ui::JavascriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, @@ -44,12 +51,11 @@ class ChromeJavaScriptDialogCreator : public JavaScriptDialogCreator { private: explicit ChromeJavaScriptDialogCreator(); - virtual ~ChromeJavaScriptDialogCreator(); friend struct DefaultSingletonTraits<ChromeJavaScriptDialogCreator>; - string16 GetTitle(TitleType title_type, - const string16& title, + string16 GetTitle(const GURL& origin_url, + const std::string& accept_lang, bool is_alert); void CancelPendingDialogs(WebContents* web_contents); @@ -59,14 +65,28 @@ class ChromeJavaScriptDialogCreator : public JavaScriptDialogCreator { typedef std::map<void*, ChromeJavaScriptDialogExtraData> JavaScriptDialogExtraDataMap; JavaScriptDialogExtraDataMap javascript_dialog_extra_data_; + + // Extension Host which owns the ChromeJavaScriptDialogCreator instance. + // It's used to get a extension name from a URL. + // If it's not owned by any Extension, it should be NULL. + ExtensionHost* extension_host_; + + DISALLOW_COPY_AND_ASSIGN(ChromeJavaScriptDialogCreator); }; //------------------------------------------------------------------------------ -ChromeJavaScriptDialogCreator::ChromeJavaScriptDialogCreator() { +ChromeJavaScriptDialogCreator::ChromeJavaScriptDialogCreator() + : extension_host_(NULL) { } ChromeJavaScriptDialogCreator::~ChromeJavaScriptDialogCreator() { + extension_host_ = NULL; +} + +ChromeJavaScriptDialogCreator::ChromeJavaScriptDialogCreator( + ExtensionHost* extension_host) + : extension_host_(extension_host) { } /* static */ @@ -76,8 +96,8 @@ ChromeJavaScriptDialogCreator* ChromeJavaScriptDialogCreator::GetInstance() { void ChromeJavaScriptDialogCreator::RunJavaScriptDialog( WebContents* web_contents, - TitleType title_type, - const string16& title, + const GURL& origin_url, + const std::string& accept_lang, ui::JavascriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, @@ -105,7 +125,7 @@ void ChromeJavaScriptDialogCreator::RunJavaScriptDialog( } bool is_alert = javascript_message_type == ui::JAVASCRIPT_MESSAGE_TYPE_ALERT; - string16 dialog_title = GetTitle(title_type, title, is_alert); + string16 dialog_title = GetTitle(origin_url, accept_lang, is_alert); AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog( web_contents, @@ -158,31 +178,33 @@ void ChromeJavaScriptDialogCreator::ResetJavaScriptState( javascript_dialog_extra_data_.erase(web_contents); } -string16 ChromeJavaScriptDialogCreator::GetTitle(TitleType title_type, - const string16& title, +string16 ChromeJavaScriptDialogCreator::GetTitle(const GURL& origin_url, + const std::string& accept_lang, bool is_alert) { - switch (title_type) { - case DIALOG_TITLE_NONE: { + // If the URL hasn't any host, return the default string. + if (!origin_url.has_host()) { return l10n_util::GetStringUTF16( is_alert ? IDS_JAVASCRIPT_ALERT_DEFAULT_TITLE : IDS_JAVASCRIPT_MESSAGEBOX_DEFAULT_TITLE); - break; - } - case DIALOG_TITLE_PLAIN_STRING: { - return title; - break; - } - case DIALOG_TITLE_FORMATTED_URL: { - // Force URL to have LTR directionality. - return l10n_util::GetStringFUTF16( - is_alert ? IDS_JAVASCRIPT_ALERT_TITLE - : IDS_JAVASCRIPT_MESSAGEBOX_TITLE, - base::i18n::GetDisplayStringInLTRDirectionality(title)); - break; + } + + // If the URL is a chrome extension one, return the extension name. + if (extension_host_) { + const Extension* extension = extension_host_-> + profile()->GetExtensionService()->extensions()-> + GetExtensionOrAppByURL(ExtensionURLInfo(origin_url)); + if (extension) { + return UTF8ToUTF16(base::StringPiece(extension->name())); } } - NOTREACHED(); - return string16(); + + // Otherwise, return the formatted URL. + // In this case, force URL to have LTR directionality. + string16 url_string = net::FormatUrl(origin_url, accept_lang); + return l10n_util::GetStringFUTF16( + is_alert ? IDS_JAVASCRIPT_ALERT_TITLE + : IDS_JAVASCRIPT_MESSAGEBOX_TITLE, + base::i18n::GetDisplayStringInLTRDirectionality(url_string)); } void ChromeJavaScriptDialogCreator::CancelPendingDialogs( @@ -203,3 +225,9 @@ void ChromeJavaScriptDialogCreator::CancelPendingDialogs( content::JavaScriptDialogCreator* GetJavaScriptDialogCreatorInstance() { return ChromeJavaScriptDialogCreator::GetInstance(); } + +content::JavaScriptDialogCreator* CreateJavaScriptDialogCreatorInstance( + ExtensionHost* extension_host) { + return new ChromeJavaScriptDialogCreator(extension_host); +} + diff --git a/chrome/browser/ui/app_modal_dialogs/message_box_handler.h b/chrome/browser/ui/app_modal_dialogs/message_box_handler.h index 8dd735a..a13ac5c 100644 --- a/chrome/browser/ui/app_modal_dialogs/message_box_handler.h +++ b/chrome/browser/ui/app_modal_dialogs/message_box_handler.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -10,7 +10,16 @@ namespace content { class JavaScriptDialogCreator; } +class ExtensionHost; + // Returns a JavaScriptDialogCreator that creates real dialogs. +// It returns a Singleton instance of JavaScriptDialogCreator, +// which should not be deleted. content::JavaScriptDialogCreator* GetJavaScriptDialogCreatorInstance(); +// Creates and returns a JavaScriptDialogCreator owned by |extension_host|. +// This is not the Singleton instance, so the caller must delete it. +content::JavaScriptDialogCreator* CreateJavaScriptDialogCreatorInstance( + ExtensionHost* extension_host); + #endif // CHROME_BROWSER_UI_APP_MODAL_DIALOGS_MESSAGE_BOX_HANDLER_H_ diff --git a/content/browser/tab_contents/tab_contents.cc b/content/browser/tab_contents/tab_contents.cc index a7c8b81..13d5aa0 100644 --- a/content/browser/tab_contents/tab_contents.cc +++ b/content/browser/tab_contents/tab_contents.cc @@ -2214,25 +2214,18 @@ void TabContents::RunJavaScriptMessage( !delegate_->GetJavaScriptDialogCreator(); if (!suppress_this_message) { - content::JavaScriptDialogCreator::TitleType title_type; - string16 title; - - if (!frame_url.has_host()) { - title_type = content::JavaScriptDialogCreator::DIALOG_TITLE_NONE; - } else { - title_type = content::JavaScriptDialogCreator::DIALOG_TITLE_FORMATTED_URL; - title = net::FormatUrl( - frame_url.GetOrigin(), - content::GetContentClient()->browser()->GetAcceptLangs( - GetBrowserContext())); - } - + std::string accept_lang = content::GetContentClient()->browser()-> + GetAcceptLangs(GetBrowserContext()); dialog_creator_ = delegate_->GetJavaScriptDialogCreator(); dialog_creator_->RunJavaScriptDialog( - this, title_type, title, javascript_message_type, message, + this, + frame_url.GetOrigin(), + accept_lang, + javascript_message_type, + message, default_prompt, base::Bind(&TabContents::OnDialogClosed, base::Unretained(this), rvh, - reply_msg), + reply_msg), &suppress_this_message); } diff --git a/content/public/browser/javascript_dialogs.h b/content/public/browser/javascript_dialogs.h index 3ed812d..0e4379f 100644 --- a/content/public/browser/javascript_dialogs.h +++ b/content/public/browser/javascript_dialogs.h @@ -6,9 +6,12 @@ #define CONTENT_PUBLIC_BROWSER_JAVASCRIPT_DIALOGS_H_ #pragma once +#include <string> + #include "base/callback.h" #include "base/string16.h" #include "content/common/content_export.h" +#include "googleurl/src/gurl.h" #include "ui/base/javascript_message_type.h" #include "ui/gfx/native_widget_types.h" @@ -24,18 +27,12 @@ class JavaScriptDialogCreator { const string16& /* user_input */)> DialogClosedCallback; - enum TitleType { - DIALOG_TITLE_NONE, - DIALOG_TITLE_PLAIN_STRING, - DIALOG_TITLE_FORMATTED_URL - }; - // Displays a JavaScript dialog. |did_suppress_message| will not be nil; if // |true| is returned in it, the caller will handle faking the reply. virtual void RunJavaScriptDialog( WebContents* web_contents, - TitleType title_type, - const string16& title, + const GURL& origin_url, + const std::string& accept_lang, ui::JavascriptMessageType javascript_message_type, const string16& message_text, const string16& default_prompt_text, @@ -52,7 +49,6 @@ class JavaScriptDialogCreator { // for the given WebContents. virtual void ResetJavaScriptState(WebContents* web_contents) = 0; - protected: virtual ~JavaScriptDialogCreator() {} }; |