From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: deepak1556 <hop2deep@gmail.com>
Date: Fri, 20 May 2022 00:29:34 +0900
Subject: custom_protocols_plzserviceworker.patch

Allow registering custom protocols to handle service worker main script fetching with PlzServiceWorker.

Refs https://bugs.chromium.org/p/chromium/issues/detail?id=996511

diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index 654219d75727c189d377cf14e25a8abdc1002204..3e243964f429c3afcb874b208c672991dd3468bf 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -1649,6 +1649,28 @@ ServiceWorkerContextWrapper::GetLoaderFactoryForBrowserInitiatedRequest(
       loader_factory_bundle_info =
           context()->loader_factory_bundle_for_update_check()->Clone();
 
+  // Give the embedder a chance to register custom schemes that can
+  // handle loading the service worker main script.
+  // Previous registration triggered by
+  // ServiceWorkerContextWrapper::CreateNonNetworkPendingURLLoaderFactoryBundleForUpdateCheck
+  // happens early on browser startup before the JS in the main process
+  // is run by the embedder.
+  auto* factory_bundle = static_cast<blink::PendingURLLoaderFactoryBundle*>(
+          loader_factory_bundle_info.get());
+  ContentBrowserClient::NonNetworkURLLoaderFactoryMap non_network_factories;
+  GetContentClient()
+      ->browser()
+      ->RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories(
+          storage_partition_->browser_context(), &non_network_factories);
+  for (auto& pair : non_network_factories) {
+    const std::string& scheme = pair.first;
+    mojo::PendingRemote<network::mojom::URLLoaderFactory>& factory_remote =
+        pair.second;
+
+    factory_bundle->pending_scheme_specific_factories().emplace(
+        scheme, std::move(factory_remote));
+  }
+
   if (base::FeatureList::IsEnabled(
           features::kEnableServiceWorkersForChromeUntrusted) &&
       scope.scheme_piece() == kChromeUIUntrustedScheme) {
@@ -1669,9 +1691,7 @@ ServiceWorkerContextWrapper::GetLoaderFactoryForBrowserInitiatedRequest(
             browser_context(), scope_origin)) {
       config->RegisterURLDataSource(browser_context());
 
-      static_cast<blink::PendingURLLoaderFactoryBundle*>(
-          loader_factory_bundle_info.get())
-          ->pending_scheme_specific_factories()
+      factory_bundle->pending_scheme_specific_factories()
           .emplace(kChromeUIUntrustedScheme,
                    CreateWebUIServiceWorkerLoaderFactory(
                        browser_context(), kChromeUIUntrustedScheme,
