// Copyright (c) 2012 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 "base/command_line.h" #include "chrome/browser/extensions/api/webrequest/webrequest_api.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/login/login_prompt.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/ui_test_utils.h" #include "content/browser/renderer_host/render_view_host.h" #include "content/public/browser/notification_registrar.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/web_contents.h" #include "net/base/mock_host_resolver.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" using content::WebContents; namespace { class CancelLoginDialog : public content::NotificationObserver { public: CancelLoginDialog() { registrar_.Add(this, chrome::NOTIFICATION_AUTH_NEEDED, content::NotificationService::AllSources()); } virtual ~CancelLoginDialog() {} virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) { LoginHandler* handler = content::Details(details).ptr()->handler(); handler->CancelAuth(); } private: content::NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(CancelLoginDialog); }; } // namespace class ExtensionWebRequestApiTest : public ExtensionApiTest { public: virtual void SetUpInProcessBrowserTestFixture() { ExtensionApiTest::SetUpInProcessBrowserTestFixture(); host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(StartTestServer()); } }; IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestApi) { ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_api.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestSimple) { ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_simple.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestComplex) { ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_complex.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestAuthRequired) { CancelLoginDialog login_dialog_helper; ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_auth_required.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestBlocking) { ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_blocking.html")) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestNewTab) { // Wait for the extension to set itself up and return control to us. ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_newTab.html")) << message_; WebContents* tab = browser()->GetSelectedWebContents(); ui_test_utils::WaitForLoadStop(tab); ResultCatcher catcher; ExtensionService* service = browser()->profile()->GetExtensionService(); const Extension* extension = service->GetExtensionById(last_loaded_extension_id_, false); GURL url = extension->GetResourceURL("newTab/a.html"); ui_test_utils::NavigateToURL(browser(), url); // There's a link on a.html with target=_blank. Click on it to open it in a // new tab. WebKit::WebMouseEvent mouse_event; mouse_event.type = WebKit::WebInputEvent::MouseDown; mouse_event.button = WebKit::WebMouseEvent::ButtonLeft; mouse_event.x = 7; mouse_event.y = 7; mouse_event.clickCount = 1; tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); mouse_event.type = WebKit::WebInputEvent::MouseUp; tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event); ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); }