diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-14 19:35:04 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-14 19:35:04 +0000 |
commit | 4026ce1e61982fe637913ea59c66f16c5d9165ee (patch) | |
tree | fe76ee7ad7ee03c4eae14b8cd7b5a99a8f8097c2 /chrome | |
parent | 2958211007b5f2ac195b38346cbe9b3116792d13 (diff) | |
download | chromium_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.cc | 61 | ||||
-rw-r--r-- | chrome/renderer/extensions/bindings_utils.cc | 5 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 8 |
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. |