diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-08-21 16:51:20 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-09-30 09:46:39 +0000 |
commit | 9e56cbcc63fa8c9dfc8782c7570ecff9b278c162 (patch) | |
tree | bf10f8a51c00e81bb38879c049db80f6ca8ca93f | |
parent | e171ff885f1ed10005392aac2233c7f33eda4088 (diff) | |
download | qtwebengine-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>
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; |