feat(extension): add Firefox WebExtension support
Testing / remote-protocol-compat (0.9.5) (push) Successful in 48s
Testing / remote-protocol-compat (0.9.3) (push) Successful in 47s
Build & Publish Package / publish (push) Successful in 46s
Package Extension / package-extension (push) Successful in 59s
Testing / test (push) Failing after 50s
Testing / remote-protocol-compat (0.9.5) (push) Successful in 48s
Testing / remote-protocol-compat (0.9.3) (push) Successful in 47s
Build & Publish Package / publish (push) Successful in 46s
Package Extension / package-extension (push) Successful in 59s
Testing / test (push) Failing after 50s
- Add a neutral WebExtension API adapter that uses Firefox browser.* or Chromium chrome.* without mutating globals. - Switch extension runtime code to the adapter and add Firefox-specific typings for tabs, windows, tab groups, storage, scripting, and native messaging ports. - Fix Firefox temporary add-on instructions to load the packaged manifest with background.scripts instead of the Chromium service worker manifest. - Detect Firefox in clients.list via runtime.getBrowserInfo and keep Chromium user-agent fallback support. - Make navigate.open wait briefly for Firefox to replace initial about:blank with the requested URL. - Add JS coverage for API selection, clients.list browser detection, and Firefox navigate.open URL polling. - Bump package and extension version to 0.15.2.
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
// @ts-nocheck
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { SessionCommands } from '../src/commands/session';
|
||||
import { JobManager } from '../src/classes/JobManager';
|
||||
import { makeChromeMock } from './chrome-mock';
|
||||
|
||||
function makeSessionCommands() {
|
||||
return new SessionCommands({ jobs: new JobManager() });
|
||||
}
|
||||
|
||||
test('clients.list uses Firefox runtime.getBrowserInfo when available', async () => {
|
||||
const originalChrome = globalThis.chrome;
|
||||
const originalBrowser = globalThis.browser;
|
||||
const originalNavigator = globalThis.navigator;
|
||||
const chromeMock = makeChromeMock();
|
||||
|
||||
try {
|
||||
delete globalThis.chrome;
|
||||
globalThis.browser = {
|
||||
...chromeMock,
|
||||
runtime: {
|
||||
getManifest: () => ({ version: '0.15.1' }),
|
||||
getBrowserInfo: async () => ({ name: 'Firefox', vendor: 'Mozilla', version: '149.0', buildID: 'test' }),
|
||||
},
|
||||
};
|
||||
Object.defineProperty(globalThis, 'navigator', {
|
||||
value: { platform: 'test-platform', userAgent: 'Mozilla/5.0 Firefox/149.0' },
|
||||
configurable: true,
|
||||
});
|
||||
|
||||
const clients = await makeSessionCommands().commands['clients.list']({});
|
||||
|
||||
assert.equal(clients[0].name, 'Firefox');
|
||||
assert.equal(clients[0].version, '149.0');
|
||||
assert.equal(clients[0].extensionVersion, '0.15.1');
|
||||
} finally {
|
||||
if (originalChrome === undefined) delete globalThis.chrome;
|
||||
else globalThis.chrome = originalChrome;
|
||||
|
||||
if (originalBrowser === undefined) delete globalThis.browser;
|
||||
else globalThis.browser = originalBrowser;
|
||||
|
||||
Object.defineProperty(globalThis, 'navigator', {
|
||||
value: originalNavigator,
|
||||
configurable: true,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
test('clients.list falls back to Chromium user-agent when getBrowserInfo is missing', async () => {
|
||||
const originalChrome = globalThis.chrome;
|
||||
const originalBrowser = globalThis.browser;
|
||||
const originalNavigator = globalThis.navigator;
|
||||
const chromeMock = makeChromeMock();
|
||||
|
||||
try {
|
||||
delete globalThis.browser;
|
||||
globalThis.chrome = {
|
||||
...chromeMock,
|
||||
runtime: {
|
||||
getManifest: () => ({ version: '0.15.1' }),
|
||||
},
|
||||
};
|
||||
Object.defineProperty(globalThis, 'navigator', {
|
||||
value: { platform: 'test-platform', userAgent: 'Mozilla/5.0 Chrome/149.0.0.0 Safari/537.36' },
|
||||
configurable: true,
|
||||
});
|
||||
|
||||
const clients = await makeSessionCommands().commands['clients.list']({});
|
||||
|
||||
assert.equal(clients[0].name, 'Chrome');
|
||||
assert.equal(clients[0].version, '149.0.0.0');
|
||||
} finally {
|
||||
if (originalChrome === undefined) delete globalThis.chrome;
|
||||
else globalThis.chrome = originalChrome;
|
||||
|
||||
if (originalBrowser === undefined) delete globalThis.browser;
|
||||
else globalThis.browser = originalBrowser;
|
||||
|
||||
Object.defineProperty(globalThis, 'navigator', {
|
||||
value: originalNavigator,
|
||||
configurable: true,
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user