Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5768)

Unified Diff: chrome/browser/extensions/api/web_request/web_request_apitest.cc

Issue 2495353003: chrome.webRequest support for ExtensionSettings (Closed)
Patch Set: Policy template translation doesn't like '&', switching to 'and'. Small fix to browser test. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/web_request/web_request_apitest.cc
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 689edf0961772cf262738164502912176a36e5bb..719eb62b2522cc763948e709cf9a8585ea36b36d 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -15,6 +15,7 @@
#include "chrome/browser/extensions/extension_action_runner.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_with_management_policy_apitest.h"
#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/extensions/test_extension_dir.h"
#include "chrome/browser/profiles/profile.h"
@@ -46,6 +47,7 @@
#include "extensions/test/result_catcher.h"
#include "net/dns/mock_host_resolver.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/embedded_test_server/http_request.h"
#include "net/test/test_data_directory.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "net/url_request/test_url_fetcher_factory.h"
@@ -187,10 +189,10 @@ class TestURLFetcherDelegate : public net::URLFetcherDelegate {
} // namespace
-class ExtensionWebRequestApiTest : public ExtensionApiTest {
+class ExtensionWebRequestApiTest : public ExtensionApiTestWithManagementPolicy {
Devlin 2017/05/25 20:38:32 Let's not have all web request API tests inherit f
nrpeter 2017/05/26 02:46:52 Done.
public:
void SetUpInProcessBrowserTestFixture() override {
- ExtensionApiTest::SetUpInProcessBrowserTestFixture();
+ ExtensionApiTestWithManagementPolicy::SetUpInProcessBrowserTestFixture();
host_resolver()->AddRule("*", "127.0.0.1");
}
@@ -954,4 +956,215 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
}
}
+// Test that web requests made by a webpage protected by the
Devlin 2017/05/25 20:38:32 test comments should be descriptive, not imperativ
nrpeter 2017/05/26 02:46:52 Done.
+// runtime_blocked_hosts of the ExtensionsSettings policy are not modifyable.
Devlin 2017/05/25 20:38:32 typo: modifiable
nrpeter 2017/05/26 02:46:52 Done.
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, policyBlockByOrigin) {
Devlin 2017/05/25 20:38:32 Tests should be TitleCase
nrpeter 2017/05/26 02:46:52 Done.
+ // Browse to protected example.com page which uses javascript to
+ // include a script from another domain example2.com. We use the
+ // chrome.webRequest API on the extension's background page to listen for
+ // requests to example2.com. In this first part of the test, we want to
+ // make sure our extension successfully detects requests to example2.com with
+ // the webRequest API. Additionally this tests that this protection only
+ // applies for domains listed in the policy.
+
+ // Host that we navigate to in Chrome.
+ const std::string example_com = "example.com";
+
+ // Domain that hosts javascript file referenced by example_com.
+ const std::string example2_com = "example2.com";
+
+ // URL within the test extension we navigate to to initiate the requests.
+ const std::string extension_test_url =
+ "/extensions/api_test/webrequest/policy_blocked/ref_remote_js.html";
+
+ // Extension communicates back using this listener name.
+ const std::string listener_name = "protected_origin";
+
+ // We expect that no webRequest will be hidden or modification blocked. This
+ // means that the request to example.com will be seen by the extension.
+ {
+ ExtensionManagementPolicyUpdater pref(&policy_provider_);
+ pref.AddRuntimeBlockedHost("*", "*://not_example.com");
Devlin 2017/05/25 20:38:32 Underscores aren't allowed in domain names by the
nrpeter 2017/05/26 02:46:51 Done.
+ }
+ // Set auto confirm UI flag.
+ PermissionsRequestFunction::SetAutoConfirmForTests(true);
Devlin 2017/05/25 20:38:32 Why do we need this?
nrpeter 2017/05/26 02:46:51 Done.
+ PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
+
+ ASSERT_TRUE(StartEmbeddedTestServer());
+
+ LoadExtension(test_data_dir_.AppendASCII("webrequest/policy_blocked"));
+
+ // Listen to verify extension sees the web request.
+ ExtensionTestMessageListener before_request_listener(listener_name, false);
+
+ // Wait until all remote Javascript files have been blocked / pulled down.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(),
+ embedded_test_server()->GetURL(example_com, extension_test_url),
Devlin 2017/05/25 20:38:32 instead of const'ing example.com and the file, we
nrpeter 2017/05/26 02:46:52 Made a const GURL as suggested. However I kept exa
+ WindowOpenDisposition::CURRENT_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // The server saw a request for the remote Javascript file.
+ EXPECT_TRUE(BrowsedTo(example2_com));
+
+ // The webRequest was seen by the extension.
+ EXPECT_TRUE(before_request_listener.was_satisfied());
+
+ // Clear the list of domains the server has seen.
+ ClearRequestLog();
+
+ // Make sure we've cleared the embedded server history.
+ EXPECT_FALSE(BrowsedTo(example2_com));
+
+ // Now lets set the policy to hide webRequests to example.com or any resource
Devlin 2017/05/25 20:38:32 In comments like this, omit words like "let's", "w
nrpeter 2017/05/26 02:46:51 Think I got all of these. If you notice any I miss
+ // it includes. We expect that in this test, the webRequest to example2.com
+ // will not be seen by the extension.
+ {
+ ExtensionManagementPolicyUpdater pref(&policy_provider_);
+ pref.AddRuntimeBlockedHost("*", "*://" + example_com);
+ }
+
+ // Listen in case extension sees the web requst.
+ ExtensionTestMessageListener before_request_listener2(listener_name, false);
+
+ // Wait until all remote Javascript files have been pulled down.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(),
+ embedded_test_server()->GetURL(example_com, extension_test_url),
+ WindowOpenDisposition::CURRENT_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // The server saw a request for the remote Javascript file.
+ EXPECT_TRUE(BrowsedTo(example2_com));
+
+ // The webRequest was hidden from the extension.
+ EXPECT_FALSE(before_request_listener2.was_satisfied());
+}
+
+// Test that web requests made to a resource protected by the
+// runtime_blocked_hosts of the ExtensionsSettings policy are not visible.
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, policyBlockByUrl) {
+ // We'll set policy to block webRequest events for example.com domains. Then
+ // navigate to example.com and make sure our extension doesn't see the event.
+ // We then navigate to a website not protected by policy and make sure that
+ // our extension can see the event.
+
+ // Set example.com as protected using runtime_blocked_hosts from the
+ // ExtensionSettings policy.
+ {
+ ExtensionManagementPolicyUpdater pref(&policy_provider_);
+ pref.AddRuntimeBlockedHost("*", "*://example.com");
+ }
+
+ // Set auto confirm UI flag.
+ PermissionsRequestFunction::SetAutoConfirmForTests(true);
+ PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
+
+ ASSERT_TRUE(StartEmbeddedTestServer());
+
+ LoadExtension(test_data_dir_.AppendASCII("webrequest/policy_blocked"));
+
+ // Listen in case extension sees the web requst.
+ ExtensionTestMessageListener before_request_listener("protected_url", false);
+
+ // Navigate to the protected domain and wait until page fully loads.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(),
+ embedded_test_server()->GetURL(
+ "example.com",
+ "/extensions/api_test/webrequest/policy_blocked/protected_url.html"),
+ WindowOpenDisposition::CURRENT_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // The server saw a request for the protected site.
+ EXPECT_TRUE(BrowsedTo("example.com"));
+
+ // The webRequest was hidden from the extension.
+ EXPECT_FALSE(before_request_listener.was_satisfied());
+
+ // Now we'll test browsing to a non-protected website where we expect the
+ // extension to see the webrequest event.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(),
+ embedded_test_server()->GetURL(
+ "not_blocked_example.com",
+ "/extensions/api_test/webrequest/policy_blocked/protected_url.html"),
+ WindowOpenDisposition::CURRENT_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // The server saw a request for the non-protected site.
+ EXPECT_TRUE(BrowsedTo("not_blocked_example.com"));
+
+ // The webRequest was visible from the extension.
+ EXPECT_TRUE(before_request_listener.was_satisfied());
+}
+
+// Test that no webRequest events are seen for a protected host during normal
+// navigation. This replicates most of the tests from
+// WebRequestWithWithheldPermissions with a protected host. Granting a tab
+// specific permission shouldn't bypass our policy.
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
+ WebRequestProtectedByPolicy) {
+ FeatureSwitch::ScopedOverride enable_scripts_require_action(
+ FeatureSwitch::scripts_require_action(), true);
+ {
+ ExtensionManagementPolicyUpdater pref(&policy_provider_);
+ pref.AddRuntimeBlockedHost("*", "*://example.com");
+ }
+ extensions::PermissionsRequestFunction::SetIgnoreUserGestureForTests(true);
+ extensions::PermissionsRequestFunction::SetAutoConfirmForTests(true);
+ ASSERT_TRUE(StartEmbeddedTestServer());
+
+ ExtensionTestMessageListener listener("ready", false);
+ const Extension* extension =
+ LoadExtension(test_data_dir_.AppendASCII("webrequest_activetab"));
+ ASSERT_TRUE(extension) << message_;
+ EXPECT_TRUE(listener.WaitUntilSatisfied());
+
+ // Navigate the browser to a page in a new tab.
+ const std::string kHost = "example.com";
+ GURL url = embedded_test_server()->GetURL(kHost, "/empty.html");
+ chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
+ params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+ ui_test_utils::NavigateToURL(&params);
+
+ content::WebContents* web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ ASSERT_TRUE(web_contents);
+ ExtensionActionRunner* runner =
+ ExtensionActionRunner::GetForWebContents(web_contents);
+ ASSERT_TRUE(runner);
+
+ int port = embedded_test_server()->port();
+ const std::string kXhrPath = "simple.html";
+
+ // The extension shouldn't have currently received any webRequest events,
+ // since it doesn't have permission (and shouldn't receive any from an XHR).
+ EXPECT_EQ(0, GetWebRequestCountFromBackgroundPage(extension, profile()));
+ PerformXhrInFrame(web_contents->GetMainFrame(), kHost, port, kXhrPath);
+ EXPECT_EQ(0, GetWebRequestCountFromBackgroundPage(extension, profile()));
+
+ // Grant activeTab permission, and perform another XHR. The extension should
+ // still be blocked due to ExtensionSettings policy on example.com.
+ // Only records ACCESS_WITHHELD, not ACCESS_DENIED, this is why we match
+ // BLOCKED_ACTION_NONE.
+ EXPECT_EQ(BLOCKED_ACTION_NONE, runner->GetBlockedActions(extension));
+ runner->set_default_bubble_close_action_for_testing(
+ base::WrapUnique(new ToolbarActionsBarBubbleDelegate::CloseAction(
+ ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE)));
+ runner->RunAction(extension, true);
+ base::RunLoop().RunUntilIdle();
+ EXPECT_TRUE(content::WaitForLoadStop(web_contents));
+ // The runner will have refreshed the page...
+ EXPECT_EQ(BLOCKED_ACTION_NONE, runner->GetBlockedActions(extension));
+ int xhr_count = GetWebRequestCountFromBackgroundPage(extension, profile());
+ // ... which means that we should have a non-zero xhr count if the policy
+ // didn't block the events.
+ EXPECT_EQ(xhr_count, 0);
+ // And the extension should also block future events.
+ PerformXhrInFrame(web_contents->GetMainFrame(), kHost, port, kXhrPath);
+ EXPECT_EQ(xhr_count,
+ GetWebRequestCountFromBackgroundPage(extension, profile()));
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698