summaryrefslogtreecommitdiffstats
path: root/chromium/chrome/browser/extensions/api/web_request
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/extensions/api/web_request')
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_api_unittest.cc123
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_apitest.cc96
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) {