Fix a crash when an extension bg page calls alert(). Add regression tests this
time.

BUG=37567

Review URL: http://codereview.chromium.org/1602005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43530 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_apitest_misc.cc b/chrome/browser/extensions/extension_apitest_misc.cc
new file mode 100644
index 0000000..11b91af
--- /dev/null
+++ b/chrome/browser/extensions/extension_apitest_misc.cc
@@ -0,0 +1,27 @@
+// Copyright (c) 2010 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/app_modal_dialog.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/extensions/extension_host.h"
+#include "chrome/browser/extensions/extension_process_manager.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+#include "chrome/browser/profile.h"
+#include "chrome/test/ui_test_utils.h"
+
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, AlertCrash) {
+  ASSERT_TRUE(RunExtensionTest("alert")) << message_;
+
+  Extension* extension = GetSingleLoadedExtension();
+  ExtensionHost* host = browser()->profile()->GetExtensionProcessManager()->
+      GetBackgroundHostForExtension(extension);
+  ASSERT_TRUE(host);
+  host->render_view_host()->ExecuteJavascriptInWebFrame(L"",
+      L"alert('This should not crash.');");
+
+  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
+  ASSERT_TRUE(alert);
+  alert->CloseModalDialog();
+}
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index a9d2259a..eb3a334 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -480,9 +480,12 @@
     return platform_util::GetTopLevel(native_view);
 
   // Otherwise, try the active tab's view.
-  TabContents* active_tab = GetBrowser()->GetSelectedTabContents();
-  if (active_tab)
-    return active_tab->view()->GetTopLevelNativeWindow();
+  Browser* browser = extension_function_dispatcher_->GetCurrentBrowser(true);
+  if (browser) {
+    TabContents* active_tab = browser->GetSelectedTabContents();
+    if (active_tab)
+      return active_tab->view()->GetTopLevelNativeWindow();
+  }
 
   return NULL;
 }
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 7b3f7d9..6c66baa 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1229,6 +1229,7 @@
         'browser/extensions/execute_script_apitest.cc',
         'browser/extensions/extension_apitest.cc',
         'browser/extensions/extension_apitest.h',
+        'browser/extensions/extension_apitest_misc.cc',
         'browser/extensions/extension_bookmarks_apitest.cc',
         'browser/extensions/extension_bookmarks_unittest.cc',
         'browser/extensions/extension_bookmark_manager_apitest.cc',
diff --git a/chrome/test/data/extensions/api_test/alert/manifest.json b/chrome/test/data/extensions/api_test/alert/manifest.json
new file mode 100644
index 0000000..ec22495
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/alert/manifest.json
@@ -0,0 +1,6 @@
+{
+  "name": "background page alert crash",
+  "version": "0.1",
+  "description": "Pops up an alert dialog from the bg page",
+  "background_page": "test.html"
+}
diff --git a/chrome/test/data/extensions/api_test/alert/test.html b/chrome/test/data/extensions/api_test/alert/test.html
new file mode 100644
index 0000000..9041edc
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/alert/test.html
@@ -0,0 +1,8 @@
+<script>
+// Copyright (c) 2010 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.
+
+// Nothing to do. The test harness will handle the rest.
+chrome.test.runTests([]);
+</script>