cdp-tunnel 1.0.13 → 1.0.14

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.
Files changed (68) hide show
  1. package/extension-new/background.js +6 -1
  2. package/extension-new/cdp/handler/special.js +47 -27
  3. package/extension-new/core/state.js +64 -6
  4. package/extension-new/core/websocket.js +124 -19
  5. package/package.json +9 -2
  6. package/server/proxy-server.js +45 -34
  7. package/.github/workflows/publish.yml +0 -92
  8. package/.github/workflows/release-assets.yml +0 -50
  9. package/PUBLISH.md +0 -65
  10. package/console-test.js +0 -52
  11. package/docs/README_CN.md +0 -204
  12. package/docs/config-page-screenshot.png +0 -0
  13. package/final-console-test.js +0 -105
  14. package/simple-tab-group-test.js +0 -56
  15. package/test-cdp-connection.js +0 -85
  16. package/test-cdp-groups.js +0 -71
  17. package/test-check-newtab.js +0 -144
  18. package/test-chrome-native.js +0 -140
  19. package/test-client-connected.js +0 -99
  20. package/test-compare-formats.js +0 -88
  21. package/test-context-features.js +0 -113
  22. package/test-create-tab.js +0 -113
  23. package/test-debug-broadcast.js +0 -52
  24. package/test-debug-targets.js +0 -127
  25. package/test-expose-newtab.js +0 -164
  26. package/test-expose-shared.js +0 -189
  27. package/test-final-logs.js +0 -110
  28. package/test-fresh-chromium.js +0 -153
  29. package/test-init-script.js +0 -128
  30. package/test-keepalive.js +0 -89
  31. package/test-launch-chromium.js +0 -140
  32. package/test-launch-vs-connect.js +0 -149
  33. package/test-listen-events.js +0 -102
  34. package/test-monitor.js +0 -83
  35. package/test-multiple-cdp-groups.js +0 -78
  36. package/test-native.js +0 -96
  37. package/test-page-connection.js +0 -74
  38. package/test-playwright-connection.js +0 -45
  39. package/test-playwright-groups.js +0 -47
  40. package/test-playwright-pages.js +0 -47
  41. package/test-playwright-sequence.js +0 -81
  42. package/test-proper-context.js +0 -129
  43. package/test-real-final.js +0 -251
  44. package/test-real-scenario-v2.js +0 -166
  45. package/test-real-scenario-v3.js +0 -231
  46. package/test-real-scenario.js +0 -104
  47. package/test-server-logs.js +0 -98
  48. package/test-session-id.js +0 -91
  49. package/test-simple-cdp-groups.js +0 -44
  50. package/test-simple-context.js +0 -137
  51. package/test-tab-group-simple.js +0 -58
  52. package/test-tab-grouping.js +0 -48
  53. package/test-three-pages.js +0 -192
  54. package/test-wait-for-page.js +0 -95
  55. package/test-with-logs.js +0 -118
  56. package/test-ws-groups.js +0 -59
  57. package/tests/e2e-auto-test.js +0 -304
  58. package/tests/iframe-test-page.html +0 -89
  59. package/tests/playwright-demo.js +0 -45
  60. package/tests/playwright-interactive.js +0 -261
  61. package/tests/playwright-multi-demo.js +0 -60
  62. package/tests/playwright-multi.js +0 -85
  63. package/tests/playwright-single.js +0 -41
  64. package/tests/screenshot-config.js +0 -35
  65. package/tests/test-client.js +0 -89
  66. package/tests/test-douyin-iframe.js +0 -171
  67. package/tests/test-iframe-debug.js +0 -204
  68. package/tests/test-multi-client.js +0 -129
@@ -1,52 +0,0 @@
1
- const WebSocket = require('ws');
2
-
3
- // 连接到代理服务器
4
- const ws = new WebSocket('ws://localhost:9221/client');
5
-
6
- ws.on('open', () => {
7
- console.log('[TEST] Connected to proxy server');
8
-
9
- // 启用 Target 域来接收 targetCreated 事件
10
- ws.send(JSON.stringify({
11
- id: 1,
12
- method: 'Target.setDiscoverTargets',
13
- params: { discover: true }
14
- }));
15
-
16
- console.log('[TEST] Sent Target.setDiscoverTargets');
17
- });
18
-
19
- ws.on('message', (data) => {
20
- try {
21
- const msg = JSON.parse(data.toString());
22
-
23
- // 只打印 Target 相关的事件
24
- if (msg.method && msg.method.startsWith('Target.')) {
25
- console.log('[EVENT]', msg.method, {
26
- targetId: msg.params?.targetInfo?.targetId?.substring(0, 8),
27
- type: msg.params?.targetInfo?.type,
28
- url: msg.params?.targetInfo?.url?.substring(0, 50)
29
- });
30
- }
31
- } catch (e) {
32
- console.log('[RAW]', data.toString().substring(0, 100));
33
- }
34
- });
35
-
36
- ws.on('close', (code, reason) => {
37
- console.log('[TEST] Connection closed:', code, reason.toString());
38
- });
39
-
40
- ws.on('error', (err) => {
41
- console.error('[TEST] Error:', err.message);
42
- });
43
-
44
- // 30秒后关闭
45
- setTimeout(() => {
46
- console.log('[TEST] Closing connection...');
47
- ws.close();
48
- process.exit(0);
49
- }, 30000);
50
-
51
- console.log('[TEST] Waiting for Target events...');
52
- console.log('[TEST] Please open a new tab manually in Chrome');
@@ -1,127 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const fs = require('fs');
3
- const path = require('path');
4
-
5
- let serverPort = 9300;
6
-
7
- async function testWithDebugging(label, port) {
8
- serverPort++;
9
- const currentPort = serverPort;
10
-
11
- console.log(`\n${'='.repeat(60)}`);
12
- console.log(`Testing ${label} (port ${port})`);
13
- console.log('='.repeat(60));
14
-
15
- try {
16
- const htmlContent1 = `
17
- <!DOCTYPE html>
18
- <html>
19
- <head><title>Page 1</title></head>
20
- <body>
21
- <h1>Page 1</h1>
22
- <a href="page2.html" target="_blank" id="link1">Open New Tab</a>
23
- </body>
24
- </html>
25
- `;
26
-
27
- const htmlContent2 = `
28
- <!DOCTYPE html>
29
- <html>
30
- <head><title>Page 2</title></head>
31
- <body>
32
- <h1>Page 2 - New Tab</h1>
33
- </body>
34
- </html>
35
- `;
36
-
37
- const serverDir = '/tmp/test-debug';
38
- if (!fs.existsSync(serverDir)) {
39
- fs.mkdirSync(serverDir, { recursive: true });
40
- }
41
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
42
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
43
-
44
- const http = require('http');
45
- const server = http.createServer((req, res) => {
46
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
47
- if (fs.existsSync(filePath)) {
48
- const content = fs.readFileSync(filePath);
49
- res.writeHead(200, { 'Content-Type': 'text/html' });
50
- res.end(content);
51
- } else {
52
- res.writeHead(404);
53
- res.end('Not found');
54
- }
55
- });
56
-
57
- await new Promise(resolve => server.listen(currentPort, resolve));
58
- console.log(`[${label}] Server on port ${currentPort}`);
59
-
60
- console.log(`[${label}] Connecting to browser...`);
61
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
62
- console.log(`[${label}] Connected!`);
63
-
64
- console.log(`[${label}] Getting all targets via CDP...`);
65
- const session = await browser.newBrowserCDPSession();
66
- const targets = await session.send('Target.getTargets');
67
-
68
- console.log(`[${label}] Current targets:`);
69
- const pageTargets = targets.targetInfos.filter(t => t.type === 'page');
70
- pageTargets.forEach(t => {
71
- console.log(` - ${t.targetId}: ${t.url} (attached: ${t.attached})`);
72
- });
73
-
74
- console.log(`[${label}] Creating context...`);
75
- const context = await browser.newContext();
76
-
77
- console.log(`[${label}] Creating first page...`);
78
- const page1 = await context.newPage();
79
- await page1.goto(`http://localhost:${currentPort}/page1.html`, { waitUntil: 'domcontentloaded' });
80
-
81
- await new Promise(r => setTimeout(r, 1000));
82
-
83
- console.log(`[${label}] Checking targets after creating first page...`);
84
- const targets2 = await session.send('Target.getTargets');
85
- const pageTargets2 = targets2.targetInfos.filter(t => t.type === 'page');
86
- pageTargets2.forEach(t => {
87
- console.log(` - ${t.targetId}: ${t.url} (attached: ${t.attached})`);
88
- });
89
-
90
- console.log(`[${label}] Clicking link...`);
91
- await page1.click('#link1');
92
-
93
- console.log(`[${label}] Waiting 5 seconds...`);
94
- await new Promise(r => setTimeout(r, 5000));
95
-
96
- console.log(`[${label}] Checking targets after clicking link...`);
97
- const targets3 = await session.send('Target.getTargets');
98
- const pageTargets3 = targets3.targetInfos.filter(t => t.type === 'page');
99
- pageTargets3.forEach(t => {
100
- console.log(` - ${t.targetId}: ${t.url} (attached: ${t.attached})`);
101
- });
102
-
103
- console.log(`[${label}] Checking context pages...`);
104
- const allPages = context.pages();
105
- console.log(`[${label}] Total pages in context: ${allPages.length}`);
106
- allPages.forEach((p, i) => {
107
- console.log(` Page ${i}: ${p.url()}`);
108
- });
109
-
110
- server.close();
111
- await browser.close();
112
-
113
- } catch (error) {
114
- console.error(`[${label}] Error:`, error.message);
115
- }
116
- }
117
-
118
- async function main() {
119
- console.log('=== CDP Target Debugging Test ===\n');
120
-
121
- console.log('### Test with CDP Tunnel (port 9221) ###');
122
- await testWithDebugging('CDP Tunnel', 9221);
123
-
124
- process.exit(0);
125
- }
126
-
127
- main();
@@ -1,164 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const { spawn } = require('child_process');
3
- const fs = require('fs');
4
- const path = require('path');
5
-
6
- let serverPort = 8800;
7
-
8
- async function testExposeFunctionNewTab(port, label) {
9
- serverPort++;
10
- const currentPort = serverPort;
11
-
12
- console.log(`\n${'='.repeat(60)}`);
13
- console.log(`Testing ${label} (port ${port})`);
14
- console.log('='.repeat(60));
15
-
16
- try {
17
- const sharedState = { counter: 0 };
18
-
19
- const htmlContent1 = `
20
- <!DOCTYPE html>
21
- <html>
22
- <head><title>Page 1</title></head>
23
- <body>
24
- <h1>Page 1</h1>
25
- <a href="page2.html" target="_blank" id="link1">Open New Tab</a>
26
- <button id="btn" onclick="window.getCounter().then(r => alert('Counter: ' + r))">Get Counter</button>
27
- </body>
28
- </html>
29
- `;
30
-
31
- const htmlContent2 = `
32
- <!DOCTYPE html>
33
- <html>
34
- <head><title>Page 2</title></head>
35
- <body>
36
- <h1>Page 2 - New Tab</h1>
37
- <button id="btn" onclick="window.getCounter().then(r => alert('Counter: ' + r))">Get Counter</button>
38
- </body>
39
- </html>
40
- `;
41
-
42
- const serverDir = '/tmp/test-expose-newtab';
43
- if (!fs.existsSync(serverDir)) {
44
- fs.mkdirSync(serverDir, { recursive: true });
45
- }
46
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
47
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
48
-
49
- const http = require('http');
50
- const server = http.createServer((req, res) => {
51
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
52
- if (fs.existsSync(filePath)) {
53
- const content = fs.readFileSync(filePath);
54
- res.writeHead(200, { 'Content-Type': 'text/html' });
55
- res.end(content);
56
- } else {
57
- res.writeHead(404);
58
- res.end('Not found');
59
- }
60
- });
61
-
62
- await new Promise(resolve => server.listen(currentPort, resolve));
63
- console.log(`[${label}] Test server started on port ${currentPort}`);
64
-
65
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
66
- console.log(`[${label}] Connected successfully!`);
67
-
68
- console.log(`[${label}] Creating new context...`);
69
- const context = await browser.newContext();
70
-
71
- console.log(`[${label}] exposeFunction getCounter...`);
72
- await context.exposeFunction('getCounter', () => {
73
- sharedState.counter += 1;
74
- console.log(`[${label}] getCounter called, counter: ${sharedState.counter}`);
75
- return sharedState.counter;
76
- });
77
-
78
- console.log(`[${label}] Creating first page...`);
79
- const page1 = await context.newPage();
80
- await page1.goto(`http://localhost:${currentPort}/page1.html`, { waitUntil: 'domcontentloaded' });
81
-
82
- console.log(`[${label}] Calling getCounter in first page...`);
83
- const r1 = await page1.evaluate(() => window.getCounter());
84
- console.log(`[${label}] First page result: ${r1}`);
85
-
86
- console.log(`[${label}] Clicking link to open new tab...`);
87
- const [page2] = await Promise.all([
88
- context.waitForEvent('page', { timeout: 10000 }),
89
- page1.click('#link1')
90
- ]);
91
-
92
- console.log(`[${label}] Waiting for new tab...`);
93
- await page2.waitForLoadState('domcontentloaded');
94
- console.log(`[${label}] New tab URL: ${page2.url()}`);
95
-
96
- console.log(`[${label}] Calling getCounter in new tab...`);
97
- const r2 = await page2.evaluate(() => window.getCounter());
98
- console.log(`[${label}] New tab result: ${r2}`);
99
-
100
- console.log(`[${label}] First page again...`);
101
- const r1a = await page1.evaluate(() => window.getCounter());
102
- console.log(`[${label}] First page again result: ${r1a}`);
103
-
104
- console.log(`[${label}] New tab again...`);
105
- const r2a = await page2.evaluate(() => window.getCounter());
106
- console.log(`[${label}] New tab again result: ${r2a}`);
107
-
108
- const success = r1 === 1 && r2 === 2 && r1a === 3 && r2a === 4;
109
-
110
- server.close();
111
-
112
- if (success) {
113
- console.log(`[${label}] ✓ PASS! Counter: 1 -> 2 -> 3 -> 4`);
114
- } else {
115
- console.log(`[${label}] ✗ FAIL! Expected: 1,2,3,4 Got: ${r1},${r2},${r1a},${r2a}`);
116
- }
117
-
118
- await browser.close();
119
- return success;
120
-
121
- } catch (error) {
122
- console.error(`[${label}] ✗ Error:`, error.message);
123
- return false;
124
- }
125
- }
126
-
127
- async function main() {
128
- console.log('Testing: Click link -> New tab -> getCounter (shared state)');
129
- console.log('Expected: 1 -> 2 -> 3 -> 4\n');
130
-
131
- console.log('Step 1: Starting fresh Chromium on port 9230...');
132
- const chromiumProcess = spawn('/Applications/Chromium.app/Contents/MacOS/Chromium', [
133
- '--remote-debugging-port=9230',
134
- '--user-data-dir=/tmp/chromium-test-newtab',
135
- '--no-first-run',
136
- '--no-default-browser-check'
137
- ], { detached: true, stdio: 'ignore' });
138
-
139
- await new Promise(resolve => setTimeout(resolve, 3000));
140
-
141
- console.log('\nStep 2: Testing Native CDP...');
142
- const nativeResult = await testExposeFunctionNewTab(9230, 'Native CDP');
143
-
144
- await new Promise(resolve => setTimeout(resolve, 1000));
145
-
146
- console.log('\nStep 3: Testing CDP Tunnel...');
147
- const tunnelResult = await testExposeFunctionNewTab(9221, 'CDP Tunnel');
148
-
149
- try { process.kill(-chromiumProcess.pid); } catch (e) {}
150
-
151
- console.log('\n' + '='.repeat(60));
152
- console.log(`Native CDP: ${nativeResult ? '✓ PASS' : '✗ FAIL'}`);
153
- console.log(`CDP Tunnel: ${tunnelResult ? '✓ PASS' : '✗ FAIL'}`);
154
-
155
- if (nativeResult && tunnelResult) {
156
- console.log('\n✓ Both work identically!');
157
- } else if (!nativeResult && tunnelResult) {
158
- console.log('\n✓ CDP Tunnel works! Native CDP has limitations.');
159
- }
160
-
161
- process.exit(0);
162
- }
163
-
164
- main();
@@ -1,189 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const { spawn } = require('child_process');
3
- const fs = require('fs');
4
- const path = require('path');
5
-
6
- async function testExposeFunctionSharedState(port, label) {
7
- console.log(`\n${'='.repeat(60)}`);
8
- console.log(`Testing ${label} (port ${port})`);
9
- console.log('='.repeat(60));
10
-
11
- try {
12
- const sharedState = { counter: 0 };
13
-
14
- const htmlContent1 = `
15
- <!DOCTYPE html>
16
- <html>
17
- <head><title>Page 1</title></head>
18
- <body>
19
- <h1>Page 1 - Source</h1>
20
- <button onclick="window.getAndIncrementCounter().then(r => document.getElementById('result').innerText = r)">
21
- Get Counter
22
- </button>
23
- <div id="result">Click button to get counter</div>
24
- <a href="page2.html" target="_blank">Open New Tab</a>
25
- </body>
26
- </html>
27
- `;
28
-
29
- const htmlContent2 = `
30
- <!DOCTYPE html>
31
- <html>
32
- <head><title>Page 2</title></head>
33
- <body>
34
- <h1>Page 2 - New Tab</h1>
35
- <button onclick="window.getAndIncrementCounter().then(r => document.getElementById('result').innerText = r)">
36
- Get Counter
37
- </button>
38
- <div id="result">Click button to get counter</div>
39
- </body>
40
- </html>
41
- `;
42
-
43
- const serverDir = '/tmp/test-expose';
44
- if (!fs.existsSync(serverDir)) {
45
- fs.mkdirSync(serverDir, { recursive: true });
46
- }
47
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
48
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
49
-
50
- const http = require('http');
51
- const server = http.createServer((req, res) => {
52
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
53
- if (fs.existsSync(filePath)) {
54
- const content = fs.readFileSync(filePath);
55
- res.writeHead(200, { 'Content-Type': 'text/html' });
56
- res.end(content);
57
- } else {
58
- res.writeHead(404);
59
- res.end('Not found');
60
- }
61
- });
62
-
63
- await new Promise(resolve => server.listen(8767, resolve));
64
- console.log(`[${label}] Test server started on port 8767`);
65
-
66
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
67
- console.log(`[${label}] Connected successfully!`);
68
-
69
- console.log(`[${label}] Creating new context...`);
70
- const context = await browser.newContext();
71
-
72
- console.log(`[${label}] Testing exposeFunction (shared counter)...`);
73
- await context.exposeFunction('getAndIncrementCounter', () => {
74
- sharedState.counter += 1;
75
- console.log(`[${label}] getAndIncrementCounter called, counter: ${sharedState.counter}`);
76
- return sharedState.counter;
77
- });
78
-
79
- console.log(`[${label}] Creating first page...`);
80
- const page1 = await context.newPage();
81
- await page1.goto('http://localhost:8767/page1.html', { waitUntil: 'domcontentloaded' });
82
-
83
- console.log(`[${label}] Calling getAndIncrementCounter in first page...`);
84
- const result1 = await page1.evaluate(() => window.getAndIncrementCounter());
85
- console.log(`[${label}] First page counter:`, result1);
86
-
87
- console.log(`[${label}] Clicking link to open new tab...`);
88
- try {
89
- const [page2] = await Promise.all([
90
- context.waitForEvent('page', { timeout: 10000 }),
91
- page1.click('a:first-child')
92
- ]);
93
-
94
- console.log(`[${label}] Waiting for new tab to load...`);
95
- await page2.waitForLoadState('domcontentloaded');
96
- console.log(`[${label}] New tab URL: ${page2.url()}`);
97
-
98
- console.log(`[${label}] Calling getAndIncrementCounter in new tab...`);
99
- const result2 = await page2.evaluate(() => window.getAndIncrementCounter());
100
- console.log(`[${label}] New tab counter:`, result2);
101
-
102
- console.log(`[${label}] Switching back to first page and calling again...`);
103
- await page1.bringToFront();
104
- const result1Again = await page1.evaluate(() => window.getAndIncrementCounter());
105
- console.log(`[${label}] First page counter (after switch):`, result1Again);
106
-
107
- console.log(`[${label}] Calling in new tab again...`);
108
- const result2Again = await page2.evaluate(() => window.getAndIncrementCounter());
109
- console.log(`[${label}] New tab counter (again):`, result2Again);
110
-
111
- const success = result1 === 1 && result2 === 2 && result1Again === 3 && result2Again === 4;
112
-
113
- server.close();
114
-
115
- if (success) {
116
- console.log(`[${label}] ✓ All tests passed!`);
117
- console.log(`[${label}] ✓ exposeFunction shared state works across tabs!`);
118
- } else {
119
- console.log(`[${label}] ✗ Counter values incorrect!`);
120
- console.log(`[${label}] Expected: 1, 2, 3, 4 | Got: ${result1}, ${result2}, ${result1Again}, ${result2Again}`);
121
- }
122
-
123
- await browser.close();
124
- return success;
125
-
126
- } catch (e) {
127
- console.log(`[${label}] Error: ${e.message}`);
128
- server.close();
129
- await browser.close();
130
- return false;
131
- }
132
-
133
- } catch (error) {
134
- console.error(`[${label}] ✗ Error:`, error.message);
135
- console.error(`[${label}] Stack:`, error.stack);
136
- return false;
137
- }
138
- }
139
-
140
- async function main() {
141
- console.log('Testing: exposeFunction shared state across tabs');
142
- console.log('Expected: Counter increments across ALL pages (1 -> 2 -> 3 -> 4)\n');
143
-
144
- console.log('Step 1: Starting fresh Chromium instance on port 9229...');
145
- const chromiumProcess = spawn('/Applications/Chromium.app/Contents/MacOS/Chromium', [
146
- '--remote-debugging-port=9229',
147
- '--user-data-dir=/tmp/chromium-test-expose',
148
- '--no-first-run',
149
- '--no-default-browser-check'
150
- ], {
151
- detached: true,
152
- stdio: 'ignore'
153
- });
154
-
155
- console.log('Waiting for Chromium to start...');
156
- await new Promise(resolve => setTimeout(resolve, 3000));
157
-
158
- console.log('\nStep 2: Testing Native CDP...');
159
- const nativeResult = await testExposeFunctionSharedState(9229, 'Native CDP');
160
-
161
- console.log('\nStep 3: Testing CDP Tunnel...');
162
- const tunnelResult = await testExposeFunctionSharedState(9221, 'CDP Tunnel');
163
-
164
- console.log('\nStep 4: Cleaning up...');
165
- try {
166
- process.kill(-chromiumProcess.pid);
167
- } catch (e) {}
168
-
169
- console.log('\n' + '='.repeat(60));
170
- console.log('COMPARISON RESULTS');
171
- console.log('='.repeat(60));
172
- console.log(`Native CDP (port 9229): ${nativeResult ? '✓ PASS' : '✗ FAIL'}`);
173
- console.log(`CDP Tunnel (port 9221): ${tunnelResult ? '✓ PASS' : '✗ FAIL'}`);
174
-
175
- if (nativeResult && tunnelResult) {
176
- console.log('\n✓ Both implementations behave identically!');
177
- console.log('✓ exposeFunction shared state works across tabs!');
178
- } else if (nativeResult && !tunnelResult) {
179
- console.log('\n✗ CDP Tunnel has issues with exposeFunction shared state!');
180
- } else if (!nativeResult && tunnelResult) {
181
- console.log('\n? CDP Tunnel works but Native CDP has issues (unexpected)!');
182
- } else {
183
- console.log('\n✗ Both implementations have issues!');
184
- }
185
-
186
- process.exit(0);
187
- }
188
-
189
- main();
@@ -1,110 +0,0 @@
1
- const { chromium } = require('playwright');
2
- const fs = require('fs');
3
- const path = require('path');
4
- const http = require('http');
5
-
6
- let serverPort = 9500;
7
-
8
- async function testWithLogs(label, port) {
9
- serverPort++;
10
- const currentPort = serverPort;
11
-
12
- console.log(`\n${'='.repeat(60)}`);
13
- console.log(`Testing ${label} (port ${port})`);
14
- console.log('='.repeat(60));
15
-
16
- const htmlContent1 = `
17
- <!DOCTYPE html>
18
- <html>
19
- <head><title>Page 1</title></head>
20
- <body>
21
- <h1>Page 1 - Click the link below</h1>
22
- <a href="page2.html" target="_blank" id="link1">Open New Tab</a>
23
- </body>
24
- </html>
25
- `;
26
-
27
- const htmlContent2 = `
28
- <!DOCTYPE html>
29
- <html>
30
- <head><title>Page 2</title></head>
31
- <body>
32
- <h1>Page 2 - New Tab Opened!</h1>
33
- </body>
34
- </html>
35
- `;
36
-
37
- const serverDir = '/tmp/test-logs2';
38
- if (!fs.existsSync(serverDir)) {
39
- fs.mkdirSync(serverDir, { recursive: true });
40
- }
41
- fs.writeFileSync(path.join(serverDir, 'page1.html'), htmlContent1);
42
- fs.writeFileSync(path.join(serverDir, 'page2.html'), htmlContent2);
43
-
44
- const server = http.createServer((req, res) => {
45
- let filePath = path.join(serverDir, req.url === '/' ? 'page1.html' : req.url);
46
- if (fs.existsSync(filePath)) {
47
- const content = fs.readFileSync(filePath);
48
- res.writeHead(200, { 'Content-Type': 'text/html' });
49
- res.end(content);
50
- } else {
51
- res.writeHead(404);
52
- res.end('Not found');
53
- }
54
- });
55
-
56
- await new Promise(resolve => server.listen(currentPort, resolve));
57
- console.log(`Server: http://localhost:${currentPort}/page1.html`);
58
-
59
- console.log('\nConnecting to CDP Tunnel...');
60
- const browser = await chromium.connectOverCDP(`http://localhost:${port}`);
61
- console.log('Connected!');
62
-
63
- console.log('Creating context...');
64
- const context = await browser.newContext();
65
-
66
- console.log('Creating first page...');
67
- const page1 = await context.newPage();
68
- await page1.goto(`http://localhost:${currentPort}/page1.html`, { waitUntil: 'domcontentloaded' });
69
- console.log(`First page loaded: ${page1.url()}`);
70
-
71
- console.log('\n>>> CLICK THE LINK NOW - Check extension logs! <<<');
72
- console.log('>>> Look for: [Tabs] Tab created or Tab not controlled <<<\n');
73
-
74
- await page1.click('#link1');
75
-
76
- console.log('Waiting 10 seconds for you to check logs...');
77
- await new Promise(r => setTimeout(r, 10000));
78
-
79
- console.log('\nChecking results...');
80
- const allPages = context.pages();
81
- console.log(`Total pages in context: ${allPages.length}`);
82
- allPages.forEach((p, i) => {
83
- console.log(` Page ${i}: ${p.url()}`);
84
- });
85
-
86
- if (allPages.length >= 2) {
87
- console.log('\n✓ SUCCESS!');
88
- } else {
89
- console.log('\n✗ FAILED - Please copy the extension logs now!');
90
- console.log('Look for: [Tabs] Tab created: or Tab not controlled:');
91
- }
92
-
93
- server.close();
94
- await browser.close();
95
- }
96
-
97
- async function main() {
98
- console.log('=== Test - Check Extension Logs ===\n');
99
- console.log('INSTRUCTIONS:');
100
- console.log('1. Make sure extension popup DevTools is open');
101
- console.log('2. When you see "CLICK THE LINK NOW", click the link in the page');
102
- console.log('3. Watch the extension logs for: [Tabs] Tab created');
103
- console.log('4. Copy those logs and paste them here\n');
104
-
105
- await testWithLogs('CDP Tunnel', 9221);
106
-
107
- process.exit(0);
108
- }
109
-
110
- main();