From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: deepak1556 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 49ed9f95ba4053b5330a54223c6b43b9b3ff5aad..bdcac528395ee8a6218b796c8556e701bd30ddf1 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc @@ -1889,6 +1889,26 @@ 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& pending_scheme_specific_factories = + static_cast( + loader_factory_bundle_info.get()) + ->pending_scheme_specific_factories(); + ContentBrowserClient::NonNetworkURLLoaderFactoryMap non_network_factories; + GetContentClient() + ->browser() + ->RegisterNonNetworkServiceWorkerUpdateURLLoaderFactories( + storage_partition_->browser_context(), &non_network_factories); + for (auto& [scheme, factory_remote] : non_network_factories) { + pending_scheme_specific_factories.emplace( + scheme, std::move(factory_remote)); + } + if (auto* config = content::WebUIConfigMap::GetInstance().GetConfig( browser_context(), scope)) { // If this is a Service Worker for a WebUI, the WebUI's URLDataSource @@ -1908,9 +1928,7 @@ ServiceWorkerContextWrapper::GetLoaderFactoryForBrowserInitiatedRequest( features::kEnableServiceWorkersForChromeScheme) && scope.scheme_piece() == kChromeUIScheme) { config->RegisterURLDataSource(browser_context()); - static_cast( - loader_factory_bundle_info.get()) - ->pending_scheme_specific_factories() + pending_scheme_specific_factories .emplace(kChromeUIScheme, CreateWebUIServiceWorkerLoaderFactory( browser_context(), kChromeUIScheme, base::flat_set())); @@ -1918,9 +1936,7 @@ ServiceWorkerContextWrapper::GetLoaderFactoryForBrowserInitiatedRequest( features::kEnableServiceWorkersForChromeUntrusted) && scope.scheme_piece() == kChromeUIUntrustedScheme) { config->RegisterURLDataSource(browser_context()); - static_cast( - loader_factory_bundle_info.get()) - ->pending_scheme_specific_factories() + pending_scheme_specific_factories .emplace(kChromeUIUntrustedScheme, CreateWebUIServiceWorkerLoaderFactory( browser_context(), kChromeUIUntrustedScheme,