重定向后如何识别或向跨源<embed>元素发送消息

问题描述 投票:0回答:1

我正在使用使用 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
,如果它们位于阴影根内。
1
234。当然还有跨域问题。 框架.src

另一个解决方案是将我从

iframe/embed

(或

src
(从嵌入发送到其父级))获得的框架
getAllFrames
与从框架父级获得的
window.location.href
进行比较。这使我能够从父级识别正确的嵌入框架,我必须将其转换为影子根。
但是如果嵌入框架重定向到新的 url,此方法就会失败
,标准说得很清楚:

如果内容可导航,则元素的 src 属性不会更新 进一步导航到其他位置。
链接

getFrameId()

还有

frame.src

似乎可以解决所有这些问题,

但Chrome不想
实现它,Firefox实现了它,但我正在使用chrome。 没有好的解决方案:

网络请求

我可以使用的一个解决方案是

runtime.getFrameId()

api 来拦截重定向并保存新旧 url 以识别正确的框架,但这意味着我必须刷新页面,我想避免这种情况,因为我做所有这些工作是为了在复制/粘贴时赢得时间,而不是浪费更多时间。刷新意味着

我必须等待更多时间
并且我需要重新打开任何webrequest...等等
禁用网络安全

我可以使用此标志运行 chrome

<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>

javascript google-chrome-extension same-origin-policy frames postmessage
1个回答
0
投票
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>

(这可能会导致页面布局出现一些差异)。

© www.soinside.com 2019 - 2024. All rights reserved.