summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-21 16:51:20 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-09-30 09:46:39 +0000
commit9e56cbcc63fa8c9dfc8782c7570ecff9b278c162 (patch)
treebf10f8a51c00e81bb38879c049db80f6ca8ca93f
parente171ff885f1ed10005392aac2233c7f33eda4088 (diff)
downloadqtwebengine-chromium-9e56cbcc63fa8c9dfc8782c7570ecff9b278c162.tar.gz
[Revert] Delete more extensions code that still depends on URLRequest
QtWebEngine: We still need it Now that network service is launched, this is no longer needed. Modified a few of the unittests to work with the other WebRequestInfo constructor. Bug: 934009 Change-Id: Ie291f23de31b0059902c541c4d2b97475403ee90 Reviewed-by: Ken Rockot <rockot@google.com> Reviewed-by: Yuchen Liu <yucliu@chromium.org> Reviewed-by: Karan Bhatia <karandeepb@chromium.org> Commit-Queue: Clark DuVall <cduvall@chromium.org> Cr-Commit-Position: refs/heads/master@{#669038} Change-Id: Id4b8995f2c84d16dfc7c304722fec27491fc4b50 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
-rw-r--r--chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc11
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc19
-rw-r--r--chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc4
-rw-r--r--chromium/extensions/browser/DEPS1
-rw-r--r--chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc1
-rw-r--r--chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc289
-rw-r--r--chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_unittest.cc122
-rw-r--r--chromium/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc1
-rw-r--r--chromium/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc2
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_api.h12
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_info.cc118
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_info.h32
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_permissions.cc5
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_permissions_unittest.cc12
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc8
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h2
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_proxying_websocket.cc8
-rw-r--r--chromium/extensions/browser/api/web_request/web_request_proxying_websocket.h2
-rw-r--r--chromium/extensions/browser/content_verify_job_unittest.cc7
-rw-r--r--chromium/extensions/browser/extension_protocols.cc3
-rw-r--r--chromium/extensions/browser/extensions_browser_client.cc6
-rw-r--r--chromium/extensions/browser/extensions_browser_client.h21
-rw-r--r--chromium/extensions/browser/test_extensions_browser_client.cc10
-rw-r--r--chromium/extensions/browser/test_extensions_browser_client.h6
-rw-r--r--chromium/extensions/browser/updater/extension_downloader.cc1
-rw-r--r--chromium/extensions/browser/url_request_util.cc1
-rw-r--r--chromium/extensions/browser/url_request_util.h4
-rw-r--r--chromium/extensions/shell/BUILD.gn4
-rw-r--r--chromium/extensions/shell/browser/shell_browser_context.cc11
-rw-r--r--chromium/extensions/shell/browser/shell_extensions_browser_client.cc24
-rw-r--r--chromium/extensions/shell/browser/shell_extensions_browser_client.h8
31 files changed, 606 insertions, 149 deletions
diff --git a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
index fe07b62a6cf..e33dd7bb390 100644
--- a/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
@@ -29,7 +29,11 @@
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
#include "extensions/common/extensions_client.h"
+#include "net/base/request_priority.h"
#include "net/http/http_response_headers.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_test_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -128,12 +132,13 @@ bool WebRequestActionWithThreadsTest::ActionWorksOnRequest(
const WebRequestActionSet* action_set,
RequestStage stage) {
const int kRendererId = 2;
+ std::unique_ptr<net::URLRequest> regular_request(
+ context_.CreateRequest(GURL(url_string), net::DEFAULT_PRIORITY, NULL,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
EventResponseDeltas deltas;
scoped_refptr<net::HttpResponseHeaders> headers(
new net::HttpResponseHeaders(""));
- WebRequestInfoInitParams params;
- params.url = GURL(url_string);
- WebRequestInfoInitParams request_params(std::move(params));
+ WebRequestInfoInitParams request_params(regular_request.get());
request_params.render_process_id = kRendererId;
WebRequestInfo request_info(std::move(request_params));
WebRequestData request_data(&request_info, stage, headers.get());
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
index 3739ff2aa03..74cdf220816 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
@@ -5,6 +5,7 @@
#include "extensions/browser/api/web_request/web_request_event_details.h"
#include "base/stl_util.h"
+#include "base/test/scoped_task_environment.h"
#include "base/values.h"
#include "extensions/browser/api/web_request/web_request_api_constants.h"
#include "extensions/browser/api/web_request/web_request_api_helpers.h"
@@ -12,6 +13,8 @@
#include "google_apis/gaia/gaia_urls.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_util.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
@@ -74,6 +77,8 @@ TEST(WebRequestEventDetailsTest, WhitelistedCopyForPublicSession) {
TEST(WebRequestEventDetailsTest, SetResponseHeaders) {
const int kFilter =
extension_web_request_api_helpers::ExtraInfoSpec::RESPONSE_HEADERS;
+ base::test::ScopedTaskEnvironment scoped_task_environment;
+ net::TestURLRequestContext context;
char headers_string[] =
"HTTP/1.0 200 OK\r\n"
@@ -85,9 +90,10 @@ TEST(WebRequestEventDetailsTest, SetResponseHeaders) {
{
// Non-Gaia URL.
- WebRequestInfoInitParams params;
- params.url = GURL("http://www.example.com");
- WebRequestInfo request_info(std::move(params));
+ std::unique_ptr<net::URLRequest> request = context.CreateRequest(
+ GURL("http://www.example.com"), net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS);
+ WebRequestInfo request_info(request.get());
WebRequestEventDetails details(request_info, kFilter);
details.SetResponseHeaders(request_info, headers.get());
std::unique_ptr<base::DictionaryValue> dict =
@@ -107,9 +113,10 @@ TEST(WebRequestEventDetailsTest, SetResponseHeaders) {
{
// Gaia URL.
- WebRequestInfoInitParams params;
- params.url = GaiaUrls::GetInstance()->gaia_url();
- WebRequestInfo gaia_request_info(std::move(params));
+ std::unique_ptr<net::URLRequest> gaia_request = context.CreateRequest(
+ GaiaUrls::GetInstance()->gaia_url(), net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS);
+ WebRequestInfo gaia_request_info(gaia_request.get());
WebRequestEventDetails gaia_details(gaia_request_info, kFilter);
gaia_details.SetResponseHeaders(gaia_request_info, headers.get());
std::unique_ptr<base::DictionaryValue> dict =
diff --git a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
index c73e3247c93..a37ec2d79dd 100644
--- a/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
+++ b/chromium/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -19,6 +19,10 @@
#include "extensions/common/constants.h"
#include "extensions/common/permissions/permissions_data.h"
#include "ipc/ipc_message.h"
+#include "net/base/request_priority.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#if defined(OS_CHROMEOS)
diff --git a/chromium/extensions/browser/DEPS b/chromium/extensions/browser/DEPS
index b9b9c3d946e..208cbcd5dd3 100644
--- a/chromium/extensions/browser/DEPS
+++ b/chromium/extensions/browser/DEPS
@@ -21,7 +21,6 @@ include_rules = [
"+gpu/config",
"+grit/extensions_strings.h",
"+net",
- "-net/url_request",
# This directory contains build flags and does not pull all of PPAPI in.
"+ppapi/buildflags",
"+services/data_decoder/public",
diff --git a/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc b/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
index 07d73657aa5..77b6059a7ee 100644
--- a/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
+++ b/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
@@ -32,6 +32,7 @@
#include "net/base/static_cookie_policy.h"
#include "net/http/http_request_headers.h"
#include "net/http/http_util.h"
+#include "net/url_request/url_request.h"
using base::CaseInsensitiveCompareASCII;
using base::DictionaryValue;
diff --git a/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc b/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc
index f69e81d6861..4f65e6526d1 100644
--- a/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc
+++ b/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute_unittest.cc
@@ -9,13 +9,22 @@
#include <memory>
#include <utility>
+#include "base/files/file_path.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/values.h"
+#include "content/public/browser/resource_request_info.h"
+#include "content/public/common/previews_state.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_condition.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/api/web_request/web_request_info.h"
-#include "net/http/http_util.h"
+#include "net/base/request_priority.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
@@ -30,7 +39,16 @@ namespace keys = declarative_webrequest_constants;
namespace {
const char kUnknownConditionName[] = "unknownType";
+base::FilePath TestDataPath(base::StringPiece relative_to_src) {
+ base::FilePath src_dir;
+ CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
+ return src_dir.AppendASCII(relative_to_src);
+}
+
TEST(WebRequestConditionAttributeTest, CreateConditionAttribute) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
std::string error;
scoped_refptr<const WebRequestConditionAttribute> result;
base::Value string_value("main_frame");
@@ -69,6 +87,9 @@ TEST(WebRequestConditionAttributeTest, CreateConditionAttribute) {
}
TEST(WebRequestConditionAttributeTest, ResourceType) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
std::string error;
base::ListValue resource_types;
// The 'sub_frame' value is chosen arbitrarily, so as the corresponding
@@ -82,29 +103,64 @@ TEST(WebRequestConditionAttributeTest, ResourceType) {
ASSERT_TRUE(attribute.get());
EXPECT_EQ(std::string(keys::kResourceTypeKey), attribute->GetName());
- WebRequestInfoInitParams ok_params;
- ok_params.type = content::ResourceType::kSubFrame;
- ok_params.web_request_type = WebRequestResourceType::SUB_FRAME;
- WebRequestInfo request_ok_info(std::move(ok_params));
+ net::TestURLRequestContext context;
+ std::unique_ptr<net::URLRequest> url_request_ok(context.CreateRequest(
+ GURL("http://www.example.com"), net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ content::ResourceRequestInfo::AllocateForTesting(
+ url_request_ok.get(), content::ResourceType::kSubFrame,
+ NULL, // context
+ -1, // render_process_id
+ -1, // render_view_id
+ -1, // render_frame_id
+ false, // is_main_frame
+ content::ResourceInterceptPolicy::kAllowAll,
+ false, // is_async
+ content::PREVIEWS_OFF,
+ nullptr); // navigation_ui_data
+ WebRequestInfo request_ok_info(url_request_ok.get());
EXPECT_TRUE(attribute->IsFulfilled(
WebRequestData(&request_ok_info, ON_BEFORE_REQUEST)));
- WebRequestInfoInitParams fail_params;
- ok_params.type = content::ResourceType::kMainFrame;
- ok_params.web_request_type = WebRequestResourceType::MAIN_FRAME;
- WebRequestInfo request_fail_info(std::move(fail_params));
+ std::unique_ptr<net::URLRequest> url_request_fail(context.CreateRequest(
+ GURL("http://www.example.com"), net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ content::ResourceRequestInfo::AllocateForTesting(
+ url_request_fail.get(), content::ResourceType::kMainFrame,
+ NULL, // context
+ -1, // render_process_id
+ -1, // render_view_id
+ -1, // render_frame_id
+ true, // is_main_frame
+ content::ResourceInterceptPolicy::kAllowAll,
+ false, // is_async
+ content::PREVIEWS_OFF,
+ nullptr); // navigation_ui_data
+ WebRequestInfo request_fail_info(url_request_fail.get());
EXPECT_FALSE(attribute->IsFulfilled(
WebRequestData(&request_fail_info, ON_BEFORE_REQUEST)));
}
TEST(WebRequestConditionAttributeTest, ContentType) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
std::string error;
scoped_refptr<const WebRequestConditionAttribute> result;
- WebRequestInfo request_info(WebRequestInfoInitParams{});
- auto response_headers = base::MakeRefCounted<net::HttpResponseHeaders>(
- net::HttpUtil::AssembleRawHeaders("HTTP/1.1 200 OK\r\n"
- "Content-Type: text/plain; UTF-8\r\n"));
+ net::EmbeddedTestServer test_server;
+ test_server.ServeFilesFromDirectory(TestDataPath(
+ "chrome/test/data/extensions/api_test/webrequest/declarative"));
+ ASSERT_TRUE(test_server.Start());
+
+ net::TestURLRequestContext context;
+ net::TestDelegate delegate;
+ std::unique_ptr<net::URLRequest> url_request(context.CreateRequest(
+ test_server.GetURL("/headers.html"), net::DEFAULT_PRIORITY, &delegate,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ url_request->Start();
+ WebRequestInfo request_info(url_request.get());
+ base::RunLoop().Run();
base::ListValue content_types;
content_types.AppendString("text/plain");
@@ -114,9 +170,9 @@ TEST(WebRequestConditionAttributeTest, ContentType) {
EXPECT_EQ("", error);
ASSERT_TRUE(attribute_include.get());
EXPECT_FALSE(attribute_include->IsFulfilled(WebRequestData(
- &request_info, ON_BEFORE_REQUEST, response_headers.get())));
+ &request_info, ON_BEFORE_REQUEST, url_request->response_headers())));
EXPECT_TRUE(attribute_include->IsFulfilled(WebRequestData(
- &request_info, ON_HEADERS_RECEIVED, response_headers.get())));
+ &request_info, ON_HEADERS_RECEIVED, url_request->response_headers())));
EXPECT_EQ(std::string(keys::kContentTypeKey), attribute_include->GetName());
scoped_refptr<const WebRequestConditionAttribute> attribute_exclude =
@@ -125,7 +181,7 @@ TEST(WebRequestConditionAttributeTest, ContentType) {
EXPECT_EQ("", error);
ASSERT_TRUE(attribute_exclude.get());
EXPECT_FALSE(attribute_exclude->IsFulfilled(WebRequestData(
- &request_info, ON_HEADERS_RECEIVED, response_headers.get())));
+ &request_info, ON_HEADERS_RECEIVED, url_request->response_headers())));
content_types.Clear();
content_types.AppendString("something/invalid");
@@ -135,7 +191,7 @@ TEST(WebRequestConditionAttributeTest, ContentType) {
EXPECT_EQ("", error);
ASSERT_TRUE(attribute_unincluded.get());
EXPECT_FALSE(attribute_unincluded->IsFulfilled(WebRequestData(
- &request_info, ON_HEADERS_RECEIVED, response_headers.get())));
+ &request_info, ON_HEADERS_RECEIVED, url_request->response_headers())));
scoped_refptr<const WebRequestConditionAttribute> attribute_unexcluded =
WebRequestConditionAttribute::Create(
@@ -143,13 +199,16 @@ TEST(WebRequestConditionAttributeTest, ContentType) {
EXPECT_EQ("", error);
ASSERT_TRUE(attribute_unexcluded.get());
EXPECT_TRUE(attribute_unexcluded->IsFulfilled(WebRequestData(
- &request_info, ON_HEADERS_RECEIVED, response_headers.get())));
+ &request_info, ON_HEADERS_RECEIVED, url_request->response_headers())));
EXPECT_EQ(std::string(keys::kExcludeContentTypeKey),
attribute_unexcluded->GetName());
}
// Testing WebRequestConditionAttributeThirdParty.
TEST(WebRequestConditionAttributeTest, ThirdParty) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
std::string error;
const Value value_true(true);
// This attribute matches only third party requests.
@@ -175,33 +234,31 @@ TEST(WebRequestConditionAttributeTest, ThirdParty) {
const GURL url_empty;
const GURL url_a("http://a.com");
const GURL url_b("http://b.com");
+ net::TestURLRequestContext context;
+ net::TestDelegate delegate;
+ std::unique_ptr<net::URLRequest> url_request(context.CreateRequest(
+ url_a, net::DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
for (unsigned int i = 1; i <= kLastActiveStage; i <<= 1) {
if (!(kActiveStages & i))
continue;
const RequestStage stage = static_cast<RequestStage>(i);
- WebRequestInfoInitParams empty_params;
- empty_params.url = url_a;
- empty_params.site_for_cookies = url_empty;
- WebRequestInfo request_info1(std::move(empty_params));
+ url_request->set_site_for_cookies(url_empty);
+ WebRequestInfo request_info1(url_request.get());
EXPECT_TRUE(third_party_attribute->IsFulfilled(
WebRequestData(&request_info1, stage)));
EXPECT_FALSE(first_party_attribute->IsFulfilled(
WebRequestData(&request_info1, stage)));
- WebRequestInfoInitParams b_params;
- b_params.url = url_a;
- b_params.site_for_cookies = url_b;
- WebRequestInfo request_info2(std::move(b_params));
+ url_request->set_site_for_cookies(url_b);
+ WebRequestInfo request_info2(url_request.get());
EXPECT_TRUE(third_party_attribute->IsFulfilled(
WebRequestData(&request_info2, stage)));
EXPECT_FALSE(first_party_attribute->IsFulfilled(
WebRequestData(&request_info2, stage)));
- WebRequestInfoInitParams a_params;
- a_params.url = url_a;
- a_params.site_for_cookies = url_a;
- WebRequestInfo request_info3(std::move(a_params));
+ url_request->set_site_for_cookies(url_a);
+ WebRequestInfo request_info3(url_request.get());
EXPECT_FALSE(third_party_attribute->IsFulfilled(
WebRequestData(&request_info3, stage)));
EXPECT_TRUE(first_party_attribute->IsFulfilled(
@@ -214,6 +271,9 @@ TEST(WebRequestConditionAttributeTest, ThirdParty) {
// applicable stages, one for each stage applicable for that stage, and one
// applicable in all stages.
TEST(WebRequestConditionAttributeTest, Stages) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
typedef std::pair<RequestStage, const char*> StageNamePair;
static const StageNamePair active_stages[] = {
StageNamePair(ON_BEFORE_REQUEST, keys::kOnBeforeRequestEnum),
@@ -267,7 +327,13 @@ TEST(WebRequestConditionAttributeTest, Stages) {
ASSERT_TRUE(one_stage_attributes.back().get() != NULL);
}
- WebRequestInfo request_info(WebRequestInfoInitParams{});
+ const GURL url_empty;
+ net::TestURLRequestContext context;
+ net::TestDelegate delegate;
+ std::unique_ptr<net::URLRequest> url_request(
+ context.CreateRequest(url_empty, net::DEFAULT_PRIORITY, &delegate,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ WebRequestInfo request_info(url_request.get());
for (size_t i = 0; i < base::size(active_stages); ++i) {
EXPECT_FALSE(empty_attribute->IsFulfilled(
@@ -349,13 +415,15 @@ std::unique_ptr<base::DictionaryValue> GetDictionaryFromArray(
return dictionary;
}
-// Returns whether the response headers from |request_info| satisfy the match
+// Returns whether the response headers from |url_request| satisfy the match
// criteria given in |tests|. For at least one |i| all tests from |tests[i]|
-// must pass.
-void MatchAndCheck(const std::vector<std::vector<const std::string*>>& tests,
+// must pass. If |positive_test| is true, the dictionary is interpreted as the
+// containsHeaders property of a RequestMatcher, otherwise as
+// doesNotContainHeaders.
+void MatchAndCheck(const std::vector< std::vector<const std::string*> >& tests,
const std::string& key,
RequestStage stage,
- const WebRequestInfo& request_info,
+ net::URLRequest* url_request,
bool* result) {
base::ListValue contains_headers;
for (size_t i = 0; i < tests.size(); ++i) {
@@ -372,8 +440,9 @@ void MatchAndCheck(const std::vector<std::vector<const std::string*>>& tests,
ASSERT_TRUE(attribute.get());
EXPECT_EQ(key, attribute->GetName());
- *result = attribute->IsFulfilled(WebRequestData(
- &request_info, stage, request_info.response_headers.get()));
+ WebRequestInfo request_info(url_request);
+ *result = attribute->IsFulfilled(
+ WebRequestData(&request_info, stage, url_request->response_headers()));
}
} // namespace
@@ -383,9 +452,18 @@ void MatchAndCheck(const std::vector<std::vector<const std::string*>>& tests,
// "ResponseHeaders" (below), because the header-matching code is shared
// by both types of condition attributes, so it is enough to test it once.
TEST(WebRequestConditionAttributeTest, RequestHeaders) {
- WebRequestInfoInitParams params;
- params.extra_request_headers.SetHeader("Custom-header", "custom/value");
- WebRequestInfo request_info(std::move(params));
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
+ net::TestURLRequestContext context;
+ net::TestDelegate delegate;
+ std::unique_ptr<net::URLRequest> url_request(context.CreateRequest(
+ GURL("http://example.com"), // Dummy URL.
+ net::DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
+ url_request->SetExtraRequestHeaderByName(
+ "Custom-header", "custom/value", true /* overwrite */);
+ url_request->Start();
+ base::RunLoop().Run();
std::vector<std::vector<const std::string*> > tests;
bool result = false;
@@ -402,11 +480,12 @@ TEST(WebRequestConditionAttributeTest, RequestHeaders) {
const size_t kPassingConditionSizes[] = {base::size(kPassingCondition)};
GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests);
// Positive filter, passing (conjunction of tests).
- MatchAndCheck(tests, keys::kRequestHeadersKey, stage, request_info, &result);
+ MatchAndCheck(
+ tests, keys::kRequestHeadersKey, stage, url_request.get(), &result);
EXPECT_TRUE(result);
// Negative filter, failing (conjunction of tests).
- MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage, request_info,
- &result);
+ MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
+ url_request.get(), &result);
EXPECT_FALSE(result);
// Second set of test data -- failing disjunction.
@@ -419,32 +498,35 @@ TEST(WebRequestConditionAttributeTest, RequestHeaders) {
const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u };
GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests);
// Positive filter, failing (disjunction of tests).
- MatchAndCheck(tests, keys::kRequestHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_FALSE(result);
// Negative filter, passing (disjunction of tests).
- MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage, request_info,
- &result);
+ MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
+ url_request.get(), &result);
EXPECT_TRUE(result);
// Third set of test data, corner case -- empty disjunction.
GetArrayAsVector(NULL, NULL, 0u, &tests);
// Positive filter, failing (no test to pass).
- MatchAndCheck(tests, keys::kRequestHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_FALSE(result);
// Negative filter, passing (no test to fail).
- MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage, request_info,
- &result);
+ MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
+ url_request.get(), &result);
EXPECT_TRUE(result);
// Fourth set of test data, corner case -- empty conjunction.
const size_t kEmptyConjunctionSizes[] = { 0u };
GetArrayAsVector(NULL, kEmptyConjunctionSizes, 1u, &tests);
// Positive filter, passing (trivial test).
- MatchAndCheck(tests, keys::kRequestHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kRequestHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// Negative filter, failing.
- MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage, request_info,
- &result);
+ MatchAndCheck(tests, keys::kExcludeRequestHeadersKey, stage,
+ url_request.get(), &result);
EXPECT_FALSE(result);
}
@@ -454,17 +536,21 @@ TEST(WebRequestConditionAttributeTest, RequestHeaders) {
// 3. Negating the match in case of 'doesNotContainHeaders'.
TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
ExtensionsAPIClient api_client;
- WebRequestInfo request_info(WebRequestInfoInitParams{});
- request_info.response_headers =
- base::MakeRefCounted<net::HttpResponseHeaders>(
- net::HttpUtil::AssembleRawHeaders(
- "HTTP/1.1 200 OK\r\n"
- "Content-Type: text/plain; UTF-8\r\n"
- "Custom-Header: custom/value\r\n"
- "Custom-Header-B: valueA\r\n"
- "Custom-Header-B: valueB\r\n"
- "Custom-Header-C: valueC, valueD\r\n"
- "Custom-Header-D:\r\n"));
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
+ net::EmbeddedTestServer test_server;
+ test_server.ServeFilesFromDirectory(TestDataPath(
+ "chrome/test/data/extensions/api_test/webrequest/declarative"));
+ ASSERT_TRUE(test_server.Start());
+
+ net::TestURLRequestContext context;
+ net::TestDelegate delegate;
+ std::unique_ptr<net::URLRequest> url_request(context.CreateRequest(
+ test_server.GetURL("/headers.html"), net::DEFAULT_PRIORITY, &delegate,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ url_request->Start();
+ base::RunLoop().Run();
// In all the tests below we assume that the server includes the headers
// Custom-Header: custom/value
@@ -488,7 +574,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kPassingConditionSizes[] = {base::size(kPassingCondition)};
GetArrayAsVector(kPassingCondition, kPassingConditionSizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// 1.b. -- None of the following tests in the discjunction should pass.
@@ -500,7 +587,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kFailConditionSizes[] = { 2u, 2u, 2u, 2u };
GetArrayAsVector(kFailCondition, kFailConditionSizes, 4u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_FALSE(result);
// 1.c. -- This should fail (mixing name and value from different headers)
@@ -510,7 +598,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kMixingConditionSizes[] = {base::size(kMixingCondition)};
GetArrayAsVector(kMixingCondition, kMixingConditionSizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_FALSE(result);
// 1.d. -- Test handling multiple values for one header (both should pass).
@@ -520,7 +609,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kMoreValues1Sizes[] = {base::size(kMoreValues1)};
GetArrayAsVector(kMoreValues1, kMoreValues1Sizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
const std::string kMoreValues2[] = {
keys::kNameEqualsKey, "Custom-header-b",
@@ -528,7 +618,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kMoreValues2Sizes[] = {base::size(kMoreValues2)};
GetArrayAsVector(kMoreValues2, kMoreValues2Sizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// 1.e. -- This should fail as conjunction but pass as disjunction.
@@ -539,12 +630,14 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
// First disjunction, no conflict.
const size_t kNoConflictSizes[] = { 2u, 2u };
GetArrayAsVector(kConflict, kNoConflictSizes, 2u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// Then conjunction, conflict.
const size_t kConflictSizes[] = {base::size(kConflict)};
GetArrayAsVector(kConflict, kConflictSizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_FALSE(result);
// 1.f. -- This should pass, checking for correct treatment of ',' in values.
@@ -554,7 +647,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kCommaSizes[] = {base::size(kComma)};
GetArrayAsVector(kComma, kCommaSizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// 1.g. -- This should pass, empty values are values as well.
@@ -564,7 +658,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kEmptySizes[] = {base::size(kEmpty)};
GetArrayAsVector(kEmpty, kEmptySizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// 1.h. -- Values are case-sensitive, this should fail.
@@ -580,7 +675,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kLowercaseSizes[] = { 4u, 4u, 4u, 4u }; // As disjunction.
GetArrayAsVector(kLowercase, kLowercaseSizes, 4u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_FALSE(result);
// 1.i. -- Names are case-insensitive, this should pass.
@@ -592,7 +688,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kUppercaseSizes[] = {base::size(kUppercase)}; // Conjunction.
GetArrayAsVector(kUppercase, kUppercaseSizes, 1u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// 2.a. -- This should pass as disjunction, because one of the tests passes.
@@ -604,7 +701,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kDisjunctionSizes[] = { 2u, 2u, 2u, 2u };
GetArrayAsVector(kDisjunction, kDisjunctionSizes, 4u, &tests);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info, &result);
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
+ &result);
EXPECT_TRUE(result);
// 3.a. -- This should pass.
@@ -614,8 +712,8 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kNonExistentSizes[] = {base::size(kNonExistent)};
GetArrayAsVector(kNonExistent, kNonExistentSizes, 1u, &tests);
- MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, stage, request_info,
- &result);
+ MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, stage,
+ url_request.get(), &result);
EXPECT_TRUE(result);
// 3.b. -- This should fail.
@@ -625,25 +723,34 @@ TEST(WebRequestConditionAttributeTest, ResponseHeaders) {
};
const size_t kExistingSize[] = {base::size(kExisting)};
GetArrayAsVector(kExisting, kExistingSize, 1u, &tests);
- MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, stage, request_info,
- &result);
+ MatchAndCheck(tests, keys::kExcludeResponseHeadersKey, stage,
+ url_request.get(), &result);
EXPECT_FALSE(result);
}
TEST(WebRequestConditionAttributeTest, HideResponseHeaders) {
- const GURL url("http://a.com");
- WebRequestInfoInitParams params;
- params.url = url;
- WebRequestInfo request_info(std::move(params));
- request_info.response_headers =
- base::MakeRefCounted<net::HttpResponseHeaders>(
- net::HttpUtil::AssembleRawHeaders(
- "HTTP/1.1 200 OK\r\n"
- "Content-Type: text/plain; UTF-8\r\n"
- "Custom-Header: custom/value\r\n"));
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
+
+ net::EmbeddedTestServer test_server;
+ test_server.ServeFilesFromDirectory(TestDataPath(
+ "chrome/test/data/extensions/api_test/webrequest/declarative"));
+ ASSERT_TRUE(test_server.Start());
+
+ net::TestURLRequestContext context;
+ net::TestDelegate delegate;
+ GURL url = test_server.GetURL("/headers.html");
+ std::unique_ptr<net::URLRequest> url_request(context.CreateRequest(
+ url, net::DEFAULT_PRIORITY, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS));
+ url_request->Start();
+ base::RunLoop().Run();
// In all the test below we assume that the server includes the headers
// Custom-Header: custom/value
+ // Custom-Header-B: valueA
+ // Custom-Header-B: valueB
+ // Custom-Header-C: valueC, valueD
+ // Custom-Header-D:
std::vector<std::vector<const std::string*>> tests;
bool result;
@@ -655,7 +762,7 @@ TEST(WebRequestConditionAttributeTest, HideResponseHeaders) {
{
// Default client does not hide the response header.
ExtensionsAPIClient api_client;
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info,
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
&result);
EXPECT_TRUE(result);
}
@@ -680,7 +787,7 @@ TEST(WebRequestConditionAttributeTest, HideResponseHeaders) {
};
TestExtensionsAPIClient api_client(url);
- MatchAndCheck(tests, keys::kResponseHeadersKey, stage, request_info,
+ MatchAndCheck(tests, keys::kResponseHeadersKey, stage, url_request.get(),
&result);
EXPECT_FALSE(result);
}
diff --git a/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_unittest.cc b/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_unittest.cc
index 253487796fd..31fb92b65d7 100644
--- a/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_unittest.cc
+++ b/chromium/extensions/browser/api/declarative_webrequest/webrequest_condition_unittest.cc
@@ -7,11 +7,18 @@
#include <memory>
#include <set>
+#include "base/message_loop/message_loop.h"
#include "base/test/values_test_util.h"
#include "base/values.h"
#include "components/url_matcher/url_matcher_constants.h"
+#include "content/public/browser/resource_request_info.h"
+#include "content/public/common/previews_state.h"
#include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
#include "extensions/browser/api/web_request/web_request_info.h"
+#include "net/base/request_priority.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
using url_matcher::URLMatcher;
@@ -20,6 +27,8 @@ using url_matcher::URLMatcherConditionSet;
namespace extensions {
TEST(WebRequestConditionTest, CreateCondition) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
URLMatcher matcher;
std::string error;
@@ -68,12 +77,22 @@ TEST(WebRequestConditionTest, CreateCondition) {
result->GetURLMatcherConditionSets(&url_matcher_condition_set);
matcher.AddConditionSets(url_matcher_condition_set);
+ net::TestURLRequestContext context;
const GURL http_url("http://www.example.com");
- WebRequestInfoInitParams match_params;
- match_params.url = http_url;
- match_params.type = content::ResourceType::kMainFrame;
- match_params.web_request_type = WebRequestResourceType::MAIN_FRAME;
- WebRequestInfo match_request_info(std::move(match_params));
+ std::unique_ptr<net::URLRequest> match_request(context.CreateRequest(
+ http_url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
+ content::ResourceRequestInfo::AllocateForTesting(
+ match_request.get(), content::ResourceType::kMainFrame,
+ NULL, // context
+ -1, // render_process_id
+ -1, // render_view_id
+ -1, // render_frame_id
+ true, // is_main_frame
+ content::ResourceInterceptPolicy::kAllowAll,
+ false, // is_async
+ content::PREVIEWS_OFF,
+ nullptr); // navigation_ui_data
+ WebRequestInfo match_request_info(match_request.get());
WebRequestData data(&match_request_info, ON_BEFORE_REQUEST);
WebRequestDataWithMatchIds request_data(&data);
request_data.url_match_ids = matcher.MatchURL(http_url);
@@ -81,13 +100,20 @@ TEST(WebRequestConditionTest, CreateCondition) {
EXPECT_TRUE(result->IsFulfilled(request_data));
const GURL https_url("https://www.example.com");
- WebRequestInfoInitParams wrong_resource_type_params;
- wrong_resource_type_params.url = https_url;
- wrong_resource_type_params.type = content::ResourceType::kSubFrame;
- wrong_resource_type_params.web_request_type =
- WebRequestResourceType::SUB_FRAME;
- WebRequestInfo wrong_resource_type_request_info(
- std::move(wrong_resource_type_params));
+ std::unique_ptr<net::URLRequest> wrong_resource_type(context.CreateRequest(
+ https_url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
+ content::ResourceRequestInfo::AllocateForTesting(
+ wrong_resource_type.get(), content::ResourceType::kSubFrame,
+ NULL, // context
+ -1, // render_process_id
+ -1, // render_view_id
+ -1, // render_frame_id
+ false, // is_main_frame
+ content::ResourceInterceptPolicy::kAllowAll,
+ false, // is_async
+ content::PREVIEWS_OFF,
+ nullptr); // navigation_ui_data
+ WebRequestInfo wrong_resource_type_request_info(wrong_resource_type.get());
data.request = &wrong_resource_type_request_info;
request_data.url_match_ids = matcher.MatchURL(http_url);
// Make sure IsFulfilled does not fail because of URL matching.
@@ -96,6 +122,8 @@ TEST(WebRequestConditionTest, CreateCondition) {
}
TEST(WebRequestConditionTest, CreateConditionFirstPartyForCookies) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
URLMatcher matcher;
std::string error;
@@ -116,19 +144,29 @@ TEST(WebRequestConditionTest, CreateConditionFirstPartyForCookies) {
result->GetURLMatcherConditionSets(&url_matcher_condition_set);
matcher.AddConditionSets(url_matcher_condition_set);
+ net::TestURLRequestContext context;
const GURL http_url("http://www.example.com");
const GURL first_party_url("http://fpfc.example.com");
- WebRequestInfoInitParams match_params;
- match_params.url = http_url;
- match_params.type = content::ResourceType::kMainFrame;
- match_params.web_request_type = WebRequestResourceType::MAIN_FRAME;
- WebRequestInfo match_request_info(std::move(match_params));
+ std::unique_ptr<net::URLRequest> match_request(context.CreateRequest(
+ http_url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
+ WebRequestInfo match_request_info(match_request.get());
WebRequestData data(&match_request_info, ON_BEFORE_REQUEST);
WebRequestDataWithMatchIds request_data(&data);
request_data.url_match_ids = matcher.MatchURL(http_url);
EXPECT_EQ(0u, request_data.url_match_ids.size());
request_data.first_party_url_match_ids = matcher.MatchURL(first_party_url);
EXPECT_EQ(1u, request_data.first_party_url_match_ids.size());
+ content::ResourceRequestInfo::AllocateForTesting(
+ match_request.get(), content::ResourceType::kMainFrame,
+ NULL, // context
+ -1, // render_process_id
+ -1, // render_view_id
+ -1, // render_frame_id
+ true, // is_main_frame
+ content::ResourceInterceptPolicy::kAllowAll,
+ false, // is_async
+ content::PREVIEWS_OFF,
+ nullptr); // navigation_ui_data
EXPECT_TRUE(result->IsFulfilled(request_data));
}
@@ -139,6 +177,8 @@ TEST(WebRequestConditionTest, CreateConditionFirstPartyForCookies) {
// 2. An empty condition (in particular, without UrlFilter attributes) is
// always fulfilled.
TEST(WebRequestConditionTest, NoUrlAttributes) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
URLMatcher matcher;
std::string error;
@@ -187,10 +227,12 @@ TEST(WebRequestConditionTest, NoUrlAttributes) {
EXPECT_EQ("", error);
ASSERT_TRUE(condition_no_url_false.get());
- WebRequestInfoInitParams params;
- params.url = GURL("https://www.example.com");
- params.site_for_cookies = GURL("https://www.example.com");
- WebRequestInfo https_request_info(std::move(params));
+ net::TestURLRequestContext context;
+ std::unique_ptr<net::URLRequest> https_request(context.CreateRequest(
+ GURL("https://www.example.com"), net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ https_request->set_site_for_cookies(GURL("https://www.example.com"));
+ WebRequestInfo https_request_info(https_request.get());
// 1. A non-empty condition without UrlFilter attributes is fulfilled iff its
// attributes are fulfilled.
@@ -209,6 +251,8 @@ TEST(WebRequestConditionTest, NoUrlAttributes) {
}
TEST(WebRequestConditionTest, CreateConditionSet) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
URLMatcher matcher;
WebRequestConditionSet::Values conditions;
@@ -247,9 +291,10 @@ TEST(WebRequestConditionTest, CreateConditionSet) {
// Test that the result is correct and matches http://www.example.com and
// https://www.example.com
GURL http_url("http://www.example.com");
- WebRequestInfoInitParams http_params;
- http_params.url = http_url;
- WebRequestInfo http_request_info(std::move(http_params));
+ net::TestURLRequestContext context;
+ std::unique_ptr<net::URLRequest> http_request(context.CreateRequest(
+ http_url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
+ WebRequestInfo http_request_info(http_request.get());
WebRequestData data(&http_request_info, ON_BEFORE_REQUEST);
WebRequestDataWithMatchIds request_data(&data);
request_data.url_match_ids = matcher.MatchURL(http_url);
@@ -260,9 +305,9 @@ TEST(WebRequestConditionTest, CreateConditionSet) {
GURL https_url("https://www.example.com");
request_data.url_match_ids = matcher.MatchURL(https_url);
EXPECT_EQ(1u, request_data.url_match_ids.size());
- WebRequestInfoInitParams https_params;
- https_params.url = https_url;
- WebRequestInfo https_request_info(std::move(https_params));
+ std::unique_ptr<net::URLRequest> https_request(context.CreateRequest(
+ https_url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
+ WebRequestInfo https_request_info(https_request.get());
data.request = &https_request_info;
EXPECT_TRUE(result->IsFulfilled(*(request_data.url_match_ids.begin()),
request_data));
@@ -271,14 +316,17 @@ TEST(WebRequestConditionTest, CreateConditionSet) {
GURL https_foo_url("https://foo.example.com");
request_data.url_match_ids = matcher.MatchURL(https_foo_url);
EXPECT_EQ(0u, request_data.url_match_ids.size());
- WebRequestInfoInitParams https_foo_params;
- https_foo_params.url = https_foo_url;
- WebRequestInfo https_foo_request_info(std::move(https_foo_params));
+ std::unique_ptr<net::URLRequest> https_foo_request(
+ context.CreateRequest(https_foo_url, net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
+ WebRequestInfo https_foo_request_info(https_foo_request.get());
data.request = &https_foo_request_info;
EXPECT_FALSE(result->IsFulfilled(-1, request_data));
}
TEST(WebRequestConditionTest, TestPortFilter) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
URLMatcher matcher;
WebRequestConditionSet::Values conditions;
@@ -309,18 +357,30 @@ TEST(WebRequestConditionTest, TestPortFilter) {
// Test various URLs.
GURL http_url("http://www.example.com");
+ net::TestURLRequestContext context;
+ std::unique_ptr<net::URLRequest> http_request(context.CreateRequest(
+ http_url, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS));
url_match_ids = matcher.MatchURL(http_url);
ASSERT_EQ(1u, url_match_ids.size());
GURL http_url_80("http://www.example.com:80");
+ std::unique_ptr<net::URLRequest> http_request_80(
+ context.CreateRequest(http_url_80, net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
url_match_ids = matcher.MatchURL(http_url_80);
ASSERT_EQ(1u, url_match_ids.size());
GURL http_url_1000("http://www.example.com:1000");
+ std::unique_ptr<net::URLRequest> http_request_1000(
+ context.CreateRequest(http_url_1000, net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
url_match_ids = matcher.MatchURL(http_url_1000);
ASSERT_EQ(1u, url_match_ids.size());
GURL http_url_2000("http://www.example.com:2000");
+ std::unique_ptr<net::URLRequest> http_request_2000(
+ context.CreateRequest(http_url_2000, net::DEFAULT_PRIORITY, nullptr,
+ TRAFFIC_ANNOTATION_FOR_TESTS));
url_match_ids = matcher.MatchURL(http_url_2000);
ASSERT_EQ(0u, url_match_ids.size());
}
@@ -329,6 +389,8 @@ TEST(WebRequestConditionTest, TestPortFilter) {
// the response header. The Create() method should fail and complain that it is
// impossible that both conditions are fulfilled at the same time.
TEST(WebRequestConditionTest, ConditionsWithConflictingStages) {
+ // Necessary for TestURLRequest.
+ base::MessageLoopForIO message_loop;
URLMatcher matcher;
std::string error;
diff --git a/chromium/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc b/chromium/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc
index 733492e3306..a6865e43495 100644
--- a/chromium/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc
+++ b/chromium/extensions/browser/api/declarative_webrequest/webrequest_rules_registry.cc
@@ -23,6 +23,7 @@
#include "extensions/common/error_utils.h"
#include "extensions/common/extension.h"
#include "extensions/common/permissions/permissions_data.h"
+#include "net/url_request/url_request.h"
using url_matcher::URLMatcherConditionSet;
diff --git a/chromium/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc b/chromium/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc
index 01fb97c2a9e..4704497270c 100644
--- a/chromium/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc
+++ b/chromium/extensions/browser/api/sockets_tcp/sockets_tcp_api.cc
@@ -19,6 +19,8 @@
#include "extensions/browser/api/sockets_tcp/tcp_socket_event_dispatcher.h"
#include "extensions/common/api/sockets/sockets_manifest_data.h"
#include "net/base/net_errors.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_getter.h"
using extensions::ResumableTCPSocket;
using extensions::api::sockets_tcp::SocketInfo;
diff --git a/chromium/extensions/browser/api/web_request/web_request_api.h b/chromium/extensions/browser/api/web_request/web_request_api.h
index a8ff7188323..fa02472fa80 100644
--- a/chromium/extensions/browser/api/web_request/web_request_api.h
+++ b/chromium/extensions/browser/api/web_request/web_request_api.h
@@ -78,9 +78,10 @@ class WebRequestAPI : public BrowserContextKeyedAPI,
public ExtensionRegistryObserver {
public:
// A callback used to asynchronously respond to an intercepted authentication
- // request. If |should_cancel| is true the request will be cancelled.
- // Otherwise any supplied |credentials| will be used. If no credentials are
- // supplied, default browser behavior will follow (e.g. UI prompt for login).
+ // request when the Network Service is enabled. If |should_cancel| is true
+ // the request will be cancelled. Otherwise any supplied |credentials| will be
+ // used. If no credentials are supplied, default browser behavior will follow
+ // (e.g. UI prompt for login).
using AuthRequestCallback = base::OnceCallback<void(
const base::Optional<net::AuthCredentials>& credentials,
bool should_cancel)>;
@@ -186,6 +187,7 @@ class WebRequestAPI : public BrowserContextKeyedAPI,
// factories proxied for service worker.
//
// Returns |true| if the URLLoaderFactory will be proxied; |false| otherwise.
+ // Only used when the Network Service is enabled.
bool MaybeProxyURLLoaderFactory(
content::BrowserContext* browser_context,
content::RenderFrameHost* frame,
@@ -196,7 +198,7 @@ class WebRequestAPI : public BrowserContextKeyedAPI,
network::mojom::TrustedURLLoaderHeaderClientPtrInfo* header_client);
// Any request which requires authentication to complete will be bounced
- // through this method.
+ // through this method iff Network Service is enabled.
//
// If this returns |true|, |callback| will eventually be invoked on the UI
// thread.
@@ -221,7 +223,7 @@ class WebRequestAPI : public BrowserContextKeyedAPI,
void ForceProxyForTesting();
// Indicates whether or not the WebRequestAPI may have one or more proxies
- // installed to support the API.
+ // installed to support the API with Network Service enabled.
bool MayHaveProxies() const;
private:
diff --git a/chromium/extensions/browser/api/web_request/web_request_info.cc b/chromium/extensions/browser/api/web_request/web_request_info.cc
index f2af091a3b0..d0477924bfc 100644
--- a/chromium/extensions/browser/api/web_request/web_request_info.cc
+++ b/chromium/extensions/browser/api/web_request/web_request_info.cc
@@ -24,6 +24,7 @@
#include "net/base/upload_bytes_element_reader.h"
#include "net/base/upload_data_stream.h"
#include "net/base/upload_file_element_reader.h"
+#include "net/url_request/url_request.h"
#include "services/network/public/cpp/resource_response.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/url_loader.h"
@@ -35,7 +36,9 @@ namespace extensions {
namespace {
// UploadDataSource abstracts an interface for feeding an arbitrary data element
-// to an UploadDataPresenter.
+// to an UploadDataPresenter. This is helpful because in the Network Service vs
+// non-Network Service case, upload data comes from different types of source
+// objects, but we'd like to share parsing code.
class UploadDataSource {
public:
virtual ~UploadDataSource() {}
@@ -75,6 +78,40 @@ class FileUploadDataSource : public UploadDataSource {
DISALLOW_COPY_AND_ASSIGN(FileUploadDataSource);
};
+base::Value NetLogExtensionIdCallback(const std::string& extension_id,
+ net::NetLogCaptureMode capture_mode) {
+ base::DictionaryValue params;
+ params.SetString("extension_id", extension_id);
+ return std::move(params);
+}
+
+bool CreateUploadDataSourcesFromURLRequest(
+ net::URLRequest* url_request,
+ std::vector<std::unique_ptr<UploadDataSource>>* data_sources) {
+ const net::UploadDataStream* upload_data = url_request->get_upload();
+ if (!upload_data)
+ return false;
+
+ const std::vector<std::unique_ptr<net::UploadElementReader>>* readers =
+ upload_data->GetElementReaders();
+ if (!readers)
+ return true;
+
+ for (const auto& reader : *readers) {
+ if (const auto* bytes_reader = reader->AsBytesReader()) {
+ data_sources->push_back(std::make_unique<BytesUploadDataSource>(
+ base::StringPiece(bytes_reader->bytes(), bytes_reader->length())));
+ } else if (const auto* file_reader = reader->AsFileReader()) {
+ data_sources->push_back(
+ std::make_unique<FileUploadDataSource>(file_reader->path()));
+ } else {
+ DVLOG(1) << "Ignoring upsupported upload data type for WebRequest API.";
+ }
+ }
+
+ return true;
+}
+
bool CreateUploadDataSourcesFromResourceRequest(
const network::ResourceRequest& request,
std::vector<std::unique_ptr<UploadDataSource>>* data_sources) {
@@ -154,6 +191,69 @@ WebRequestInfoInitParams::WebRequestInfoInitParams(
WebRequestInfoInitParams& WebRequestInfoInitParams::operator=(
WebRequestInfoInitParams&& other) = default;
+WebRequestInfoInitParams::WebRequestInfoInitParams(net::URLRequest* url_request)
+ : id(url_request->identifier()),
+ url(url_request->url()),
+ site_for_cookies(url_request->site_for_cookies()),
+ method(url_request->method()),
+ initiator(url_request->initiator()),
+ extra_request_headers(url_request->extra_request_headers()),
+ is_pac_request(url_request->is_pac_request()) {
+ if (url.SchemeIsWSOrWSS()) {
+ web_request_type = WebRequestResourceType::WEB_SOCKET;
+
+ // TODO(pkalinnikov): Consider embedding WebSocketHandshakeRequestInfo into
+ // UrlRequestUserData.
+ content::WebSocketHandshakeRequestInfo* ws_info =
+ content::WebSocketHandshakeRequestInfo::ForRequest(url_request);
+ if (ws_info) {
+ render_process_id = ws_info->GetChildId();
+ frame_id = ws_info->GetRenderFrameId();
+ }
+ } else if (auto* info =
+ content::ResourceRequestInfo::ForRequest(url_request)) {
+ render_process_id = info->GetChildID();
+ routing_id = info->GetRouteID();
+ frame_id = info->GetRenderFrameID();
+ type = info->GetResourceType();
+ web_request_type = ToWebRequestResourceType(type.value());
+ is_async = info->IsAsync();
+ resource_context = info->GetContext();
+ } else if (auto* url_loader = network::URLLoader::ForRequest(*url_request)) {
+ // This is reached only in the SimpleURLLoader case (since network service
+ // is disabled if we're in this constructor). Only set the IDs if they're
+ // non-zero, since almost all requests come from the browser and aren't
+ // associated with a frame. In the case that the browser wants this
+ // SimpleURLLoader associated with a frame, the process ID will be non-zero.
+ if (url_loader->GetProcessId() != network::mojom::kBrowserProcessId) {
+ render_process_id = url_loader->GetProcessId();
+ frame_id = url_loader->GetRenderFrameId();
+ }
+ type = static_cast<content::ResourceType>(url_loader->GetResourceType());
+ } else {
+ // There may be basic process and frame info associated with the request
+ // even when |info| is null. Attempt to grab it as a last ditch effort. If
+ // this fails, we have no frame info.
+ content::ResourceRequestInfo::GetRenderFrameForRequest(
+ url_request, &render_process_id, &frame_id);
+ }
+
+ ExtensionsBrowserClient* browser_client = ExtensionsBrowserClient::Get();
+ ExtensionNavigationUIData* navigation_ui_data =
+ browser_client ? browser_client->GetExtensionNavigationUIData(url_request)
+ : nullptr;
+ if (navigation_ui_data)
+ is_navigation_request = true;
+
+ InitializeWebViewAndFrameData(navigation_ui_data);
+
+ std::vector<std::unique_ptr<UploadDataSource>> data_sources;
+ if (CreateUploadDataSourcesFromURLRequest(url_request, &data_sources)) {
+ request_body_data =
+ CreateRequestBodyData(method, extra_request_headers, data_sources);
+ }
+}
+
WebRequestInfoInitParams::WebRequestInfoInitParams(
uint64_t request_id,
int render_process_id,
@@ -189,6 +289,10 @@ WebRequestInfoInitParams::WebRequestInfoInitParams(
request_body_data =
CreateRequestBodyData(method, extra_request_headers, data_sources);
}
+
+ // TODO(https://crbug.com/721414): For this constructor (i.e. the Network
+ // Service case), we are still missing information for |is_async| and
+ // |is_pac_request|.
}
WebRequestInfoInitParams::~WebRequestInfoInitParams() = default;
@@ -218,6 +322,9 @@ void WebRequestInfoInitParams::InitializeWebViewAndFrameData(
}
}
+WebRequestInfo::WebRequestInfo(net::URLRequest* url_request)
+ : WebRequestInfo(WebRequestInfoInitParams(url_request)) {}
+
WebRequestInfo::WebRequestInfo(WebRequestInfoInitParams params)
: id(params.id),
url(std::move(params.url)),
@@ -233,6 +340,7 @@ WebRequestInfo::WebRequestInfo(WebRequestInfoInitParams params)
web_request_type(params.web_request_type),
is_async(params.is_async),
extra_request_headers(std::move(params.extra_request_headers)),
+ is_pac_request(params.is_pac_request),
request_body_data(std::move(params.request_body_data)),
is_web_view(params.is_web_view),
web_view_instance_id(params.web_view_instance_id),
@@ -241,6 +349,14 @@ WebRequestInfo::WebRequestInfo(WebRequestInfoInitParams params)
WebRequestInfo::~WebRequestInfo() = default;
+void WebRequestInfo::AddResponseInfoFromURLRequest(
+ net::URLRequest* url_request) {
+ response_code = url_request->GetResponseCode();
+ response_headers = url_request->response_headers();
+ response_ip = url_request->GetResponseRemoteEndpoint().ToStringWithoutPort();
+ response_from_cache = url_request->was_cached();
+}
+
void WebRequestInfo::AddResponseInfoFromResourceResponse(
const network::ResourceResponseHead& response) {
response_headers = response.headers;
diff --git a/chromium/extensions/browser/api/web_request/web_request_info.h b/chromium/extensions/browser/api/web_request/web_request_info.h
index 7688e9b3a36..8b911b28b57 100644
--- a/chromium/extensions/browser/api/web_request/web_request_info.h
+++ b/chromium/extensions/browser/api/web_request/web_request_info.h
@@ -25,6 +25,15 @@
#include "url/gurl.h"
#include "url/origin.h"
+namespace content {
+class ResourceContext;
+} // namespace content
+
+namespace net {
+class HttpResponseHeaders;
+class URLRequest;
+} // namespace net
+
namespace network {
struct ResourceResponseHead;
}
@@ -39,8 +48,10 @@ struct WebRequestInfoInitParams {
WebRequestInfoInitParams(WebRequestInfoInitParams&& other);
WebRequestInfoInitParams& operator=(WebRequestInfoInitParams&& other);
+ explicit WebRequestInfoInitParams(net::URLRequest* url_request);
+
// Initializes a WebRequestInfoInitParams from information provided over a
- // URLLoaderFactory interface.
+ // URLLoaderFactory interface, for use with the Network Service.
WebRequestInfoInitParams(
uint64_t request_id,
int render_process_id,
@@ -66,11 +77,13 @@ struct WebRequestInfoInitParams {
WebRequestResourceType web_request_type = WebRequestResourceType::OTHER;
bool is_async = false;
net::HttpRequestHeaders extra_request_headers;
+ bool is_pac_request = false;
std::unique_ptr<base::DictionaryValue> request_body_data;
bool is_web_view = false;
int web_view_instance_id = -1;
int web_view_rules_registry_id = -1;
int web_view_embedder_process_id = -1;
+ content::ResourceContext* resource_context = nullptr;
base::Optional<ExtensionApiFrameIdMap::FrameData> frame_data;
private:
@@ -83,11 +96,23 @@ struct WebRequestInfoInitParams {
// A URL request representation used by WebRequest API internals. This structure
// carries information about an in-progress request.
struct WebRequestInfo {
+ // Initializes a WebRequestInfoInitParams from a net::URLRequest. Should be
+ // used sparingly, as we are moving away from direct URLRequest usage and
+ // toward using Network Service. Prefer passing and referencing
+ // WebRequestInfoInitParams in lieu of exposing any new direct references to
+ // net::URLRequest throughout extensions WebRequest-related code.
+ explicit WebRequestInfo(net::URLRequest* url_request);
+
explicit WebRequestInfo(WebRequestInfoInitParams params);
~WebRequestInfo();
- // Fill in response data for this request.
+ // Fill in response data for this request. Only used when the Network Service
+ // is disabled.
+ void AddResponseInfoFromURLRequest(net::URLRequest* url_request);
+
+ // Fill in response data for this request. Only used when the Network Service
+ // is enabled.
void AddResponseInfoFromResourceResponse(
const network::ResourceResponseHead& response);
@@ -138,6 +163,9 @@ struct WebRequestInfo {
const net::HttpRequestHeaders extra_request_headers;
+ // Indicates if this request is for a PAC script.
+ const bool is_pac_request;
+
// HTTP response code for this request if applicable. -1 if not.
int response_code = -1;
diff --git a/chromium/extensions/browser/api/web_request/web_request_permissions.cc b/chromium/extensions/browser/api/web_request/web_request_permissions.cc
index 5611c8004b5..115db39c39b 100644
--- a/chromium/extensions/browser/api/web_request/web_request_permissions.cc
+++ b/chromium/extensions/browser/api/web_request/web_request_permissions.cc
@@ -245,6 +245,11 @@ bool WebRequestPermissions::HideRequest(
if (request.is_web_view)
return false;
+ // Requests from PAC scripts are always hidden.
+ // See https://crbug.com/794674
+ if (request.is_pac_request)
+ return true;
+
bool is_request_from_browser = request.render_process_id == -1;
if (is_request_from_browser) {
diff --git a/chromium/extensions/browser/api/web_request/web_request_permissions_unittest.cc b/chromium/extensions/browser/api/web_request/web_request_permissions_unittest.cc
index 04e2cd26f94..3e78fb0bbe6 100644
--- a/chromium/extensions/browser/api/web_request/web_request_permissions_unittest.cc
+++ b/chromium/extensions/browser/api/web_request/web_request_permissions_unittest.cc
@@ -189,6 +189,18 @@ TEST_F(ExtensionWebRequestPermissionsTest, TestHideRequestForURL) {
EXPECT_TRUE(WebRequestPermissions::HideRequest(permission_helper,
sensitive_request_info));
}
+
+ {
+ // Check that a request for a non-sensitive URL is rejected if it's a PAC
+ // script fetch.
+ WebRequestInfoInitParams non_sensitive_request_params =
+ create_request_params(non_sensitive_url, content::ResourceType::kScript,
+ kRendererProcessId);
+ non_sensitive_request_params.is_pac_request = true;
+ EXPECT_TRUE(WebRequestPermissions::HideRequest(
+ info_map.get(),
+ WebRequestInfo(std::move(non_sensitive_request_params))));
+ }
}
TEST_F(ExtensionWebRequestPermissionsTest,
diff --git a/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc b/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
index 95d47c3e070..dc342974f9c 100644
--- a/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
+++ b/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.cc
@@ -916,10 +916,10 @@ void WebRequestProxyingURLLoaderFactory::CreateLoaderAndStart(
// Make sure we are not proxying a browser initiated non-navigation request.
DCHECK(render_process_id_ != -1 || navigation_ui_data_);
- // The request ID doesn't really matter. It just needs to be unique
- // per-BrowserContext so extensions can make sense of it. Note that
- // |network_service_request_id_| by contrast is not necessarily unique, so we
- // don't use it for identity here.
+ // The request ID doesn't really matter in the Network Service path. It just
+ // needs to be unique per-BrowserContext so extensions can make sense of it.
+ // Note that |network_service_request_id_| by contrast is not necessarily
+ // unique, so we don't use it for identity here.
const uint64_t web_request_id = request_id_generator_->Generate();
if (request_id) {
diff --git a/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h b/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
index 83352e0bb3e..ddc6a3e4ea7 100644
--- a/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
+++ b/chromium/extensions/browser/api/web_request/web_request_proxying_url_loader_factory.h
@@ -141,6 +141,8 @@ class WebRequestProxyingURLLoaderFactory
// |OnHeadersReceived()| and request completion or restart. Pointers to
// these fields are stored in a |BlockedRequest| (created and owned by
// ExtensionWebRequestEventRouter) through much of the request's lifetime.
+ // That code supports both Network Service and non-Network Service behavior,
+ // which is why this weirdness exists here.
network::ResourceResponseHead current_response_;
scoped_refptr<net::HttpResponseHeaders> override_headers_;
GURL redirect_url_;
diff --git a/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.cc b/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.cc
index 6a8553d0a3b..b4aafa2093e 100644
--- a/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.cc
+++ b/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.cc
@@ -157,10 +157,10 @@ void WebRequestProxyingWebSocket::OnResponseReceived(
response_.remote_endpoint = response->remote_endpoint;
- // TODO(yhirano): OnResponseReceived is called with the original
- // response headers. That means if OnHeadersReceived modified them the
- // renderer won't see that modification. This is the opposite of http(s)
- // requests.
+ // TODO(yhirano): with both network service enabled or disabled,
+ // OnFinishOpeningHandshake is called with the original response headers.
+ // That means if OnHeadersReceived modified them the renderer won't see that
+ // modification. This is the opposite of http(s) requests.
forwarding_handshake_client_->OnResponseReceived(std::move(response));
if (!binding_as_header_client_ || response_.headers) {
diff --git a/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.h b/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.h
index fe5e2d4bcf7..017b37fac94 100644
--- a/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.h
+++ b/chromium/extensions/browser/api/web_request/web_request_proxying_websocket.h
@@ -33,7 +33,7 @@ class IPEndPoint;
namespace extensions {
// A WebRequestProxyingWebSocket proxies a WebSocket connection and dispatches
-// WebRequest API events.
+// WebRequest API events. This is used only when the network service is enabled.
class WebRequestProxyingWebSocket
: public WebRequestAPI::Proxy,
public network::mojom::WebSocketHandshakeClient,
diff --git a/chromium/extensions/browser/content_verify_job_unittest.cc b/chromium/extensions/browser/content_verify_job_unittest.cc
index 52c873da77f..afaf5044662 100644
--- a/chromium/extensions/browser/content_verify_job_unittest.cc
+++ b/chromium/extensions/browser/content_verify_job_unittest.cc
@@ -22,6 +22,8 @@
#include "extensions/common/constants.h"
#include "extensions/common/extension_paths.h"
#include "extensions/common/file_util.h"
+#include "net/url_request/url_request_job_factory_impl.h"
+#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/zlib/google/zip.h"
@@ -71,12 +73,14 @@ class ContentVerifyJobUnittest : public ExtensionsTest {
ExtensionsTest::SetUp();
extension_info_map_ = new InfoMap();
+ old_factory_ = test_url_request_context_.job_factory();
content_verifier_ = new ContentVerifier(
&testing_context_, std::make_unique<MockContentVerifierDelegate>());
extension_info_map_->SetContentVerifier(content_verifier_.get());
}
void TearDown() override {
+ test_url_request_context_.set_job_factory(old_factory_);
content_verifier_->Shutdown();
ExtensionsTest::TearDown();
@@ -166,6 +170,9 @@ class ContentVerifyJobUnittest : public ExtensionsTest {
}
scoped_refptr<InfoMap> extension_info_map_;
+ net::URLRequestJobFactoryImpl job_factory_;
+ const net::URLRequestJobFactory* old_factory_;
+ net::TestURLRequestContext test_url_request_context_;
scoped_refptr<ContentVerifier> content_verifier_;
content::TestBrowserContext testing_context_;
diff --git a/chromium/extensions/browser/extension_protocols.cc b/chromium/extensions/browser/extension_protocols.cc
index 9cbf290c2ae..b58c1aeec99 100644
--- a/chromium/extensions/browser/extension_protocols.cc
+++ b/chromium/extensions/browser/extension_protocols.cc
@@ -382,7 +382,8 @@ bool ExtensionCanLoadInIncognito(bool is_main_frame,
// Pass true for |is_incognito| only for incognito profiles and not Chrome OS
// guest mode profiles.
//
-// Called on the UI thread.
+// May be called on the IO thread (non-Network Service path) or the UI thread
+// (Network Service path).
bool AllowExtensionResourceLoad(const GURL& url,
content::ResourceType resource_type,
ui::PageTransition page_transition,
diff --git a/chromium/extensions/browser/extensions_browser_client.cc b/chromium/extensions/browser/extensions_browser_client.cc
index 1dcae5284fc..1edccf4db60 100644
--- a/chromium/extensions/browser/extensions_browser_client.cc
+++ b/chromium/extensions/browser/extensions_browser_client.cc
@@ -68,6 +68,12 @@ bool ExtensionsBrowserClient::IsActivityLoggingEnabled(
return false;
}
+ExtensionNavigationUIData*
+ExtensionsBrowserClient::GetExtensionNavigationUIData(
+ net::URLRequest* request) {
+ return nullptr;
+}
+
void ExtensionsBrowserClient::GetTabAndWindowIdForWebContents(
content::WebContents* web_contents,
int* tab_id,
diff --git a/chromium/extensions/browser/extensions_browser_client.h b/chromium/extensions/browser/extensions_browser_client.h
index 2f4890b5489..3ed389242f6 100644
--- a/chromium/extensions/browser/extensions_browser_client.h
+++ b/chromium/extensions/browser/extensions_browser_client.h
@@ -38,6 +38,12 @@ class RenderFrameHost;
class WebContents;
}
+namespace net {
+class NetworkDelegate;
+class URLRequest;
+class URLRequestJob;
+}
+
namespace network {
namespace mojom {
class NetworkContext;
@@ -57,6 +63,7 @@ class ExtensionError;
class ExtensionHostDelegate;
class ExtensionApiFrameIdMap;
class ExtensionApiFrameIdMapHelper;
+class ExtensionNavigationUIData;
class ExtensionSet;
class ExtensionSystem;
class ExtensionSystemProvider;
@@ -145,6 +152,17 @@ class ExtensionsBrowserClient {
const extensions::Extension* extension,
content::BrowserContext* context) const = 0;
+ // Returns an URLRequestJob to load an extension resource from the embedder's
+ // resource bundle (.pak) files. Returns NULL if the request is not for a
+ // resource bundle resource or if the embedder does not support this feature.
+ // Used for component extensions. Called on the IO thread.
+ virtual net::URLRequestJob* MaybeCreateResourceBundleRequestJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const base::FilePath& directory_path,
+ const std::string& content_security_policy,
+ bool send_cors_header) = 0;
+
// Return the resource relative path and id for the given request.
virtual base::FilePath GetBundleResourcePath(
const network::ResourceRequest& request,
@@ -297,6 +315,9 @@ class ExtensionsBrowserClient {
// Returns true if activity logging is enabled for the given |context|.
virtual bool IsActivityLoggingEnabled(content::BrowserContext* context);
+ virtual ExtensionNavigationUIData* GetExtensionNavigationUIData(
+ net::URLRequest* request);
+
// Retrives the embedder's notion of tab and window ID for a given
// WebContents. May return -1 for either or both values if the embedder does
// not implement any such concepts. This is used to support the WebRequest API
diff --git a/chromium/extensions/browser/test_extensions_browser_client.cc b/chromium/extensions/browser/test_extensions_browser_client.cc
index 8e5048ce79b..f4202b3e370 100644
--- a/chromium/extensions/browser/test_extensions_browser_client.cc
+++ b/chromium/extensions/browser/test_extensions_browser_client.cc
@@ -122,6 +122,16 @@ bool TestExtensionsBrowserClient::CanExtensionCrossIncognito(
return false;
}
+net::URLRequestJob*
+TestExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const base::FilePath& directory_path,
+ const std::string& content_security_policy,
+ bool send_cors_header) {
+ return nullptr;
+}
+
base::FilePath TestExtensionsBrowserClient::GetBundleResourcePath(
const network::ResourceRequest& request,
const base::FilePath& extension_resources_path,
diff --git a/chromium/extensions/browser/test_extensions_browser_client.h b/chromium/extensions/browser/test_extensions_browser_client.h
index 6ae3ab8ae08..9c05e459c36 100644
--- a/chromium/extensions/browser/test_extensions_browser_client.h
+++ b/chromium/extensions/browser/test_extensions_browser_client.h
@@ -81,6 +81,12 @@ class TestExtensionsBrowserClient : public ExtensionsBrowserClient {
bool CanExtensionCrossIncognito(
const extensions::Extension* extension,
content::BrowserContext* context) const override;
+ net::URLRequestJob* MaybeCreateResourceBundleRequestJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const base::FilePath& directory_path,
+ const std::string& content_security_policy,
+ bool send_cors_header) override;
base::FilePath GetBundleResourcePath(
const network::ResourceRequest& request,
const base::FilePath& extension_resources_path,
diff --git a/chromium/extensions/browser/updater/extension_downloader.cc b/chromium/extensions/browser/updater/extension_downloader.cc
index 19130750594..8ca464cd192 100644
--- a/chromium/extensions/browser/updater/extension_downloader.cc
+++ b/chromium/extensions/browser/updater/extension_downloader.cc
@@ -46,6 +46,7 @@
#include "net/base/load_flags.h"
#include "net/base/net_errors.h"
#include "net/http/http_status_code.h"
+#include "net/url_request/url_request_status.h"
#include "net/traffic_annotation/network_traffic_annotation.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/chromium/extensions/browser/url_request_util.cc b/chromium/extensions/browser/url_request_util.cc
index 566e708e44c..e181cfe73a5 100644
--- a/chromium/extensions/browser/url_request_util.cc
+++ b/chromium/extensions/browser/url_request_util.cc
@@ -16,6 +16,7 @@
#include "extensions/common/manifest_handlers/icons_handler.h"
#include "extensions/common/manifest_handlers/web_accessible_resources_info.h"
#include "extensions/common/manifest_handlers/webview_info.h"
+#include "net/url_request/url_request.h"
namespace extensions {
namespace url_request_util {
diff --git a/chromium/extensions/browser/url_request_util.h b/chromium/extensions/browser/url_request_util.h
index 15b07184a82..73a6d712421 100644
--- a/chromium/extensions/browser/url_request_util.h
+++ b/chromium/extensions/browser/url_request_util.h
@@ -14,6 +14,10 @@
class GURL;
+namespace net {
+class URLRequest;
+}
+
namespace extensions {
class Extension;
class ExtensionSet;
diff --git a/chromium/extensions/shell/BUILD.gn b/chromium/extensions/shell/BUILD.gn
index 50dafde5694..5c668f632e1 100644
--- a/chromium/extensions/shell/BUILD.gn
+++ b/chromium/extensions/shell/BUILD.gn
@@ -146,6 +146,8 @@ source_set("app_shell_lib") {
"browser/shell_navigation_ui_data.h",
"browser/shell_network_controller_chromeos.cc",
"browser/shell_network_controller_chromeos.h",
+ "browser/shell_network_delegate.cc",
+ "browser/shell_network_delegate.h",
"browser/shell_prefs.cc",
"browser/shell_prefs.h",
"browser/shell_special_storage_policy.cc",
@@ -154,6 +156,8 @@ source_set("app_shell_lib") {
"browser/shell_speech_recognition_manager_delegate.h",
"browser/shell_update_query_params_delegate.cc",
"browser/shell_update_query_params_delegate.h",
+ "browser/shell_url_request_context_getter.cc",
+ "browser/shell_url_request_context_getter.h",
"browser/shell_virtual_keyboard_delegate.cc",
"browser/shell_virtual_keyboard_delegate.h",
"browser/shell_web_view_guest_delegate.cc",
diff --git a/chromium/extensions/shell/browser/shell_browser_context.cc b/chromium/extensions/shell/browser/shell_browser_context.cc
index bd212d9793d..770224f7b95 100644
--- a/chromium/extensions/shell/browser/shell_browser_context.cc
+++ b/chromium/extensions/shell/browser/shell_browser_context.cc
@@ -7,9 +7,20 @@
#include <utility>
#include "base/bind.h"
+#include "base/command_line.h"
#include "base/task/post_task.h"
#include "components/guest_view/browser/guest_view_manager.h"
+#include "components/network_session_configurator/common/network_switches.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/common/content_switches.h"
+#include "extensions/browser/extension_protocols.h"
+#include "extensions/common/constants.h"
+#include "extensions/shell/browser/shell_browser_main_parts.h"
+#include "extensions/shell/browser/shell_extension_system.h"
+#include "extensions/shell/browser/shell_network_delegate.h"
#include "extensions/shell/browser/shell_special_storage_policy.h"
+#include "extensions/shell/browser/shell_url_request_context_getter.h"
namespace extensions {
diff --git a/chromium/extensions/shell/browser/shell_extensions_browser_client.cc b/chromium/extensions/shell/browser/shell_extensions_browser_client.cc
index a69dc9439e5..716e6f07383 100644
--- a/chromium/extensions/shell/browser/shell_extensions_browser_client.cc
+++ b/chromium/extensions/shell/browser/shell_extensions_browser_client.cc
@@ -120,6 +120,16 @@ bool ShellExtensionsBrowserClient::CanExtensionCrossIncognito(
return false;
}
+net::URLRequestJob*
+ShellExtensionsBrowserClient::MaybeCreateResourceBundleRequestJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const base::FilePath& directory_path,
+ const std::string& content_security_policy,
+ bool send_cors_header) {
+ return NULL;
+}
+
base::FilePath ShellExtensionsBrowserClient::GetBundleResourcePath(
const network::ResourceRequest& request,
const base::FilePath& extension_resources_path,
@@ -275,6 +285,20 @@ ShellExtensionsBrowserClient::GetExtensionWebContentsObserver(
return ShellExtensionWebContentsObserver::FromWebContents(web_contents);
}
+ExtensionNavigationUIData*
+ShellExtensionsBrowserClient::GetExtensionNavigationUIData(
+ net::URLRequest* request) {
+ content::ResourceRequestInfo* info =
+ content::ResourceRequestInfo::ForRequest(request);
+ if (!info)
+ return nullptr;
+ ShellNavigationUIData* navigation_data =
+ static_cast<ShellNavigationUIData*>(info->GetNavigationUIData());
+ if (!navigation_data)
+ return nullptr;
+ return navigation_data->GetExtensionNavigationUIData();
+}
+
KioskDelegate* ShellExtensionsBrowserClient::GetKioskDelegate() {
if (!kiosk_delegate_)
kiosk_delegate_.reset(new ShellKioskDelegate());
diff --git a/chromium/extensions/shell/browser/shell_extensions_browser_client.h b/chromium/extensions/shell/browser/shell_extensions_browser_client.h
index 3a05d108170..bb1a6c507bb 100644
--- a/chromium/extensions/shell/browser/shell_extensions_browser_client.h
+++ b/chromium/extensions/shell/browser/shell_extensions_browser_client.h
@@ -53,6 +53,12 @@ class ShellExtensionsBrowserClient : public ExtensionsBrowserClient {
bool CanExtensionCrossIncognito(
const Extension* extension,
content::BrowserContext* context) const override;
+ net::URLRequestJob* MaybeCreateResourceBundleRequestJob(
+ net::URLRequest* request,
+ net::NetworkDelegate* network_delegate,
+ const base::FilePath& directory_path,
+ const std::string& content_security_policy,
+ bool send_cors_header) override;
base::FilePath GetBundleResourcePath(
const network::ResourceRequest& request,
const base::FilePath& extension_resources_path,
@@ -105,6 +111,8 @@ class ShellExtensionsBrowserClient : public ExtensionsBrowserClient {
bool IsMinBrowserVersionSupported(const std::string& min_version) override;
ExtensionWebContentsObserver* GetExtensionWebContentsObserver(
content::WebContents* web_contents) override;
+ ExtensionNavigationUIData* GetExtensionNavigationUIData(
+ net::URLRequest* request) override;
KioskDelegate* GetKioskDelegate() override;
bool IsLockScreenContext(content::BrowserContext* context) override;
std::string GetApplicationLocale() override;