ext(sw): expand active-tab URL filter; isolate chrome stub in tests

Expand get_active_tab_url protocol filter regex to include view-source:,
data:, devtools:, and other browser-internal/extension contexts that would
misbehave if autofilled. Add third regression test for view-source: URLs.

Wrap get_active_tab_url tests in dedicated describe block with beforeEach/
afterEach to snapshot/restore globalThis.chrome, preventing stub leakage
between tests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
adlee-was-taken
2026-05-01 17:01:36 -04:00
parent f872ab5183
commit 918fdef519
2 changed files with 20 additions and 2 deletions

View File

@@ -1,4 +1,4 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
// --- Mocks (must be declared before `route` is imported so the router's // --- Mocks (must be declared before `route` is imported so the router's
// `import * as vault` / `import * as session` resolve to these doubles) --- // `import * as vault` / `import * as session` resolve to these doubles) ---
@@ -925,6 +925,10 @@ describe('parse_lastpass_csv / import_lastpass_commit sender check', () => {
// --- get_active_tab_url --- // --- get_active_tab_url ---
describe('get_active_tab_url', () => { describe('get_active_tab_url', () => {
let originalChrome: any;
beforeEach(() => { originalChrome = (globalThis as any).chrome; });
afterEach(() => { (globalThis as any).chrome = originalChrome; });
it('get_active_tab_url returns active tab url + title', async () => { it('get_active_tab_url returns active tab url + title', async () => {
// happy-dom does not provide chrome.tabs; stub it. // happy-dom does not provide chrome.tabs; stub it.
(globalThis as any).chrome = { (globalThis as any).chrome = {
@@ -953,4 +957,18 @@ describe('get_active_tab_url', () => {
expect(resp.ok).toBe(true); expect(resp.ok).toBe(true);
expect(resp.data).toBeNull(); expect(resp.data).toBeNull();
}); });
it('get_active_tab_url returns null for view-source: URLs', async () => {
(globalThis as any).chrome = {
...((globalThis as any).chrome ?? {}),
tabs: {
query: (q: any, cb: (tabs: any[]) => void) => {
cb([{ url: 'view-source:https://github.com/login', title: 'View Source' }]);
},
},
};
const resp = await route({ type: 'get_active_tab_url' } as any, makeState(), makePopupSender());
expect(resp.ok).toBe(true);
expect(resp.data).toBeNull();
});
}); });

View File

@@ -153,7 +153,7 @@ export async function handle(
const tab = tabs[0]; const tab = tabs[0];
if (!tab?.url) return { ok: true, data: null }; if (!tab?.url) return { ok: true, data: null };
// Filter out chrome:// and extension URLs — autofill doesn't apply. // Filter out chrome:// and extension URLs — autofill doesn't apply.
if (/^(chrome|chrome-extension|moz-extension|edge|about|file):/i.test(tab.url)) { if (/^(chrome|chrome-extension|chrome-search|moz-extension|edge|edge-extension|about|file|view-source|data|devtools|javascript):/i.test(tab.url)) {
return { ok: true, data: null }; return { ok: true, data: null };
} }
return { ok: true, data: { url: tab.url, title: tab.title ?? '' } }; return { ok: true, data: { url: tab.url, title: tab.title ?? '' } };