summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-14 19:35:04 +0000
committeraa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-14 19:35:04 +0000
commit4026ce1e61982fe637913ea59c66f16c5d9165ee (patch)
treefe76ee7ad7ee03c4eae14b8cd7b5a99a8f8097c2 /chrome
parent2958211007b5f2ac195b38346cbe9b3116792d13 (diff)
downloadchromium_src-4026ce1e61982fe637913ea59c66f16c5d9165ee.zip
chromium_src-4026ce1e61982fe637913ea59c66f16c5d9165ee.tar.gz
chromium_src-4026ce1e61982fe637913ea59c66f16c5d9165ee.tar.bz2
Land implementation part of cl 3352009 (that cl was just data
files that had to be uploaded first for try runs to work). This makes window.open() open a tab or popup window correctly from extensions, even when no user gesture is present. BUG=54768 TEST=Added browser tests. Review URL: http://codereview.chromium.org/3325024 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59418 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/window_open_apitest.cc61
-rw-r--r--chrome/renderer/extensions/bindings_utils.cc5
-rw-r--r--chrome/renderer/render_view.cc8
3 files changed, 74 insertions, 0 deletions
diff --git a/chrome/browser/extensions/window_open_apitest.cc b/chrome/browser/extensions/window_open_apitest.cc
index a0b710b..931a83a 100644
--- a/chrome/browser/extensions/window_open_apitest.cc
+++ b/chrome/browser/extensions/window_open_apitest.cc
@@ -3,8 +3,13 @@
// found in the LICENSE file.
#include "base/command_line.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_list.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/test/ui_test_utils.h"
+#include "net/base/mock_host_resolver.h"
IN_PROC_BROWSER_TEST_F(ExtensionApiTest, FLAKY_WindowOpen) {
CommandLine::ForCurrentProcess()->AppendSwitch(
@@ -15,3 +20,59 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, FLAKY_WindowOpen) {
.AppendASCII("window_open").AppendASCII("spanning")));
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}
+
+void WaitForTabsAndPopups(Browser* browser, int num_tabs, int num_popups) {
+ // We start with one tab and one browser already open.
+ ++num_tabs;
+ size_t num_browsers = static_cast<size_t>(num_popups) + 1;
+
+ while (true) {
+ if (BrowserList::GetBrowserCount(browser->profile()) < num_browsers ||
+ browser->tab_count() < num_tabs) {
+ MessageLoopForUI::current()->RunAllPending();
+ continue;
+ }
+
+ ASSERT_EQ(num_browsers, BrowserList::GetBrowserCount(browser->profile()));
+ ASSERT_EQ(num_tabs, browser->tab_count());
+
+ for (BrowserList::const_iterator iter = BrowserList::begin();
+ iter != BrowserList::end(); ++iter) {
+ if (*iter == browser)
+ continue;
+
+ ASSERT_EQ(Browser::TYPE_POPUP, (*iter)->type());
+ }
+
+ break;
+ }
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PopupBlockingExtension) {
+ host_resolver()->AddRule("*", "127.0.0.1");
+ ASSERT_TRUE(test_server()->Start());
+
+ ASSERT_TRUE(LoadExtension(
+ test_data_dir_.AppendASCII("window_open").AppendASCII("popup_blocking")
+ .AppendASCII("extension")));
+
+ WaitForTabsAndPopups(browser(), 5, 3);
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionApiTest, PopupBlockingHostedApp) {
+ host_resolver()->AddRule("*", "127.0.0.1");
+ ASSERT_TRUE(test_server()->Start());
+
+ ASSERT_TRUE(LoadExtension(
+ test_data_dir_.AppendASCII("window_open").AppendASCII("popup_blocking")
+ .AppendASCII("hosted_app")));
+
+ std::string app_base("http://a.com:1337/files/extensions/api_test/"
+ "window_open/popup_blocking/hosted_app/");
+ browser()->OpenURL(GURL(app_base + "open_tab.html"), GURL(),
+ NEW_FOREGROUND_TAB, PageTransition::TYPED);
+ browser()->OpenURL(GURL(app_base + "open_popup.html"), GURL(),
+ NEW_FOREGROUND_TAB, PageTransition::TYPED);
+
+ WaitForTabsAndPopups(browser(), 3, 1);
+}
diff --git a/chrome/renderer/extensions/bindings_utils.cc b/chrome/renderer/extensions/bindings_utils.cc
index 988068e..d3fdb28 100644
--- a/chrome/renderer/extensions/bindings_utils.cc
+++ b/chrome/renderer/extensions/bindings_utils.cc
@@ -73,6 +73,11 @@ ContextList GetContextsForExtension(const std::string& extension_id) {
}
ContextInfo* GetInfoForCurrentContext() {
+ // This can happen in testing scenarios and v8::Context::GetCurrent() crashes
+ // if there is no JavaScript currently running.
+ if (!v8::Context::InContext())
+ return NULL;
+
v8::Local<v8::Context> context = v8::Context::GetCurrent();
ContextList::iterator context_iter = FindContext(context);
if (context_iter == GetContexts().end())
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index ee3b82e..d68bca1 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -50,6 +50,7 @@
#include "chrome/renderer/devtools_agent.h"
#include "chrome/renderer/devtools_client.h"
#include "chrome/renderer/extension_groups.h"
+#include "chrome/renderer/extensions/bindings_utils.h"
#include "chrome/renderer/extensions/extension_renderer_info.h"
#include "chrome/renderer/extensions/event_bindings.h"
#include "chrome/renderer/extensions/extension_process_bindings.h"
@@ -2284,6 +2285,13 @@ void RenderView::show(WebNavigationPolicy policy) {
return;
did_show_ = true;
+ // Extensions and apps always allowed to create unrequested popups. The second
+ // check is necessary to include content scripts.
+ if (ExtensionRendererInfo::GetByURL(creator_url_) ||
+ bindings_utils::GetInfoForCurrentContext()) {
+ opened_by_user_gesture_ = true;
+ }
+
// Force new windows to a popup if they were not opened with a user gesture.
if (!opened_by_user_gesture_) {
// We exempt background tabs for compat with older versions of Chrome.