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 2754f849a4a8cdd23956ef8e49b8025c6528a218..76bef9239dcbe93300143bd2b6960beef0d38392 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc @@ -1670,6 +1670,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( + 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& 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) { @@ -1690,9 +1712,7 @@ ServiceWorkerContextWrapper::GetLoaderFactoryForBrowserInitiatedRequest( browser_context(), scope_origin)) { config->RegisterURLDataSource(browser_context()); - static_cast( - loader_factory_bundle_info.get()) - ->pending_scheme_specific_factories() + factory_bundle->pending_scheme_specific_factories() .emplace(kChromeUIUntrustedScheme, CreateWebUIServiceWorkerLoaderFactory( browser_context(), kChromeUIUntrustedScheme,