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);
 }