"use strict"; const test = require("node:test"); const assert = require("node:assert/strict"); const { createBackgroundController } = require("../background.js"); function makeBrowser() { let messageListener; let removedListener; const broadcasts = []; const api = { runtime: { onMessage: { addListener(listener) { messageListener = listener; } } }, tabs: { async sendMessage(tabId, message) { broadcasts.push({ tabId, message }); return { enabled: message.enabled }; }, onRemoved: { addListener(listener) { removedListener = listener; } } } }; return { api, broadcasts, send(message, sender = {}) { return messageListener(message, sender); }, remove(tabId) { removedListener(tabId); } }; } test("owns absolute state per tab and supplies it to new frames", async () => { const fake = makeBrowser(); const controller = createBackgroundController(fake.api); assert.deepEqual( await fake.send({ type: "glagolify:document-ready" }, { tab: { id: 17 }, frameId: 0 }), { enabled: false } ); assert.deepEqual( await fake.send({ type: "glagolify:set-tab-enabled", tabId: 17, enabled: true }), { enabled: true, available: true } ); assert.deepEqual(fake.broadcasts.at(-1), { tabId: 17, message: { type: "glagolify:set-enabled", enabled: true } }); assert.deepEqual( await fake.send({ type: "glagolify:document-ready" }, { tab: { id: 17 }, frameId: 4 }), { enabled: true } ); await fake.send({ type: "glagolify:set-tab-enabled", tabId: 17, enabled: true }); assert.equal(controller.tabStates.get(17), true, "repeated absolute enable cannot invert state"); assert.deepEqual( await fake.send({ type: "glagolify:set-tab-enabled", tabId: 17, enabled: false }), { enabled: false, available: true } ); assert.deepEqual( await fake.send({ type: "glagolify:document-ready" }, { tab: { id: 17 }, frameId: 5 }), { enabled: false } ); fake.remove(17); assert.equal(controller.tabStates.has(17), false); }); test("keeps states isolated between tabs and reports protected tabs", async () => { const fake = makeBrowser(); createBackgroundController(fake.api); await fake.send({ type: "glagolify:set-tab-enabled", tabId: 3, enabled: true }); assert.deepEqual( await fake.send({ type: "glagolify:document-ready" }, { tab: { id: 4 } }), { enabled: false } ); fake.api.tabs.sendMessage = async () => { throw new Error("No matching recipient"); }; assert.deepEqual( await fake.send({ type: "glagolify:get-tab-state", tabId: 99 }), { enabled: false, available: false } ); });