我正在使用使用 MV3 的 Chrome 扩展将每个帧转换为影子根(以内联其内容),我需要这个,因为我无法将
iframe/embed/object
帧从浏览器复制并粘贴到 OneNote、Word 等我选择了所有页面,我必须一一选择框架内容,但这会消耗大量时间。所以我决定转换它们,这样我就可以一次将它们全部复制ctrl-c
。
我解决了
iframes
,并且转换效果很好,我使用chrome.webNavigation.getAllFrames
注入每个框架及其父框架,然后我在它们之间插入内容,然后我从父框架替换子框架内容,因为我可以现在通过 postMessage
我用 postMessage
得到的 frameid
来识别子框架。但我无法解决getAllFrames
框架:
元素 (HTMLEmbedElement) 没有 contentWindow 或
contentDocument 因此我们无法将消息从父级发送到其嵌入 框架窗框
<embed>
确实包含来自
window.frames[]
的窗口,但是无法判断<embed>
中的项目是否属于特定的window.frames[]
,除了在<embed>
中
情况,其中 same-origin
可以与 frames[i].frameElement
元素进行比较。 链接但是这个方法并不总是有效
,因为<embed>
框架没有暴露在全局窗口或框架中,我的意思是
ShadowDOM
不包括window.frames
,如果它们位于阴影根内。 1234。当然还有跨域问题。 框架.src
iframe/embed
(或
src
(从嵌入发送到其父级))获得的框架 getAllFrames
与从框架父级获得的 window.location.href
进行比较。这使我能够从父级识别正确的嵌入框架,我必须将其转换为影子根。 但是如果嵌入框架重定向到新的 url,此方法就会失败,标准说得很清楚: 如果内容可导航,则元素的 src 属性不会更新 进一步导航到其他位置。
链接getFrameId()
frame.src
似乎可以解决所有这些问题,
但Chrome不想实现它,Firefox实现了它,但我正在使用chrome。 没有好的解决方案:
runtime.getFrameId()
api 来拦截重定向并保存新旧 url 以识别正确的框架,但这意味着我必须刷新页面,我想避免这种情况,因为我做所有这些工作是为了在复制/粘贴时赢得时间,而不是浪费更多时间。刷新意味着
我必须等待更多时间并且我需要重新打开任何
webrequest
...等等禁用网络安全
<details><summary>
这会禁用网络安全,从而消除同源策略限制,从而解决跨源问题,
但我不能一直使用这个危险标志运行,并且每次运行带有此标志的新chrome只是为了复制/粘贴意味着浪费更多时间... 所以现在要从其父框架中识别嵌入框架,如果重定向,我不能使用父框架中的
--profile-directory="%Profile_name%" --restore-last-session --disable-site-isolation-trials --disable-web-security
,并且我不能像我在
frame.src
中那样从父框架到其子嵌入框架 postmessage
,并且我无法将 iframes
用于 window.frames
框架或当框架位于 cross-origin
内时。还有其他解决办法吗?如果您需要测试用例,这里是一个跨源框架的示例,它将重定向到新的 url
shadow-root
更新 wOxxOm 建议
跨源 iframe 仍然无法通过 chrome.debugger 进行调试
https://issues.chromium.org/issues/40752731<div><embed src="https://iperasolutions.com" height="500" width="500"></div>
chrome.debugger.attach({ tabId: tabId }, "1.3", function () {
// Enable auto-attach to subtargets
chrome.debugger.sendCommand({ tabId: tabId }, "Target.setAutoAttach", {
autoAttach: true,
waitForDebuggerOnStart: false,
flatten: true,
}, function () {
chrome.debugger.sendCommand({ tabId: tabId }, "DOMSnapshot.captureSnapshot", { computedStyles: [] }, function (snapshot) {
console.log("snapshot", snapshot);
});
});
元素替换为
<embed>
元素,以便您可以按照自己的意愿与其进行交流。注入如下所示的东西就可以了。
<iframe>
(这可能会导致页面布局出现一些差异)。