Allow extensions to intercept service worker navigation preload requests.
Heavily based on an original CL by Charles Vazac <[email protected]>
at https://chromium-review.googlesource.com/c/chromium/src/+/1396938
Service worker navigation preload[1] is a web platform feature that
involves sending a request to network at the same time as starting up
the service worker for a navigation. This network request was not
visible to extensions.
This CL:
- Modifies the network service path for service worker navigation
preload requests so that the embedder is aware of them.
- In web_request_permissions.cc, if a request is not considered a browser
side navigation, it becomes opaque to extensions. This CL makes it so
that service worker navigation preload requests[1] are exempted from
that.
This CL deletes the unit test for navigation preload in
ServiceWorkerNavigationLoaderTest. It was too much hassle getting that
to work with a TestWebContents because the infrastructure for enabling
NetworkService in content_unittests is not set up yet so
unittest_test_suite.cc typically disables NetworkService (issue 901092).
We have sufficient navigation preload test coverage in browser tests and
web tests.
[1] https://w3c.github.io/ServiceWorker/#navigationpreloadmanager
Bug: 914062
Change-Id: I4c91521e55c1103a1a67d973e595094b78357c34
Reviewed-on: https://chromium-review.googlesource.com/c/1491168
Reviewed-by: Kinuko Yasuda <[email protected]>
Reviewed-by: Varun Khaneja <[email protected]>
Reviewed-by: Karan Bhatia <[email protected]>
Commit-Queue: Matt Falkenhagen <[email protected]>
Cr-Commit-Position: refs/heads/master@{#636598}
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc
index 2111eaa..fe4b44e 100644
--- a/chrome/browser/extensions/extension_apitest.cc
+++ b/chrome/browser/extensions/extension_apitest.cc
@@ -40,6 +40,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h"
#include "net/test/embedded_test_server/http_response.h"
+#include "net/test/embedded_test_server/request_handler_util.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
namespace extensions {
@@ -76,19 +77,22 @@
base::CompareCase::SENSITIVE))
return nullptr;
- size_t query_string_pos = request.relative_url.find('?');
- std::string header_name =
- request.relative_url.substr(query_string_pos + 1);
+ std::string content;
+ net::test_server::RequestQuery headers =
+ net::test_server::ParseQuery(request.GetURL());
+ for (const auto& header : headers) {
+ std::string header_name = header.first;
+ std::string header_value;
+ if (request.headers.find(header_name) != request.headers.end())
+ header_value = request.headers.at(header_name);
+ if (!content.empty())
+ content += "\n";
+ content += header_value;
+ }
- std::string header_value;
- auto it = request.headers.find(header_name);
- if (it != request.headers.end())
- header_value = it->second;
-
- std::unique_ptr<net::test_server::BasicHttpResponse> http_response(
- new net::test_server::BasicHttpResponse);
+ auto http_response = std::make_unique<net::test_server::BasicHttpResponse>();
http_response->set_code(net::HTTP_OK);
- http_response->set_content(header_value);
+ http_response->set_content(content);
return std::move(http_response);
}
@@ -146,6 +150,7 @@
} // namespace
+// TODO(karandeepb): See if this custom handling can be removed.
ExtensionApiTest::ExtensionApiTest() {
embedded_test_server()->RegisterRequestHandler(
base::Bind(&HandleServerRedirectRequest));