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));