cdp-tunnel 2.10.11 → 2.10.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -501,7 +501,8 @@ var LocalHandler = (function() {
501
501
  targetId: target.id || String(target.tabId),
502
502
  type: target.type || 'page',
503
503
  title: target.title || '',
504
- url: target.url || '',
504
+ // 原生 Chrome CDP 中 page 类型 targeturl 一定存在(至少 "about:blank")
505
+ url: target.url || 'about:blank',
505
506
  attached: !!target.attached,
506
507
  canAccessOpener: false,
507
508
  browserContextId: 'default'
@@ -72,6 +72,10 @@ var DebuggerManager = (function() {
72
72
  })();
73
73
  `;
74
74
 
75
+ // 跟踪每个 tab 最后一次非 about:blank 的导航 url
76
+ // 用于过滤 attach 时 Chrome 重放的 about:blank frameNavigated 事件
77
+ var tabLastRealUrl = {};
78
+
75
79
  function attach(tabId, connState) {
76
80
  var state = connState || _getAnyStateForTab(tabId);
77
81
  if (tabId == null) {
@@ -289,6 +293,23 @@ var DebuggerManager = (function() {
289
293
  }
290
294
  }
291
295
 
296
+ // 过滤 attach 时 Chrome 重放的 about:blank frameNavigated 事件
297
+ // 原生 Chrome CDP 中,navigate 成功后不会回退到 about:blank
298
+ if (method === 'Page.frameNavigated' && params && params.frame) {
299
+ var navUrl = params.frame.url || '';
300
+ var tabIdKey = String(source.tabId);
301
+
302
+ if (navUrl && navUrl !== 'about:blank') {
303
+ // 记录真实导航 url
304
+ tabLastRealUrl[tabIdKey] = navUrl;
305
+ } else if (navUrl === 'about:blank' && tabLastRealUrl[tabIdKey]) {
306
+ // tab 已经导航到真实 url,但收到 about:blank 的 frameNavigated
307
+ // 这是 attach 时 Chrome 重放的旧事件,过滤掉
308
+ Logger.info('[Event] Filtering stale about:blank frameNavigated for tab', source.tabId, '(real url:', tabLastRealUrl[tabIdKey] + ')');
309
+ return;
310
+ }
311
+ }
312
+
292
313
  for (var i = 0; i < sessionIds.length; i++) {
293
314
  EventBuilder.send(method, params, sessionIds[i], wsManager);
294
315
  }
@@ -297,6 +318,8 @@ var DebuggerManager = (function() {
297
318
  function handleDetach(source, reason) {
298
319
  Logger.info('[Debugger] Detached from tab', source.tabId, ', reason:', reason);
299
320
 
321
+ delete tabLastRealUrl[String(source.tabId)];
322
+
300
323
  var entry = ConnectionManager.getConnectionByTabId(source.tabId);
301
324
  var state = entry ? entry.state : null;
302
325
  var wsManager = entry ? entry.wsManager : null;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "CDP Bridge",
4
- "version": "2.10.11",
4
+ "version": "2.10.12",
5
5
  "description": "Chrome DevTools Protocol Bridge for Playwright/Puppeteer automation",
6
6
  "permissions": [
7
7
  "debugger",
@@ -1,5 +1,5 @@
1
1
  var Config = {
2
- WS_URL: 'ws://localhost:17606/plugin',
2
+ WS_URL: 'ws://localhost:19286/plugin',
3
3
  RECONNECT_DELAY: 3000,
4
4
  DEBUGGER_VERSION: '1.3',
5
5
  HEARTBEAT_INTERVAL: 25000,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdp-tunnel",
3
- "version": "2.10.11",
3
+ "version": "2.10.12",
4
4
  "description": "Bridge Chrome's debugger API to WebSocket — control your existing browser with Playwright/Puppeteer via CDP",
5
5
  "main": "server/proxy-server.js",
6
6
  "bin": "./cli/index.js",
@@ -361,17 +361,9 @@ async function handleHttpRequest(req, res) {
361
361
  if (url.pathname === '/json' || url.pathname === '/json/' ||
362
362
  url.pathname === '/json/list' || url.pathname === '/json/list/' ||
363
363
  url.pathname.match(/^\/json\/list\/[^/]+$/)) {
364
- // create 模式(9221):HTTP /json/list clientId 上下文,无法做归属过滤
365
- // 标准客户端(Playwright/Puppeteer)走 WS Target.setAutoAttach,不依赖此接口
366
- // takeover 模式(9222):操作的是用户自己的 tab,返回全部是预期行为
367
- if (!req._takeoverMode) {
368
- if (shouldLog('info')) {
369
- console.log(`[JSON LIST] create mode — returning empty list for isolation`);
370
- }
371
- res.writeHead(200, { 'Content-Type': 'application/json' });
372
- res.end(JSON.stringify([]));
373
- return;
374
- }
364
+ // 注意:Playwright connectOverCDP 和 Puppeteer connect 都依赖 /json/list 发现 targets
365
+ // HTTP 端无 clientId 上下文,无法做归属过滤,但 attach 路径(handlePageConnection)有归属校验
366
+ // 所以即使列表可见,无归属 target 也无法被 attach(close 1008)
375
367
  const pluginWs = resolvePluginFromUrl(url);
376
368
  const targets = await requestTargetsFromPlugin(pluginWs);
377
369
  const browserId = pluginWs ? pluginWs.pluginId : BROWSER_ID;