diff options
Diffstat (limited to 'chromium/chrome/browser/extensions/api/web_request')
-rw-r--r-- | chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc | 123 | ||||
-rw-r--r-- | chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc | 96 |
2 files changed, 151 insertions, 68 deletions
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc index 2e416ee7641..98f99625b2f 100644 --- a/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc @@ -51,6 +51,7 @@ #include "extensions/common/features/feature.h" #include "google_apis/gaia/gaia_urls.h" #include "net/http/http_util.h" +#include "services/network/public/cpp/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest-message.h" #include "testing/gtest/include/gtest/gtest.h" @@ -87,7 +88,7 @@ using helpers::ResponseHeader; using helpers::ResponseHeaders; using helpers::StringToCharList; using testing::ElementsAre; -using Action = extensions::declarative_net_request::RulesetManager::Action; +using DNRRequestAction = extensions::declarative_net_request::RequestAction; namespace extensions { @@ -171,14 +172,16 @@ namespace { // Create the numerical representation of |values|, strings passed as // extraInfoSpec by the event handler. Returns true on success, otherwise false. -bool GenerateInfoSpec(const std::string& values, int* result) { +bool GenerateInfoSpec(content::BrowserContext* browser_context, + const std::string& values, + int* result) { // Create a base::ListValue of strings. base::ListValue list_value; for (const std::string& cur : base::SplitString(values, ",", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) list_value.AppendString(cur); - return ExtraInfoSpec::InitFromValue(list_value, result); + return ExtraInfoSpec::InitFromValue(browser_context, list_value, result); } } // namespace @@ -230,10 +233,13 @@ TEST_F(ExtensionWebRequestTest, AddAndRemoveListeners) { namespace { -void TestInitFromValue(const std::string& values, bool expected_return_code, +void TestInitFromValue(content::BrowserContext* browser_context, + const std::string& values, + bool expected_return_code, int expected_extra_info_spec) { int actual_info_spec; - bool actual_return_code = GenerateInfoSpec(values, &actual_info_spec); + bool actual_return_code = + GenerateInfoSpec(browser_context, values, &actual_info_spec); EXPECT_EQ(expected_return_code, actual_return_code); if (expected_return_code) EXPECT_EQ(expected_extra_info_spec, actual_info_spec); @@ -242,43 +248,30 @@ void TestInitFromValue(const std::string& values, bool expected_return_code, } // namespace TEST_F(ExtensionWebRequestTest, InitFromValue) { - TestInitFromValue(std::string(), true, 0); + TestInitFromValue(&profile_, std::string(), true, 0); // Single valid values. - TestInitFromValue( - "requestHeaders", - true, - ExtraInfoSpec::REQUEST_HEADERS); - TestInitFromValue( - "responseHeaders", - true, - ExtraInfoSpec::RESPONSE_HEADERS); - TestInitFromValue( - "blocking", - true, - ExtraInfoSpec::BLOCKING); - TestInitFromValue( - "asyncBlocking", - true, - ExtraInfoSpec::ASYNC_BLOCKING); - TestInitFromValue( - "requestBody", - true, - ExtraInfoSpec::REQUEST_BODY); + TestInitFromValue(&profile_, "requestHeaders", true, + ExtraInfoSpec::REQUEST_HEADERS); + TestInitFromValue(&profile_, "responseHeaders", true, + ExtraInfoSpec::RESPONSE_HEADERS); + TestInitFromValue(&profile_, "blocking", true, ExtraInfoSpec::BLOCKING); + TestInitFromValue(&profile_, "asyncBlocking", true, + ExtraInfoSpec::ASYNC_BLOCKING); + TestInitFromValue(&profile_, "requestBody", true, + ExtraInfoSpec::REQUEST_BODY); // Multiple valid values are bitwise-or'ed. - TestInitFromValue( - "requestHeaders,blocking", - true, - ExtraInfoSpec::REQUEST_HEADERS | ExtraInfoSpec::BLOCKING); + TestInitFromValue(&profile_, "requestHeaders,blocking", true, + ExtraInfoSpec::REQUEST_HEADERS | ExtraInfoSpec::BLOCKING); // Any invalid values lead to a bad parse. - TestInitFromValue("invalidValue", false, 0); - TestInitFromValue("blocking,invalidValue", false, 0); - TestInitFromValue("invalidValue1,invalidValue2", false, 0); + TestInitFromValue(&profile_, "invalidValue", false, 0); + TestInitFromValue(&profile_, "blocking,invalidValue", false, 0); + TestInitFromValue(&profile_, "invalidValue1,invalidValue2", false, 0); // BLOCKING and ASYNC_BLOCKING are mutually exclusive. - TestInitFromValue("blocking,asyncBlocking", false, 0); + TestInitFromValue(&profile_, "blocking,asyncBlocking", false, 0); } TEST(ExtensionWebRequestHelpersTest, @@ -332,8 +325,8 @@ TEST(ExtensionWebRequestHelpersTest, TestCalculateOnBeforeSendHeadersDelta) { new_headers_added.SetHeader("key3", "value3"); new_headers_added.SetHeader("key2", "value2"); EventResponseDelta delta_added = CalculateOnBeforeSendHeadersDelta( - "extid", base::Time::Now(), cancel, &old_headers, &new_headers_added, - 0 /* extra_info_spec */); + nullptr /* browser_context */, "extid", base::Time::Now(), cancel, + &old_headers, &new_headers_added, 0 /* extra_info_spec */); EXPECT_TRUE(delta_added.cancel); ASSERT_TRUE(delta_added.modified_request_headers.GetHeader("key3", &value)); EXPECT_EQ("value3", value); @@ -342,8 +335,8 @@ TEST(ExtensionWebRequestHelpersTest, TestCalculateOnBeforeSendHeadersDelta) { net::HttpRequestHeaders new_headers_deleted; new_headers_deleted.SetHeader("key1", "value1"); EventResponseDelta delta_deleted = CalculateOnBeforeSendHeadersDelta( - "extid", base::Time::Now(), cancel, &old_headers, &new_headers_deleted, - 0 /* extra_info_spec */); + nullptr /* browser_context */, "extid", base::Time::Now(), cancel, + &old_headers, &new_headers_deleted, 0 /* extra_info_spec */); ASSERT_EQ(1u, delta_deleted.deleted_request_headers.size()); ASSERT_EQ("key2", delta_deleted.deleted_request_headers.front()); @@ -352,8 +345,8 @@ TEST(ExtensionWebRequestHelpersTest, TestCalculateOnBeforeSendHeadersDelta) { new_headers_modified.SetHeader("key1", "value1"); new_headers_modified.SetHeader("key2", "value3"); EventResponseDelta delta_modified = CalculateOnBeforeSendHeadersDelta( - "extid", base::Time::Now(), cancel, &old_headers, &new_headers_modified, - 0 /* extra_info_spec */); + nullptr /* browser_context */, "extid", base::Time::Now(), cancel, + &old_headers, &new_headers_modified, 0 /* extra_info_spec */); EXPECT_TRUE(delta_modified.deleted_request_headers.empty()); ASSERT_TRUE( delta_modified.modified_request_headers.GetHeader("key2", &value)); @@ -367,8 +360,8 @@ TEST(ExtensionWebRequestHelpersTest, TestCalculateOnBeforeSendHeadersDelta) { new_headers_modified2.SetHeader("key2", "value2"); new_headers_modified2.SetHeader("key2", "value3"); EventResponseDelta delta_modified2 = CalculateOnBeforeSendHeadersDelta( - "extid", base::Time::Now(), cancel, &old_headers, &new_headers_modified, - 0 /* extra_info_spec */); + nullptr /* browser_context */, "extid", base::Time::Now(), cancel, + &old_headers, &new_headers_modified, 0 /* extra_info_spec */); EXPECT_TRUE(delta_modified2.deleted_request_headers.empty()); ASSERT_TRUE( delta_modified2.modified_request_headers.GetHeader("key2", &value)); @@ -386,14 +379,14 @@ TEST(ExtensionWebRequestHelpersTest, net::HttpRequestHeaders new_headers = old_headers; new_headers.SetHeader(name, "value"); EventResponseDelta delta = CalculateOnBeforeSendHeadersDelta( - "extid", base::Time::Now(), false, &old_headers, &new_headers, - 0 /* extra_info_spec */); + nullptr /* browser_context */, "extid", base::Time::Now(), false, + &old_headers, &new_headers, 0 /* extra_info_spec */); EXPECT_FALSE(delta.modified_request_headers.HasHeader(name)); // Test with extra headers in spec. - delta = CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), false, - &old_headers, &new_headers, - ExtraInfoSpec::EXTRA_HEADERS); + delta = CalculateOnBeforeSendHeadersDelta( + nullptr /* browser_context */, "extid", base::Time::Now(), false, + &old_headers, &new_headers, ExtraInfoSpec::EXTRA_HEADERS); std::string value; EXPECT_TRUE(delta.modified_request_headers.GetHeader(name, &value)); EXPECT_EQ("value", value); @@ -402,15 +395,15 @@ TEST(ExtensionWebRequestHelpersTest, new_headers = old_headers; // Add header to old headers, it will be treated as removed. old_headers.SetHeader(name, "value"); - delta = CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), false, - &old_headers, &new_headers, - 0 /* extra_info_spec */); + delta = CalculateOnBeforeSendHeadersDelta( + nullptr /* browser_context */, "extid", base::Time::Now(), false, + &old_headers, &new_headers, 0 /* extra_info_spec */); EXPECT_TRUE(delta.deleted_request_headers.empty()); // Test with extra headers in spec. - delta = CalculateOnBeforeSendHeadersDelta("extid", base::Time::Now(), false, - &old_headers, &new_headers, - ExtraInfoSpec::EXTRA_HEADERS); + delta = CalculateOnBeforeSendHeadersDelta( + nullptr /* browser_context */, "extid", base::Time::Now(), false, + &old_headers, &new_headers, ExtraInfoSpec::EXTRA_HEADERS); EXPECT_THAT(delta.deleted_request_headers, ElementsAre(name)); } } @@ -771,7 +764,7 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { headers0.MergeFrom(base_headers); WebRequestInfoInitParams info_params; WebRequestInfo info(std::move(info_params)); - info.dnr_action.emplace(Action::Type::NONE); + info.dnr_actions = std::vector<DNRRequestAction>(); MergeOnBeforeSendHeadersResponses(info, deltas, &headers0, &ignored_actions, &ignore1, &ignore2, &request_headers_modified0); @@ -879,8 +872,12 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnBeforeSendHeadersResponses) { bool request_headers_modified4 = false; net::HttpRequestHeaders headers4; headers4.MergeFrom(base_headers); - info.dnr_action.emplace(Action::Type::REMOVE_HEADERS); - info.dnr_action->request_headers_to_remove = {"key5"}; + + DNRRequestAction remove_headers_action( + DNRRequestAction::Type::REMOVE_HEADERS); + remove_headers_action.request_headers_to_remove = {"key5"}; + info.dnr_actions = std::vector<DNRRequestAction>(); + info.dnr_actions->push_back(std::move(remove_headers_action)); MergeOnBeforeSendHeadersResponses(info, deltas, &headers4, &ignored_actions, &ignore1, &ignore2, &request_headers_modified4); @@ -927,7 +924,7 @@ TEST(ExtensionWebRequestHelpersTest, WebRequestInfoInitParams info_params; WebRequestInfo info(std::move(info_params)); - info.dnr_action.emplace(Action::Type::NONE); + info.dnr_actions = std::vector<DNRRequestAction>(); helpers::IgnoredActions ignored_actions; std::set<std::string> removed_headers, set_headers; bool request_headers_modified = false; @@ -1270,7 +1267,7 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { WebRequestInfoInitParams info_params; info_params.url = GURL(kExampleUrl); WebRequestInfo info(std::move(info_params)); - info.dnr_action.emplace(Action::Type::NONE); + info.dnr_actions = std::vector<DNRRequestAction>(); MergeOnHeadersReceivedResponses(info, deltas, base_headers.get(), &new_headers0, &allowed_unsafe_redirect_url0, @@ -1350,8 +1347,12 @@ TEST(ExtensionWebRequestHelpersTest, TestMergeOnHeadersReceivedResponses) { // Ensure headers removed by Declarative Net Request API can't be added by web // request extensions and result in a conflict. - info.dnr_action.emplace(Action::Type::REMOVE_HEADERS); - info.dnr_action->response_headers_to_remove = {"key3"}; + DNRRequestAction remove_headers_action( + DNRRequestAction::Type::REMOVE_HEADERS); + remove_headers_action.response_headers_to_remove = {"key3"}; + info.dnr_actions = std::vector<DNRRequestAction>(); + info.dnr_actions->push_back(std::move(remove_headers_action)); + ignored_actions.clear(); bool response_headers_modified3 = false; scoped_refptr<net::HttpResponseHeaders> new_headers3; @@ -1406,7 +1407,7 @@ TEST(ExtensionWebRequestHelpersTest, WebRequestInfoInitParams info_params; info_params.url = GURL(kExampleUrl); WebRequestInfo info(std::move(info_params)); - info.dnr_action.emplace(Action::Type::NONE); + info.dnr_actions = std::vector<DNRRequestAction>(); MergeOnHeadersReceivedResponses(info, deltas, base_headers.get(), &new_headers1, &allowed_unsafe_redirect_url1, diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 622cdec21a1..7cbbb84af36 100644 --- a/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/command_line.h" +#include "base/json/json_reader.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/optional.h" @@ -28,6 +29,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_tab_util.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/extension_with_management_policy_apitest.h" #include "chrome/browser/extensions/scripting_permissions_modifier.h" @@ -100,6 +102,7 @@ #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/url_request_filter.h" #include "net/url_request/url_request_interceptor.h" +#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/test/test_url_loader_client.h" @@ -141,6 +144,55 @@ class CancelLoginDialog : public content::NotificationObserver { DISALLOW_COPY_AND_ASSIGN(CancelLoginDialog); }; +// Observer that listens for messages from chrome.test.sendMessage to allow them +// to be used to trigger browser initiated naviagations from the javascript for +// testing purposes. +class NavigateTabMessageHandler : public content::NotificationObserver { + public: + explicit NavigateTabMessageHandler(Profile* profile) : profile_(profile) { + registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_TEST_MESSAGE, + content::NotificationService::AllSources()); + } + + ~NavigateTabMessageHandler() override {} + + void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) override { + HandleNavigateTabMessage(type, source, details, profile_); + } + + private: + void HandleNavigateTabMessage(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details, + Profile* profile) { + DCHECK_EQ(NOTIFICATION_EXTENSION_TEST_MESSAGE, type); + const auto message = + content::Details<std::pair<std::string, bool*>>(details)->first; + base::Optional<base::Value> command = base::JSONReader::Read(message); + if (command && command->is_dict()) { // Check the message decoded from JSON + base::Value* data = command->FindDictKey("navigate"); + if (data && data->is_dict()) { + int tab_id = *data->FindIntKey("tabId"); + GURL url = GURL(*data->FindStringKey("url")); + ASSERT_TRUE(url.is_valid()); + + content::WebContents* contents = nullptr; + ExtensionTabUtil::GetTabById( + tab_id, profile, profile->HasOffTheRecordProfile(), &contents); + ASSERT_NE(contents, nullptr) + << "Could not find tab with id: " << tab_id; + content::NavigationController::LoadURLParams params(url); + contents->GetController().LoadURLWithParams(params); + } + } + } + + content::NotificationRegistrar registrar_; + Profile* profile_; +}; + // Sends an XHR request to the provided host, port, and path, and responds when // the request was sent. const char kPerformXhrJs[] = @@ -230,6 +282,7 @@ class ExtensionWebRequestApiTest : public ExtensionApiTest { void SetUpOnMainThread() override { ExtensionApiTest::SetUpOnMainThread(); host_resolver()->AddRule("*", "127.0.0.1"); + navigationHandler_ = std::make_unique<NavigateTabMessageHandler>(profile()); } void SetUpCommandLine(base::CommandLine* command_line) override { @@ -274,6 +327,7 @@ class ExtensionWebRequestApiTest : public ExtensionApiTest { private: std::vector<std::unique_ptr<TestExtensionDir>> test_dirs_; + std::unique_ptr<NavigateTabMessageHandler> navigationHandler_; }; class DevToolsFrontendInWebRequestApiTest : public ExtensionApiTest { @@ -287,6 +341,8 @@ class DevToolsFrontendInWebRequestApiTest : public ExtensionApiTest { url_loader_interceptor_ = std::make_unique<content::URLLoaderInterceptor>( base::BindRepeating(&DevToolsFrontendInWebRequestApiTest::OnIntercept, base::Unretained(this), port)); + + navigationHandler_ = std::make_unique<NavigateTabMessageHandler>(profile()); } void TearDownOnMainThread() override { @@ -352,6 +408,7 @@ class DevToolsFrontendInWebRequestApiTest : public ExtensionApiTest { base::FilePath test_root_dir_; std::unique_ptr<content::URLLoaderInterceptor> url_loader_interceptor_; + std::unique_ptr<NavigateTabMessageHandler> navigationHandler_; }; IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestApi) { @@ -469,23 +526,30 @@ class ExtensionWebRequestApiAuthRequiredTest } }; +// Note: this is flaky on multiple platforms (crbug.com/1003598). IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiAuthRequiredTest, - WebRequestAuthRequired) { + DISABLED_WebRequestAuthRequired) { CancelLoginDialog login_dialog_helper; ASSERT_TRUE(StartEmbeddedTestServer()); + + // Pass "debug" as a custom arg to debug test flakiness. ASSERT_TRUE(RunExtensionSubtestWithArgAndFlags( - "webrequest", "test_auth_required.html", nullptr, GetFlags())) + "webrequest", "test_auth_required.html", "debug", GetFlags())) << message_; } +// Note: this is flaky on multiple platforms (crbug.com/1003598). Temporarily +// enabled to find flakiness cause. IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiAuthRequiredTest, - WebRequestAuthRequiredAsync) { + DISABLED_WebRequestAuthRequiredAsync) { CancelLoginDialog login_dialog_helper; ASSERT_TRUE(StartEmbeddedTestServer()); + + // Pass "debug" as a custom arg to debug test flakiness. ASSERT_TRUE(RunExtensionSubtestWithArgAndFlags( - "webrequest", "test_auth_required_async.html", nullptr, GetFlags())) + "webrequest", "test_auth_required_async.html", "debug", GetFlags())) << message_; } @@ -535,7 +599,15 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, << message_; } -IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestExtraHeaders) { +// Flaky on ChromeOS: https://crbug.com/1003661 and Linux: +// https://crbug.com/1864717 +#if defined(OS_CHROMEOS) || defined(OS_LINUX) +#define MAYBE_WebRequestExtraHeaders DISABLED_WebRequestExtraHeaders +#else +#define MAYBE_WebRequestExtraHeaders WebRequestExtraHeaders +#endif +IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, + MAYBE_WebRequestExtraHeaders) { CancelLoginDialog login_dialog_helper; ASSERT_TRUE(StartEmbeddedTestServer()); @@ -546,7 +618,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestExtraHeaders) { IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestCORSWithExtraHeaders) { ASSERT_TRUE(StartEmbeddedTestServer()); - ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_cors.html")) << message_; + std::string test = "test_cors.html"; + if (network::features::ShouldEnableOutOfBlinkCorsForTesting()) + test += "?cors_mode=network_service"; + else + test += "?cors_mode=blink"; + ASSERT_TRUE(RunExtensionSubtest("webrequest", test)) << message_; } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebRequestRedirects) { @@ -869,7 +946,12 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, ExtensionRequests) { // The extension frame does run in the extension's process. Any requests made // by it should not be visible to other extensions, since they won't have // access to the request initiator. - EXPECT_EQ("Did not intercept any requests.", listener_result.message()); + // + // OTOH, the content script executes fetches/XHRs as-if they were initiated by + // the webpage that the content script got injected into. Here, the webpage + // has origin of http://127.0.0.1:<some port>, and so the webRequest API + // extension should have access to the request. + EXPECT_EQ("Intercepted requests: ?contentscript", listener_result.message()); } IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, HostedAppRequest) { |