Implement window.alert() and its cousins for extensions.
Second try, now with fixed observer.
BUG=12126
TEST=put a window.prompt() in a background page, a browser action, and a page action.
Make sure it gets the result back correctly. Also make sure it still works when
called from a web page.
Review URL: http://codereview.chromium.org/373006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31204 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 35e9b80..00fd58b3 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/tab_contents/tab_contents.h"
+#include "app/gfx/text_elider.h"
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
#include "base/file_version_info.h"
@@ -1114,21 +1115,6 @@
render_view_host()->GetPageLanguage();
}
-void TabContents::OnJavaScriptMessageBoxClosed(IPC::Message* reply_msg,
- bool success,
- const std::wstring& prompt) {
- last_javascript_message_dismissal_ = base::TimeTicks::Now();
- if (is_showing_before_unload_dialog_ && !success) {
- // If a beforeunload dialog is canceled, we need to stop the throbber from
- // spinning, since we forced it to start spinning in Navigate.
- DidStopLoading();
-
- tab_close_start_time_ = base::TimeTicks();
- }
- is_showing_before_unload_dialog_ = false;
- render_view_host()->JavaScriptMessageBoxClosed(reply_msg, success, prompt);
-}
-
void TabContents::OnSavePage() {
// If we can not save the page, try to download it.
if (!SavePackage::IsSavableContents(contents_mime_type())) {
@@ -2348,7 +2334,7 @@
} else {
// If we are suppressing messages, just reply as is if the user immediately
// pressed "Cancel".
- OnJavaScriptMessageBoxClosed(reply_msg, false, std::wstring());
+ OnMessageBoxClosed(reply_msg, false, std::wstring());
}
}
@@ -2663,6 +2649,58 @@
}
}
+std::wstring TabContents::GetMessageBoxTitle(const GURL& frame_url,
+ bool is_alert) {
+ if (!frame_url.has_host())
+ return l10n_util::GetString(
+ is_alert ? IDS_JAVASCRIPT_ALERT_DEFAULT_TITLE
+ : IDS_JAVASCRIPT_MESSAGEBOX_DEFAULT_TITLE);
+
+ // We really only want the scheme, hostname, and port.
+ GURL::Replacements replacements;
+ replacements.ClearUsername();
+ replacements.ClearPassword();
+ replacements.ClearPath();
+ replacements.ClearQuery();
+ replacements.ClearRef();
+ GURL clean_url = frame_url.ReplaceComponents(replacements);
+
+ // TODO(brettw) it should be easier than this to do the correct language
+ // handling without getting the accept language from the profile.
+ std::wstring base_address = gfx::ElideUrl(clean_url, gfx::Font(), 0,
+ profile()->GetPrefs()->GetString(prefs::kAcceptLanguages));
+ // Force URL to have LTR directionality.
+ if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT)
+ l10n_util::WrapStringWithLTRFormatting(&base_address);
+
+ return l10n_util::GetStringF(
+ is_alert ? IDS_JAVASCRIPT_ALERT_TITLE : IDS_JAVASCRIPT_MESSAGEBOX_TITLE,
+ base_address);
+}
+
+gfx::NativeWindow TabContents::GetMessageBoxRootWindow() {
+ return view_->GetTopLevelNativeWindow();
+}
+
+void TabContents::OnMessageBoxClosed(IPC::Message* reply_msg,
+ bool success,
+ const std::wstring& prompt) {
+ last_javascript_message_dismissal_ = base::TimeTicks::Now();
+ if (is_showing_before_unload_dialog_ && !success) {
+ // If a beforeunload dialog is canceled, we need to stop the throbber from
+ // spinning, since we forced it to start spinning in Navigate.
+ DidStopLoading();
+
+ tab_close_start_time_ = base::TimeTicks();
+ }
+ is_showing_before_unload_dialog_ = false;
+ render_view_host()->JavaScriptMessageBoxClosed(reply_msg, success, prompt);
+}
+
+void TabContents::SetSuppressMessageBoxes(bool suppress_message_boxes) {
+ set_suppress_javascript_messages(suppress_message_boxes);
+}
+
void TabContents::set_encoding(const std::string& encoding) {
encoding_ = CharacterEncoding::GetCanonicalEncodingNameByAliasName(encoding);
}