summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryumiOS.art@gmail.com <yumiOS.art@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-29 22:56:43 +0000
committeryumiOS.art@gmail.com <yumiOS.art@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-29 22:56:43 +0000
commit55df9099f9350d906d7b03a4390687ac95269210 (patch)
treebc1282df838f668fa9323b11e6b39ea14986ed02
parentff10b13ea905ed7f9813f62ab95fa7fef3cc7390 (diff)
downloadchromium_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--AUTHORS1
-rw-r--r--chrome/browser/extensions/extension_host.cc5
-rw-r--r--chrome/browser/extensions/extension_host.h5
-rw-r--r--chrome/browser/ui/app_modal_dialogs/message_box_handler.cc84
-rw-r--r--chrome/browser/ui/app_modal_dialogs/message_box_handler.h11
-rw-r--r--content/browser/tab_contents/tab_contents.cc23
-rw-r--r--content/public/browser/javascript_dialogs.h14
7 files changed, 89 insertions, 54 deletions
diff --git a/AUTHORS b/AUTHORS
index a9b734a..3b745f8 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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() {}
};