From 4e295ce1396b940445464f1427c0e99c60e43fe3 Mon Sep 17 00:00:00 2001 From: leeguooooo Date: Mon, 15 Jun 2026 12:08:32 +0900 Subject: [PATCH] fix(ab-connect): recover a churned-tabId session by stable CDP targetId (0.4.9, #24) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Live-reproduced #24 on 0.4.8 driving the Mercari signin token-exchange hop (login.jp.mercari.com): the cross-process nav gives the tab a NEW Chrome tabId while the CDP targetId stays the same. So cb-tab- can't be recovered — recoverSessionTab parsed the old tabId, chrome.tabs.get(oldTabId) failed (gone), and it gave up → permanent 'stale sessionId ... its tab is gone' until the page settled ~6s later and something re-attached. current/tab /daemon restart all failed because the relay still mapped the targetId to the dead session. Fix: remember each session's targetId across detach (sessionTargets map). When recoverSessionTab can't recover by the encoded tabId, fall back to the STABLE targetId — chrome.debugger.getTargets() to find the tab now hosting that target, attach it, and ALIAS the dead cb-tab- session to the live tab so the daemon's session id keeps resolving. Longer retry window (~6s) since this hop takes seconds to settle. Builds on 0.4.6/0.4.8 reattach; covers the tabId-churn case those missed. Needs dogfood on the real Mercari flow (can't repro the tabId churn synthetically). --- extensions/ab-connect.crx | Bin 32306 -> 32901 bytes extensions/ab-connect.zip | Bin 31756 -> 32352 bytes extensions/ab-connect/background.js | 63 +++++++++++++++++++++++----- extensions/ab-connect/manifest.json | 2 +- 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/extensions/ab-connect.crx b/extensions/ab-connect.crx index c2b95a6f09b1064d88c7a9b1dceb0d8a8f3bbb3e..ab8e7d232afa92fbd6258b9b6c166a8a456a4785 100644 GIT binary patch delta 8175 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 diff --git a/extensions/ab-connect.zip b/extensions/ab-connect.zip index 75d936e6c969d3d3d22e6a4e48dd451f1649bc12..489540aa2d8b33ad91093ea577563e7db43eb4dd 100644 GIT binary patch delta 8360 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”(d&X_yNz~tnT$N+ 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 diff --git a/extensions/ab-connect/background.js b/extensions/ab-connect/background.js index f08f994..13aa2ec 100644 --- a/extensions/ab-connect/background.js +++ b/extensions/ab-connect/background.js @@ -30,6 +30,16 @@ const tabs = new Map() const sessionToTab = new Map() /** child (OOPIF/worker) sessionId -> tabId */ const childSessionToTab = new Map() +/** sessionId -> CDP targetId, kept ACROSS detach so a dead `cb-tab-` + * session can be recovered by its stable targetId when the cross-process nav + * gave the tab a new Chrome tabId (issue #24). Capped to bound memory. */ +const sessionTargets = new Map() +function rememberSessionTarget(sessionId, targetId) { + if (!sessionId || !targetId) return + sessionTargets.delete(sessionId) + sessionTargets.set(sessionId, targetId) + if (sessionTargets.size > 256) sessionTargets.delete(sessionTargets.keys().next().value) +} /** tab-group name -> chrome tabGroups id (best-effort cache) */ const groupIdByName = new Map() @@ -172,17 +182,49 @@ function tabIdFromSession(sessionId) { // (closed / restricted). (issues #20.1, #23) async function recoverSessionTab(sessionId) { const tabId = tabIdFromSession(sessionId) - if (tabId == null) return null - for (let i = 0; i < 3; i++) { - const tab = await chrome.tabs.get(tabId).catch(() => null) - if (!eligible(tab)) return null - try { - await attachTab(tabId) - if (tabs.has(tabId)) return tabId - } catch { - // mid-swap: the tab exists but isn't attachable yet — back off and retry. + // 1) Fast path: the encoded Chrome tabId still exists — re-attach it (covers + // the common renderer-process swap where the tabId is preserved, #23). + if (tabId != null) { + for (let i = 0; i < 3; i++) { + const tab = await chrome.tabs.get(tabId).catch(() => null) + if (!eligible(tab)) break // tabId is gone — fall through to targetId recovery + try { + await attachTab(tabId) + if (tabs.has(tabId)) return tabId + } catch { + // mid-swap: tab exists but isn't attachable yet — back off and retry. + } + await new Promise((r) => setTimeout(r, 120 + i * 150)) + } + } + // 2) The Chrome tabId is gone, but the CDP targetId is STABLE across the nav. + // Some cross-process hops (Mercari's signin token exchange) give the tab a + // NEW tabId while keeping the same target, so `cb-tab-` can't be + // recovered by tabId. Find the tab now hosting our remembered targetId via + // chrome.debugger.getTargets(), attach it, and ALIAS the dead session to it + // so the daemon's session id keeps resolving. Longer window: this hop can + // take several seconds to settle (issue #24). + const targetId = sessionTargets.get(sessionId) + if (targetId) { + for (let i = 0; i < 6; i++) { + const targets = await chrome.debugger.getTargets().catch(() => null) + const t = targets && targets.find((x) => x.id === targetId && x.tabId != null) + if (t && t.tabId != null) { + const tab = await chrome.tabs.get(t.tabId).catch(() => null) + if (eligible(tab)) { + try { + await attachTab(t.tabId) + if (tabs.has(t.tabId)) { + sessionToTab.set(sessionId, t.tabId) // alias dead session -> live tab + return t.tabId + } + } catch { + // not attachable yet — keep waiting for the swap to settle. + } + } + } + await new Promise((r) => setTimeout(r, 300 + i * 300)) } - await new Promise((r) => setTimeout(r, 120 + i * 150)) } return null } @@ -343,6 +385,7 @@ async function attachTab(tabId) { const entry = { sessionId, targetId } tabs.set(tabId, entry) sessionToTab.set(sessionId, tabId) + rememberSessionTarget(sessionId, targetId) setBadge(tabId, port ? 'on' : 'connecting') postToHost({ method: 'forwardCDPEvent', diff --git a/extensions/ab-connect/manifest.json b/extensions/ab-connect/manifest.json index aa6d63b..890517e 100644 --- a/extensions/ab-connect/manifest.json +++ b/extensions/ab-connect/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "chrome-use", - "version": "0.4.8", + "version": "0.4.9", "description": "Let chrome-use drive your logged-in Chrome \u2014 install once, no token, no per-use confirmation.", "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6vQIyscGIPYPZdSpPwPL0+0gxUROyRgCpmvCSDoc8XUm4qm97VbKnD9Ijc1lV22lNWZtE78gaRjt6BeSfuMgnBymnhLKjN1gU6AI5QUU0mrJyeHdWKvrKQR5FmsM2A7Xr1ykE2SiiS8zNUS3Y/6O5l+Nva7wrVy6E4a2dkBVQkOsu+DV+nEZvhIyuDY5D5SPXqNwUTWTaglwj5mjvHz36xSwCWlPmrtJ+ED0AUyrb2z4GIOmvk4kqtBVrh/UD058klLo4CkYOnIybB5aV6WYuwarfPY4bF/dLggPem+ewLNTUNBuwrxj/A4nUv0LJTuRO8rR7f8WR9qnRCY0Ic5saQIDAQAB", "icons": {