Browse Source

test: activate extension

Samuel Maddock 2 months ago
parent
commit
8425588129

+ 1 - 0
docs/api/structures/extension.md

@@ -6,3 +6,4 @@
 * `path` string - The extension's file path.
 * `version` string
 * `url` string - The extension's `chrome-extension://` URL.
+* `enabled` boolean - Whether the extension is enabled.

+ 52 - 0
spec/extensions-spec.ts

@@ -3,6 +3,7 @@ import { app, session, BrowserWindow, ipcMain, WebContents, Extension, Session }
 import { expect } from 'chai';
 import * as WebSocket from 'ws';
 
+import { spawn } from 'node:child_process';
 import { once } from 'node:events';
 import * as fs from 'node:fs/promises';
 import * as http from 'node:http';
@@ -223,6 +224,57 @@ describe('chrome extensions', () => {
     }
   });
 
+  describe('enable/disable', () => {
+    it('disables an extension', async () => {
+      const customSession = session.fromPartition(`persist:${require('uuid').v4()}`);
+      const extension = await customSession.loadExtension(path.join(fixtures, 'extensions', 'mv3-service-worker'));
+
+      expect(extension.enabled).to.be.true();
+      customSession.disableExtension(extension.id);
+
+      expect(customSession.getExtension(extension.id)!.enabled).to.be.false();
+    });
+
+    it('enables a previously disabled extension', async () => {
+      const customSession = session.fromPartition(`persist:${require('uuid').v4()}`);
+      const extension = await customSession.loadExtension(path.join(fixtures, 'extensions', 'mv3-service-worker'));
+
+      expect(extension.enabled).to.be.true();
+      customSession.disableExtension(extension.id);
+      expect(customSession.getExtension(extension.id)!.enabled).to.be.false();
+
+      customSession.enableExtension(extension.id);
+      expect(customSession.getExtension(extension.id)!.enabled).to.be.true();
+    });
+
+    it('persists disabled extensions', async () => {
+      const customSession = session.fromPartition(`persist:${require('uuid').v4()}`);
+      const extension = await customSession.loadExtension(path.join(fixtures, 'extensions', 'mv3-service-worker'));
+      customSession.disableExtension(extension.id);
+      customSession.removeExtension(extension.id);
+
+      const extension2 = await customSession.loadExtension(path.join(fixtures, 'extensions', 'mv3-service-worker'));
+      expect(extension2.enabled).to.be.false();
+    });
+
+    it('activates extension when enabled', async () => {
+      const runActivateExtensionTest = async () => {
+        const appPath = path.join(fixtures, 'apps', 'activate-extension', 'main.js');
+        const appProcess = spawn(process.execPath, [appPath], {
+          cwd: path.join(fixtures, 'apps', 'activate-extension'),
+          stdio: 'inherit'
+        });
+        const [code] = await once(appProcess, 'close');
+        expect(code).to.equal(0);
+      };
+
+      console.log('running test 1');
+      await runActivateExtensionTest();
+      console.log('running test 2');
+      await runActivateExtensionTest();
+    });
+  });
+
   it('emits extension lifecycle events', async () => {
     const customSession = session.fromPartition(`persist:${require('uuid').v4()}`);
 

+ 27 - 0
spec/fixtures/apps/activate-extension/main.js

@@ -0,0 +1,27 @@
+const { app, session } = require('electron');
+
+const path = require('node:path');
+const { setTimeout } = require('node:timers/promises');
+
+app.whenReady().then(async () => {
+  const ses = session.defaultSession;
+  const fixtures = path.join(__dirname, '..', '..');
+  const extPath = path.join(fixtures, 'extensions', 'simple-background-sw');
+
+  const activatedPromise = new Promise((resolve) => {
+    ses.serviceWorkers.on('running-status-changed', ({ versionId, runningStatus }) => {
+      console.log(`service worker ${versionId} now ${runningStatus}`);
+      if (runningStatus === 'running') {
+        resolve();
+      }
+    });
+  });
+
+  await ses.loadExtension(extPath);
+  await activatedPromise;
+
+  // Need to wait for data to be flushed?
+  await setTimeout(1000);
+
+  app.exit(0);
+});

+ 1 - 0
spec/fixtures/extensions/simple-background-sw/background.js

@@ -0,0 +1 @@
+console.log('started');

+ 9 - 0
spec/fixtures/extensions/simple-background-sw/manifest.json

@@ -0,0 +1,9 @@
+{
+  "name": "Simple background sw",
+  "description": "just a lil service worker",
+  "version": "1.0",
+  "manifest_version": 3,
+  "background": {
+    "service_worker": "background.js"
+  }
+}