Testland
Browse all skills & agents

qa-browser-extension

Firefox + Chrome extension testing: 3 skills (playwright-extension-fixtures with the reload matrix + chrome.storage quota tests, chrome-extension-messaging-tests, manifest-v3-test-surface-reference with the web-ext Firefox CLI) and 1 agent (extension-test-author, which composes them to author one Playwright spec per behavior spec).

Install this plugin

/plugin install qa-browser-extension@testland-qa
View source

Part of role bundle: qa-role-frontend

qa-browser-extension

Firefox + Chrome extension testing: the Playwright fixture layer (with the load/reload matrix and chrome.storage test suite), messaging assertions, and the Manifest V3 test-surface reference (with Mozilla's web-ext CLI for Firefox runs and AMO signing)

Components

TypeNameDescription
skillmanifest-v3-test-surface-referenceMV2/MV3 manifest field map + Firefox/Chrome key matrix + SW runtime restrictions; Mozilla web-ext CLI (lint/run/build/sign) in references/
skillchrome-extension-messaging-testsAssert chrome.runtime/tabs/connect messaging, externally_connectable, native messaging, payload limits
skillplaywright-extension-fixturesPlaywright launchPersistentContext + load-extension args + service-worker race fixture; reload matrix and chrome.storage quota/area/event tests in references/
agentextension-test-authorDetects Manifest version (V2 vs V3) + target browser (Chromium vs Firefox) from manifest.json, then emits one Playwright spec per behavior spec covering background SW, content script, popup, options page, messaging, or chrome.storage event surfaces. Sibling of qa-pwa/pwa-test-author.

Install

/plugin marketplace add testland/qa
/plugin install qa-browser-extension@testland-qa

Skills

chrome-extension-messaging-tests

Asserts Chrome extension message-passing behaviour against a running extension: one-shot `chrome.runtime.sendMessage` plus the literal `return true` that holds the response channel open for an async `sendResponse`, `chrome.tabs.sendMessage` into one tab's content script, long-lived `chrome.runtime.connect` ports and their `onDisconnect` triggers, web-page messages gated by `externally_connectable`, and `chrome.runtime.connectNative` native-messaging hosts. Covers the payload rules a test must respect (Chrome uses JSON serialization rather than structured clone, so `Map` / `Set` / `Date` do not round-trip; maximum message size is 64 MiB) and the first-listener-wins rule when several `onMessage` listeners are registered. Scope is messaging behaviour on an already-running extension, not the install or reload step. Use when a message reaches no listener, a `sendResponse` callback never fires, a port disconnects mid-test, or a page origin has to be proven allowed before publishing.

manifest-v3-test-surface-reference

Pure-reference catalog of the Manifest V3 test surface for Firefox + Chromium browser extensions. Maps each manifest field that changed from MV2 (manifest_version, background.service_worker vs background.scripts, action vs browser_action / page_action, host_permissions split, web_accessible_resources object-form, content_security_policy object-form), the runtime restrictions service workers impose (no DOM, no XMLHttpRequest, no localStorage, ephemeral lifecycle, synchronous listener registration, alarms instead of setTimeout), and the Firefox-vs-Chrome key matrix (browser_specific_settings.gecko, externally_connectable / offline_enabled gaps, MV2-only user_scripts manifest key); references/ carry Mozilla's web-ext CLI (lint via addons-linter, run on firefox-desktop / firefox-android / chromium targets, deterministic build, AMO sign). Use as the manifest-surface reference when authoring extension tests across both browsers, or when driving Firefox runs / AMO signing with web-ext.

playwright-extension-fixtures

Author the Playwright fixture layer every Chromium extension test depends on - `chromium.launchPersistentContext` with `--disable-extensions-except=$DIR` + `--load-extension=$DIR`, the `channel: 'chromium'` selection that unlocks headless extension support, the `context.serviceWorkers()` + `waitForEvent('serviceworker')` race-handling pattern, and the `extensionId = serviceWorker.url().split('/')[2]` extraction recipe - plus, in references/, the extension load / reload matrix (which edit re-evaluates which surface), the `chrome.storage` test suite (area selection, quota-exceeded, `storage.onChanged`, managed read-only), and the per-surface assertion recipes (popup, content script, background messaging, MV3 auto-suspend survival). Use when authoring or debugging the fixture a Chromium extension test imports, when an edit appears to have no effect and you need the reload matrix, or when authoring popup / content-script / storage tests.