From 4f82e5f3cd3d1a0a7d1675c0e8c44882cd4ea812 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Fri, 20 May 2022 00:35:16 +0900 Subject: [PATCH] fix: service worker registration with custom protocols Refs https://github.com/electron/electron/issues/32664 --- patches/chromium/.patches | 1 + .../custom_protocols_plzserviceworker.patch | 53 +++++++++++++++++++ shell/browser/electron_browser_client.cc | 5 ++ spec-main/api-protocol-spec.ts | 5 +- 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 patches/chromium/custom_protocols_plzserviceworker.patch diff --git a/patches/chromium/.patches b/patches/chromium/.patches index 8de7cb3f19783..190e3dd1043b9 100644 --- a/patches/chromium/.patches +++ b/patches/chromium/.patches @@ -117,3 +117,4 @@ introduce_ozoneplatform_electron_can_call_x11_property.patch make_gtk_getlibgtk_public.patch build_disable_print_content_analysis.patch feat_move_firstpartysets_to_content_browser_client.patch +custom_protocols_plzserviceworker.patch diff --git a/patches/chromium/custom_protocols_plzserviceworker.patch b/patches/chromium/custom_protocols_plzserviceworker.patch new file mode 100644 index 0000000000000..5c67bca44ddeb --- /dev/null +++ b/patches/chromium/custom_protocols_plzserviceworker.patch @@ -0,0 +1,53 @@ +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 9aba6deb9e11ec2803f163088d1c321dd256787f..1dc24bb4c83acd2ff618b085059c918261b2a3d4 100644 +--- a/content/browser/service_worker/service_worker_context_wrapper.cc ++++ b/content/browser/service_worker/service_worker_context_wrapper.cc +@@ -1616,6 +1616,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) { +@@ -1636,9 +1658,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, diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index e317682535ac0..d00fc915533d3 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -1333,6 +1333,11 @@ void ElectronBrowserClient:: DCHECK(browser_context); DCHECK(factories); + auto* protocol_registry = + ProtocolRegistry::FromBrowserContext(browser_context); + protocol_registry->RegisterURLLoaderFactories(factories, + false /* allow_file_access */); + #if BUILDFLAG(ENABLE_EXTENSIONS) factories->emplace( extensions::kExtensionScheme, diff --git a/spec-main/api-protocol-spec.ts b/spec-main/api-protocol-spec.ts index 4ffaa3e047d68..980c289cb1e7f 100644 --- a/spec-main/api-protocol-spec.ts +++ b/spec-main/api-protocol-spec.ts @@ -764,10 +764,7 @@ describe('protocol module', () => { await expect(contents.executeJavaScript(`navigator.serviceWorker.register('${v4()}.notjs', {scope: './'})`)).to.be.rejected(); }); - // TODO(nornagon): I'm not sure why this isn't working, but I'm choosing to - // disable this test for now to land the roll. See - // https://github.com/electron/electron/issues/32664. - it.skip('should be able to register service worker for custom scheme', async () => { + it('should be able to register service worker for custom scheme', async () => { await contents.loadURL(`${serviceWorkerScheme}://${v4()}.com`); await contents.executeJavaScript(`navigator.serviceWorker.register('${v4()}.js', {scope: './'})`); });