Browse Source

fix: Chrome Extensions service worker host registration (#39290)

Shelley Vohr 1 year ago
parent
commit
5d82a2ee61

+ 4 - 0
shell/browser/electron_browser_client.cc

@@ -161,6 +161,7 @@
 #include "extensions/browser/info_map.h"
 #include "extensions/browser/process_manager.h"
 #include "extensions/browser/process_map.h"
+#include "extensions/browser/service_worker/service_worker_host.h"
 #include "extensions/browser/url_loader_factory_manager.h"
 #include "extensions/common/api/mime_handler.mojom.h"
 #include "extensions/common/constants.h"
@@ -1547,6 +1548,9 @@ void ElectronBrowserClient::ExposeInterfacesToRenderer(
   associated_registry->AddInterface<extensions::mojom::GuestView>(
       base::BindRepeating(&extensions::ExtensionsGuestView::CreateForExtensions,
                           render_process_host->GetID()));
+  associated_registry->AddInterface<extensions::mojom::ServiceWorkerHost>(
+      base::BindRepeating(&extensions::ServiceWorkerHost::BindReceiver,
+                          render_process_host->GetID()));
 #endif
 }
 

+ 15 - 0
spec/extensions-spec.ts

@@ -701,5 +701,20 @@ describe('chrome extensions', () => {
       const scope = await registrationPromise;
       expect(scope).equals(extension.url);
     });
+
+    it('can run chrome extension APIs', async () => {
+      const customSession = session.fromPartition(`persist:${uuid.v4()}`);
+      const w = new BrowserWindow({ show: false, webPreferences: { session: customSession, nodeIntegration: true } });
+      await customSession.loadExtension(path.join(fixtures, 'extensions', 'mv3-service-worker'));
+
+      await w.loadURL(url);
+
+      w.webContents.executeJavaScript('window.postMessage(\'fetch-confirmation\', \'*\')');
+
+      const [, , responseString] = await once(w.webContents, 'console-message');
+      const { message } = JSON.parse(responseString);
+
+      expect(message).to.equal('Hello from background.js');
+    });
   });
 });

+ 7 - 1
spec/fixtures/extensions/mv3-service-worker/background.js

@@ -1 +1,7 @@
-console.log('service worker installed');
+/* global chrome */
+
+chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
+  if (message === 'fetch-confirmation') {
+    sendResponse({ message: 'Hello from background.js' });
+  }
+});

+ 13 - 0
spec/fixtures/extensions/mv3-service-worker/main.js

@@ -0,0 +1,13 @@
+/* global chrome */
+
+chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
+  sendResponse(message);
+});
+
+window.addEventListener('message', (event) => {
+  if (event.data === 'fetch-confirmation') {
+    chrome.runtime.sendMessage('fetch-confirmation', response => {
+      console.log(JSON.stringify(response));
+    });
+  }
+}, false);

+ 11 - 0
spec/fixtures/extensions/mv3-service-worker/manifest.json

@@ -3,6 +3,17 @@
   "description": "Test for extension service worker support.",
   "version": "1.0",
   "manifest_version": 3,
+  "content_scripts": [
+    {
+      "matches": [
+        "<all_urls>"
+      ],
+      "js": [
+        "main.js"
+      ],
+      "run_at": "document_start"
+    }
+  ],
   "background": {
     "service_worker": "background.js"
   }