Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(513)

Unified Diff: chrome/browser/ui/app_modal_dialogs/message_box_handler.cc

Issue 7096016: Remove JS dialog dependency from content. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: now a tc delegate Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/app_modal_dialogs/message_box_handler.cc
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 0de1b9affe486e3553e362b774908d0b68a51f4f..c4ae7b5078c5e31c400ebffd4d59bd665d6bc5f1 100644
--- a/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc
+++ b/chrome/browser/ui/app_modal_dialogs/message_box_handler.cc
@@ -1,20 +1,23 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 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.
#include "chrome/browser/ui/app_modal_dialogs/message_box_handler.h"
-#include "base/i18n/rtl.h"
+#include <map>
+
+#include "base/compiler_specific.h"
+#include "base/memory/singleton.h"
+#include "base/time.h"
#include "base/utf_string_conversions.h"
-#include "build/build_config.h"
+#include "base/i18n/rtl.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.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 "chrome/common/pref_names.h"
-#include "chrome/common/url_constants.h"
-#include "content/browser/tab_contents/tab_contents.h"
-#include "googleurl/src/gurl.h"
+#include "content/browser/javascript_dialogs.h"
#include "grit/generated_resources.h"
#include "grit/chromium_strings.h"
#include "ui/base/l10n/l10n_util.h"
@@ -22,9 +25,132 @@
#include "ui/base/text/text_elider.h"
#include "ui/gfx/font.h"
-static std::wstring GetTitle(Profile* profile,
- bool is_alert,
- const GURL& frame_url) {
+class JavaScriptDialogCreatorImpl : public content::JavaScriptDialogCreator {
jam 2011/06/03 00:21:45 nit: ChromeJavaScriptDialogCreator for consistency
+ public:
+ static JavaScriptDialogCreatorImpl* GetInstance();
jam 2011/06/03 00:21:45 nit: if you're going to have the class in the cc f
+
+ virtual void RunJavaScriptDialog(content::JavaScriptDialogDelegate* delegate,
+ const GURL& frame_url,
+ int dialog_flags,
+ const string16& message_text,
+ const string16& default_prompt_text,
+ IPC::Message* reply_message,
+ bool* did_suppress_message,
+ Profile* profile) OVERRIDE;
+
+ virtual void RunBeforeUnloadDialog(
+ content::JavaScriptDialogDelegate* delegate,
+ const string16& message_text,
+ IPC::Message* reply_message) OVERRIDE;
+
+ virtual void ResetJavaScriptState(
+ content::JavaScriptDialogDelegate* delegate) OVERRIDE;
+
+ private:
+ explicit JavaScriptDialogCreatorImpl();
+ virtual ~JavaScriptDialogCreatorImpl();
+
+ friend struct DefaultSingletonTraits<JavaScriptDialogCreatorImpl>;
+
+ string16 GetTitle(Profile* profile,
+ bool is_alert,
+ const GURL& frame_url);
+
+ // Mapping between the JavaScriptDialogDelegates and their extra data. The key
+ // is a void* because the pointer is just a cookie and is never dereferenced.
+ typedef std::map<void*, ChromeJavaScriptDialogExtraData>
+ JavaScriptDialogExtraDataMap;
+ JavaScriptDialogExtraDataMap javascript_dialog_extra_data_;
+};
+
+//------------------------------------------------------------------------------
+
+JavaScriptDialogCreatorImpl::JavaScriptDialogCreatorImpl() {
+}
+
+JavaScriptDialogCreatorImpl::~JavaScriptDialogCreatorImpl() {
+}
+
+/* static */
+JavaScriptDialogCreatorImpl* JavaScriptDialogCreatorImpl::GetInstance() {
+ return Singleton<JavaScriptDialogCreatorImpl>::get();
+}
+
+void JavaScriptDialogCreatorImpl::RunJavaScriptDialog(
+ content::JavaScriptDialogDelegate* delegate,
+ const GURL& frame_url,
+ int dialog_flags,
+ const string16& message_text,
+ const string16& default_prompt_text,
+ IPC::Message* reply_message,
+ bool* did_suppress_message,
+ Profile* profile) {
+ *did_suppress_message = false;
+
+ ChromeJavaScriptDialogExtraData* extra_data =
+ &javascript_dialog_extra_data_[delegate];
+
+ if (extra_data->suppress_javascript_messages_) {
+ *did_suppress_message = true;
+ return;
+ }
+
+ base::TimeDelta time_since_last_message = base::TimeTicks::Now() -
+ extra_data->last_javascript_message_dismissal_;
+ bool display_suppress_checkbox = false;
+ // Show a checkbox offering to suppress further messages if this message is
+ // being displayed within kJavascriptMessageExpectedDelay of the last one.
+ if (time_since_last_message <
+ base::TimeDelta::FromMilliseconds(
+ chrome::kJavascriptMessageExpectedDelay)) {
+ display_suppress_checkbox = true;
+ }
+
+ bool is_alert = dialog_flags == ui::MessageBoxFlags::kIsJavascriptAlert;
+ string16 title = GetTitle(profile, is_alert, frame_url);
+
+ AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog(
+ delegate,
+ extra_data,
+ title,
+ dialog_flags,
+ message_text,
+ default_prompt_text,
+ display_suppress_checkbox,
+ false, // is_before_unload_dialog
+ reply_message));
+}
+
+void JavaScriptDialogCreatorImpl::RunBeforeUnloadDialog(
+ content::JavaScriptDialogDelegate* delegate,
+ const string16& message_text,
+ IPC::Message* reply_message) {
+ ChromeJavaScriptDialogExtraData* extra_data =
+ &javascript_dialog_extra_data_[delegate];
+
+ string16 full_message = message_text + ASCIIToUTF16("\n\n") +
+ l10n_util::GetStringUTF16(IDS_BEFOREUNLOAD_MESSAGEBOX_FOOTER);
+
+ AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog(
+ delegate,
+ extra_data,
+ l10n_util::GetStringUTF16(IDS_BEFOREUNLOAD_MESSAGEBOX_TITLE),
+ ui::MessageBoxFlags::kIsJavascriptConfirm,
+ full_message,
+ string16(), // default_prompt_text
+ false, // display_suppress_checkbox
+ true, // is_before_unload_dialog
+ reply_message));
+}
+
+void JavaScriptDialogCreatorImpl::ResetJavaScriptState(
+ content::JavaScriptDialogDelegate* delegate) {
+ javascript_dialog_extra_data_.erase(delegate);
+}
+
+string16 JavaScriptDialogCreatorImpl::GetTitle(Profile* profile,
+ bool is_alert,
+ const GURL& frame_url) {
ExtensionService* extensions_service = profile->GetExtensionService();
if (extensions_service) {
const Extension* extension =
@@ -33,15 +159,15 @@ static std::wstring GetTitle(Profile* profile,
extension = extensions_service->GetExtensionByWebExtent(frame_url);
if (extension && (extension->location() == Extension::COMPONENT)) {
- return UTF16ToWideHack(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
+ return l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
} else if (extension && !extension->name().empty()) {
- return UTF8ToWide(extension->name());
+ return UTF8ToUTF16(extension->name());
}
}
if (!frame_url.has_host()) {
- return UTF16ToWideHack(l10n_util::GetStringUTF16(
+ return l10n_util::GetStringUTF16(
is_alert ? IDS_JAVASCRIPT_ALERT_DEFAULT_TITLE
- : IDS_JAVASCRIPT_MESSAGEBOX_DEFAULT_TITLE));
+ : IDS_JAVASCRIPT_MESSAGEBOX_DEFAULT_TITLE);
}
// TODO(brettw) it should be easier than this to do the correct language
@@ -53,40 +179,14 @@ static std::wstring GetTitle(Profile* profile,
base_address = base::i18n::GetDisplayStringInLTRDirectionality(
base_address);
- return UTF16ToWide(l10n_util::GetStringFUTF16(
+ return l10n_util::GetStringFUTF16(
is_alert ? IDS_JAVASCRIPT_ALERT_TITLE :
IDS_JAVASCRIPT_MESSAGEBOX_TITLE,
- base_address));
+ base_address);
}
-void RunJavascriptMessageBox(Profile* profile,
- JavaScriptAppModalDialogDelegate* delegate,
- const GURL& frame_url,
- int dialog_flags,
- const std::wstring& message_text,
- const std::wstring& default_prompt_text,
- bool display_suppress_checkbox,
- IPC::Message* reply_msg) {
- bool is_alert = dialog_flags == ui::MessageBoxFlags::kIsJavascriptAlert;
- std::wstring title = GetTitle(profile, is_alert, frame_url);
- AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog(
- delegate, title, dialog_flags, message_text, default_prompt_text,
- display_suppress_checkbox, false, reply_msg));
-}
+//------------------------------------------------------------------------------
-void RunBeforeUnloadDialog(TabContents* tab_contents,
- const std::wstring& message_text,
- IPC::Message* reply_msg) {
- std::wstring full_message = message_text + L"\n\n" + UTF16ToWideHack(
- l10n_util::GetStringUTF16(IDS_BEFOREUNLOAD_MESSAGEBOX_FOOTER));
- AppModalDialogQueue::GetInstance()->AddDialog(new JavaScriptAppModalDialog(
- tab_contents,
- UTF16ToWideHack(
- l10n_util::GetStringUTF16(IDS_BEFOREUNLOAD_MESSAGEBOX_TITLE)),
- ui::MessageBoxFlags::kIsJavascriptConfirm,
- message_text,
- std::wstring(),
- false,
- true,
- reply_msg));
+content::JavaScriptDialogCreator* GetJavaScriptDialogCreatorInstance() {
+ return JavaScriptDialogCreatorImpl::GetInstance();
}

Powered by Google App Engine
This is Rietveld 408576698