fix(01-09): startVideoCapture — remove stale active-tab dependency (D-01 cleanup gap)
The legacy chrome.tabs.query({ active: true, currentWindow: true }) +
"No active tab found" validation inside startVideoCapture were load-
bearing in the pre-D-01 chrome.tabCapture era but became functionally
dead after Plan 01-09's D-01 conversion to getDisplayMedia-in-offscreen.
The only post-D-01 consumer was a log line at index.ts:521.
The dead validation caused an activeTab-permission-scope asymmetry
between callers: chrome.action.onClicked grants activeTab on the click
gesture (so tab.url was readable → toolbar path worked silently) but
chrome.notifications.onClicked does NOT grant activeTab and the extension
has no `tabs` permission, so notifications.onClicked → startVideoCapture
threw "No active tab found" before reaching ensureOffscreen. Operator
2026-05-20 UAT against the new notifStartupCta CTA copy ("Mokosh ready.
Click to start a recording.", commit 4bba679) surfaced the silent
notification failure.
Surgical fix: remove the dead tab query + validation + tab-dependent log
(src/background/index.ts:514-521); replace with a tab-independent log
that documents WHY (cites D-01 + this debug session). captureScreenshot
+ saveArchive retain their genuine tab dependencies (tab.windowId for
chrome.tabs.captureVisibleTab; tab.id for content-script sendMessage).
Tests: tests/background/start-video-capture-no-tab.test.ts (NEW) pins
the contract with 3 cases (tabs.query → []; → [{id}] url-less; →
[{id,url,windowId}] regression guard for toolbar path).
Gates: vitest 153/153 GREEN (was 150/150 baseline; +3); test:uat 24/24
GREEN; tsc clean; build clean. Pre-checkpoint bundle gates per
feedback-pre-checkpoint-bundle-gates.md: SW chunk hook-string Tier-1
grep 0 matches; eval/Node-global/DOM-global matches unchanged from
baseline (all vendor-library feature-detect, guarded; no new imports).
Debug record: .planning/debug/resolved/01-09-notification-start-no-active-tab.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -511,14 +511,19 @@ async function startVideoCapture() {
|
||||
}
|
||||
|
||||
try {
|
||||
// Получаем активную вкладку
|
||||
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
|
||||
|
||||
if (!tab.id || !tab.url) {
|
||||
throw new Error('No active tab found');
|
||||
}
|
||||
|
||||
logger.log(`Starting video capture for tab ${tab.id}: ${tab.url}`);
|
||||
// Plan 01-09 D-01 cleanup gap (debug session
|
||||
// `01-09-notification-start-no-active-tab`, 2026-05-20):
|
||||
// The legacy chrome.tabs.query({ active: true, currentWindow: true })
|
||||
// here was load-bearing in the pre-D-01 chrome.tabCapture era but
|
||||
// is functionally dead post-D-01 — capture is whole-desktop via
|
||||
// getDisplayMedia in offscreen and the SW-side start path needs
|
||||
// no tab reference. The query also failed for chrome.notifications
|
||||
// .onClicked callers (no activeTab grant + no `tabs` permission →
|
||||
// tab.url undefined → "No active tab found" throw) so the onStartup
|
||||
// notification CTA was silently broken. captureScreenshot +
|
||||
// saveArchive retain their own genuine tab queries (tab.windowId
|
||||
// for captureVisibleTab, tab.id for content-script sendMessage).
|
||||
logger.log('Starting video capture (whole-desktop via getDisplayMedia in offscreen per D-01)');
|
||||
|
||||
// Создаём offscreen документ (с reason из D-02)
|
||||
await ensureOffscreen();
|
||||
|
||||
Reference in New Issue
Block a user