chrome-devtools-mcp-for-extension 0.9.5 → 0.9.7

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.
@@ -69,41 +69,54 @@ export async function inspectIframe(cdp, urlPattern, waitMs = 8000) {
69
69
  };
70
70
  }
71
71
  catch (oopifError) {
72
- // Fallback: Try regular iframe via Page.getFrameTree
73
- await cdp.send('Page.enable');
74
- const { frameTree } = await cdp.send('Page.getFrameTree');
75
- const findFrame = (node) => {
76
- if (urlPattern.test(node.frame.url)) {
77
- return node.frame;
78
- }
79
- if (node.childFrames) {
80
- for (const child of node.childFrames) {
81
- const found = findFrame(child);
82
- if (found)
83
- return found;
84
- }
72
+ // Fallback: Access iframe content through parent page's DOM
73
+ await cdp.send('Runtime.enable');
74
+ const iframeAccessScript = `
75
+ (function() {
76
+ const pattern = ${urlPattern};
77
+ const iframes = Array.from(document.querySelectorAll('iframe'));
78
+
79
+ for (const iframe of iframes) {
80
+ if (pattern.test(iframe.src)) {
81
+ try {
82
+ // Try to access contentDocument/contentWindow
83
+ const doc = iframe.contentDocument || iframe.contentWindow?.document;
84
+ if (doc) {
85
+ return {
86
+ success: true,
87
+ src: iframe.src,
88
+ html: doc.documentElement.outerHTML
89
+ };
90
+ }
91
+ } catch (securityError) {
92
+ // If blocked by same-origin policy, return error details
93
+ return {
94
+ success: false,
95
+ src: iframe.src,
96
+ error: 'SecurityError: ' + securityError.message
97
+ };
85
98
  }
86
- return null;
87
- };
88
- const frame = findFrame(frameTree);
89
- if (!frame) {
90
- throw new Error(`Iframe not found (tried both OOPIF and regular iframe): ${urlPattern}`);
99
+ }
91
100
  }
92
- // Execute in the frame context using Page.createIsolatedWorld
93
- const { executionContextId } = await cdp.send('Page.createIsolatedWorld', {
94
- frameId: frame.id,
95
- });
96
- await cdp.send('Runtime.enable');
97
- const htmlResult = await cdp.send('Runtime.evaluate', {
98
- expression: 'document.documentElement.outerHTML',
101
+
102
+ return {
103
+ success: false,
104
+ error: 'Iframe not found matching pattern: ' + pattern.toString()
105
+ };
106
+ })()
107
+ `;
108
+ const evalResult = await cdp.send('Runtime.evaluate', {
109
+ expression: iframeAccessScript,
99
110
  returnByValue: true,
100
- contextId: executionContextId,
101
111
  });
102
- const html = String(htmlResult?.result?.value ?? '');
112
+ const data = evalResult?.result?.value;
113
+ if (!data?.success) {
114
+ throw new Error(`Iframe access failed: ${data?.error || 'Unknown error'}`);
115
+ }
103
116
  return {
104
- frameId: frame.id,
105
- frameUrl: frame.url,
106
- html,
117
+ frameId: null,
118
+ frameUrl: data.src || '',
119
+ html: data.html || '',
107
120
  };
108
121
  }
109
122
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chrome-devtools-mcp-for-extension",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "MCP server for Chrome extension development with Web Store automation. Fork of chrome-devtools-mcp with extension-specific tools.",
5
5
  "type": "module",
6
6
  "bin": "./build/src/index.js",