diff options
Diffstat (limited to 'chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc')
-rw-r--r-- | chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc index e704227958c..7ebbb0567b3 100644 --- a/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc +++ b/chromium/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc @@ -2798,6 +2798,110 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, EXPECT_EQ(first_tab_badge_text, action->GetDisplayBadgeText(first_tab_id)); } +// Ensure web request events are still dispatched even if DNR blocks/redirects +// the request. (Regression test for crbug.com/999744). +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, WebRequestEvents) { + // Load the extension with a background script so scripts can be run from its + // generated background page. + set_has_background_script(true); + + TestRule rule = CreateGenericRule(); + rule.condition->url_filter = "||example.com"; + rule.condition->resource_types = std::vector<std::string>({"main_frame"}); + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules( + {rule}, "test_extension", {URLPattern::kAllUrlsPattern})); + + GURL url = embedded_test_server()->GetURL("example.com", + "/pages_with_script/index.html"); + + // Set up web request listeners listening to request to |url|. + const char kWebRequestListenerScript[] = R"( + let filter = {'urls' : ['%s'], 'types' : ['main_frame']}; + + let onBeforeRequestSeen = false; + chrome.webRequest.onBeforeRequest.addListener(() => { + onBeforeRequestSeen = true; + }, filter); + + // The request will fail since it will be blocked by DNR. + chrome.webRequest.onErrorOccurred.addListener(() => { + if (onBeforeRequestSeen) + chrome.test.sendMessage('PASS'); + }, filter); + + chrome.test.sendMessage('INSTALLED'); + )"; + + ExtensionTestMessageListener pass_listener("PASS", false /* will_reply */); + ExtensionTestMessageListener installed_listener("INSTALLED", + false /* will_reply */); + ExecuteScriptInBackgroundPageNoWait( + last_loaded_extension_id(), + base::StringPrintf(kWebRequestListenerScript, url.spec().c_str())); + + // Wait for the web request listeners to be installed before navigating. + ASSERT_TRUE(installed_listener.WaitUntilSatisfied()); + + ui_test_utils::NavigateToURL(browser(), url); + + ASSERT_FALSE(WasFrameWithScriptLoaded(GetMainFrame())); + EXPECT_TRUE(pass_listener.WaitUntilSatisfied()); +} + +// Ensure Declarative Net Request gets priority over the web request API. +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, WebRequestPriority) { + // Load the extension with a background script so scripts can be run from its + // generated background page. + set_has_background_script(true); + + GURL url = embedded_test_server()->GetURL("example.com", + "/pages_with_script/index.html"); + GURL redirect_url = embedded_test_server()->GetURL( + "redirect.com", "/pages_with_script/index.html"); + + TestRule example_com_redirect_rule = CreateGenericRule(); + example_com_redirect_rule.condition->url_filter = "||example.com"; + example_com_redirect_rule.condition->resource_types = + std::vector<std::string>({"main_frame"}); + example_com_redirect_rule.action->type = std::string("redirect"); + example_com_redirect_rule.action->redirect.emplace(); + example_com_redirect_rule.action->redirect->url = redirect_url.spec(); + example_com_redirect_rule.priority = kMinValidPriority; + + ASSERT_NO_FATAL_FAILURE( + LoadExtensionWithRules({example_com_redirect_rule}, "test_extension", + {URLPattern::kAllUrlsPattern})); + + // Set up a web request listener to block the request to example.com. + const char kWebRequestBlockScript[] = R"( + let filter = {'urls' : ['%s'], 'types' : ['main_frame']}; + chrome.webRequest.onBeforeRequest.addListener((details) => { + chrome.test.sendMessage('SEEN') + }, filter, ['blocking']); + chrome.test.sendMessage('INSTALLED'); + )"; + + ExtensionTestMessageListener seen_listener("SEEN", false /* will_reply */); + ExtensionTestMessageListener installed_listener("INSTALLED", + false /* will_reply */); + ExecuteScriptInBackgroundPageNoWait( + last_loaded_extension_id(), + base::StringPrintf(kWebRequestBlockScript, url.spec().c_str())); + + // Wait for the web request listeners to be installed before navigating. + ASSERT_TRUE(installed_listener.WaitUntilSatisfied()); + + ui_test_utils::NavigateToURL(browser(), url); + + // Ensure the response from the web request listener was ignored and the + // request was redirected. + ASSERT_TRUE(WasFrameWithScriptLoaded(GetMainFrame())); + EXPECT_EQ(web_contents()->GetLastCommittedURL(), redirect_url); + + // Ensure onBeforeRequest is seen by the web request extension. + EXPECT_TRUE(seen_listener.WaitUntilSatisfied()); +} + // Test that the extension cannot retrieve the number of actions matched // from the badge text by calling chrome.browserAction.getBadgeText. IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, @@ -3046,6 +3150,116 @@ IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, } } +// Test that the badge text for extensions will update correctly for +// removeHeader rules. +IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestBrowserTest, + RemoveHeadersBadgeText) { + auto referer_url = embedded_test_server()->GetURL( + "example.com", "/set-header?referer: none"); + auto set_cookie_url = + embedded_test_server()->GetURL("example.com", "/set-cookie?a=b"); + + // Navigates frame with name |frame_name| to |url|. + auto navigate_frame = [this](const std::string& frame_name, const GURL& url, + bool use_frame_referrer) { + content::TestNavigationObserver navigation_observer( + web_contents(), 1 /*number_of_navigations*/); + + const char* referrer_policy = use_frame_referrer ? "origin" : "no-referrer"; + + ASSERT_TRUE(content::ExecuteScript( + GetMainFrame(), + base::StringPrintf(R"( + document.getElementsByName('%s')[0].referrerPolicy = '%s'; + document.getElementsByName('%s')[0].src = '%s';)", + frame_name.c_str(), referrer_policy, + frame_name.c_str(), url.spec().c_str()))); + navigation_observer.Wait(); + }; + + const std::string kFrameName1 = "frame1"; + const GURL page_url = embedded_test_server()->GetURL( + "nomatch.com", "/page_with_two_frames.html"); + + // Create an extension with a rule to remove the Set-Cookie header, and get + // the ExtensionAction for it. + TestRule rule1 = CreateGenericRule(); + rule1.id = kMinValidID; + rule1.condition->url_filter = "example.com"; + rule1.condition->resource_types = std::vector<std::string>({"sub_frame"}); + rule1.action->type = "removeHeaders"; + rule1.action->remove_headers_list = std::vector<std::string>({"setCookie"}); + + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule1}, "extension_1", {})); + + const ExtensionId remove_set_cookie_ext_id = last_loaded_extension_id(); + ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText( + remove_set_cookie_ext_id, true); + + ExtensionAction* remove_set_cookie_action = + ExtensionActionManager::Get(web_contents()->GetBrowserContext()) + ->GetExtensionAction(*extension_registry()->GetExtensionById( + remove_set_cookie_ext_id, + extensions::ExtensionRegistry::ENABLED)); + + // Create an extension with a rule to remove the referer header, and get the + // ExtensionAction for it. + TestRule rule2 = CreateGenericRule(); + rule2.id = kMinValidID; + rule2.condition->url_filter = "example.com"; + rule2.condition->resource_types = std::vector<std::string>({"sub_frame"}); + rule2.action->type = "removeHeaders"; + rule2.action->remove_headers_list = std::vector<std::string>({"referer"}); + + ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules({rule2}, "extension_2", {})); + + const ExtensionId remove_referer_ext_id = last_loaded_extension_id(); + ExtensionPrefs::Get(profile())->SetDNRUseActionCountAsBadgeText( + remove_referer_ext_id, true); + + ExtensionAction* remove_referer_action = + ExtensionActionManager::Get(web_contents()->GetBrowserContext()) + ->GetExtensionAction(*extension_registry()->GetExtensionById( + remove_referer_ext_id, extensions::ExtensionRegistry::ENABLED)); + + struct { + GURL url; + bool use_referrer; + std::string expected_remove_referer_badge_text; + std::string expected_remove_set_cookie_badge_text; + } test_cases[] = { + // This request only has a Set-Cookie header. Only the badge text for the + // extension with a remove Set-Cookie header rule should be incremented. + {set_cookie_url, false, "0", "1"}, + // This request only has a Referer header. Only the badge text for the + // extension with a remove Referer header rule should be incremented. + {referer_url, true, "1", "1"}, + // This request has both a Referer and a Set-Cookie header. The badge text + // for both extensions should be incremented. + {set_cookie_url, true, "2", "2"}, + }; + + ui_test_utils::NavigateToURL(browser(), page_url); + ASSERT_TRUE(WasFrameWithScriptLoaded(GetMainFrame())); + + int first_tab_id = ExtensionTabUtil::GetTabId(web_contents()); + EXPECT_EQ("0", remove_set_cookie_action->GetDisplayBadgeText(first_tab_id)); + EXPECT_EQ("0", remove_referer_action->GetDisplayBadgeText(first_tab_id)); + + for (const auto& test_case : test_cases) { + SCOPED_TRACE(base::StringPrintf("Testing URL: %s, using referrer: %s", + test_case.url.spec().c_str(), + test_case.use_referrer ? "true" : "false")); + + navigate_frame(kFrameName1, test_case.url, test_case.use_referrer); + EXPECT_EQ(test_case.expected_remove_set_cookie_badge_text, + remove_set_cookie_action->GetDisplayBadgeText(first_tab_id)); + + EXPECT_EQ(test_case.expected_remove_referer_badge_text, + remove_referer_action->GetDisplayBadgeText(first_tab_id)); + } +} + // Test fixture to verify that host permissions for the request url and the // request initiator are properly checked when redirecting requests. Loads an // example.com url with four sub-frames named frame_[1..4] from hosts |