From 2eb946b09be795d3ef4a010228d8481be361d4b3 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Sun, 10 May 2026 11:06:58 -0700 Subject: [PATCH] fix(extension): add "tabs" permission for live tab awareness off-localhost MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without the `tabs` permission, chrome.tabs.query() returns tab objects with undefined url/title for any site outside host_permissions (i.e. everything except 127.0.0.1). snapshotTabs then wrote empty strings into tabs.json and active-tab.json silently skipped writes, and the sidebar agent lost track of what page the user was actually on. activeTab is too narrow — it only applies after a user gesture on the extension action, not for background polling. Manifest test asserts permissions includes 'tabs' so future drift is caught. Note: this widens the extension's permission surface; users will see the broader scope on next install. Called out in the CHANGELOG. Contributed by @fredchu (#1257). Co-Authored-By: Claude Opus 4.7 (1M context) --- browse/test/sidebar-tabs.test.ts | 12 ++++++++++++ extension/manifest.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/browse/test/sidebar-tabs.test.ts b/browse/test/sidebar-tabs.test.ts index 31e57c4b6..91d50dcef 100644 --- a/browse/test/sidebar-tabs.test.ts +++ b/browse/test/sidebar-tabs.test.ts @@ -254,3 +254,15 @@ describe('manifest: ws permission + xterm-safe CSP', () => { } }); }); + +describe('manifest: live tab awareness needs "tabs" permission', () => { + // Without "tabs", chrome.tabs.query() returns tab objects with undefined + // url/title for any site outside host_permissions (e.g., everything except + // 127.0.0.1). snapshotTabs() then writes empty strings into tabs.json and + // active-tab.json silently skips the write — the sidebar agent loses track + // of what page the user is on. activeTab is too narrow (only after a user + // gesture on the extension action) for background polling. + test('permissions includes "tabs"', () => { + expect(MANIFEST.permissions).toContain('tabs'); + }); +}); diff --git a/extension/manifest.json b/extension/manifest.json index 502c5bb79..962562646 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -3,7 +3,7 @@ "name": "gstack browse", "version": "0.1.0", "description": "Live activity feed and @ref overlays for gstack browse", - "permissions": ["sidePanel", "storage", "activeTab", "scripting"], + "permissions": ["sidePanel", "storage", "activeTab", "scripting", "tabs"], "host_permissions": ["http://127.0.0.1:*/", "ws://127.0.0.1:*/"], "action": { "default_icon": {