S13nServiceWorker: Pass factory bundle to renderer

The renderer's default network loader can't handle non-network
URLs such as chrome-extension://. This means that fetch()
for extension resources from an extension service worker
wouldn't work when we use the default network loader. To make
such requests work, pass a URLLoaderFactoryBundle from browser
in a similar manner to shared worker.

Bug: 848628
Cq-Include-Trybots: luci.chromium.try:linux_mojo
Change-Id: Ia356a668a75efec9de854828dadc69cea0294e09
Reviewed-on: https://chromium-review.googlesource.com/1187856
Reviewed-by: Kinuko Yasuda <[email protected]>
Reviewed-by: Istiaque Ahmed <[email protected]>
Reviewed-by: Matt Falkenhagen <[email protected]>
Commit-Queue: Kenichi Ishibashi <[email protected]>
Cr-Commit-Position: refs/heads/master@{#587466}
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 2f40965..c517c0f 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -671,6 +671,25 @@
             NavigateAndExtractInnerText(extension->GetResourceURL("")));
 }
 
+IN_PROC_BROWSER_TEST_P(ServiceWorkerTest,
+                       FetchExtensionResourceFromServiceWorker) {
+  const Extension* extension =
+      StartTestFromBackgroundPage("fetch_from_sw.js", kExpectSuccess);
+  ASSERT_TRUE(extension);
+
+  // The service worker in this test tries to load 'hello.txt' via fetch()
+  // and sends back the content of the file, which should be 'hello'.
+  const char* kScript = R"(
+    let channel = new MessageChannel();
+    test.waitForMessage(channel.port1).then(message => {
+      window.domAutomationController.send(message);
+    });
+    test.registeredServiceWorker.postMessage(
+        {port: channel.port2}, [channel.port2]);
+  )";
+  EXPECT_EQ("hello", ExecuteScriptInBackgroundPage(extension->id(), kScript));
+}
+
 IN_PROC_BROWSER_TEST_P(ServiceWorkerTest, SWServedBackgroundPageReceivesEvent) {
   const Extension* extension =
       StartTestFromBackgroundPage("replace_background.js", kExpectSuccess);