【发布时间】:2017-06-08 01:09:43
【问题描述】:
总结:我需要找到一种方法来实现与在清单上使用content_scripts > matches 和"all_frames": true 相同的行为。为什么?因为这是我发现在扩展页面中注入 iframe 的内容而不会出现跨域错误的唯一方法。
我要在 Chrome 扩展程序上转到 optional_permissions,但我走上了死胡同。
我想要什么:
将此行为移至optional_permissions,以便将来能够添加更多主机。使用当前代码,通过在 content_scripts > matches 添加一个新主机,Chrome 会禁用扩展。
为了移动,我在清单中删除了content_scripts,并添加了"optional_permissions": ["*://*/"],。然后,我成功实现了一个对话框,向chrome.permissions.request 的用户询问新权限。
正如我之前所说,问题是如何在扩展页面中注入iframe的内容。
我尝试过的:
-
chrome.declarativeContent.RequestContentScript(提到here)和allFrames: true。如果我直接输入 URL,我只能看到脚本正在运行,如果在iframe中设置该 URL,则不会发生任何事情。 -
chrome.tabs.onUpdated:url是undefined用于扩展页面。此外,未检测到iframe网址。 - 加载第一个
iframe后,立即使用allFrames: true调用chrome.tabs.executeScript。通过这样做,我得到了一个异常Cannot access contents of the page. Extension manifest must request permission to access the respective host.并且“相应的主机”是chrome-extension://,如果你想将它添加到权限中,它不是一个有效的主机。
我迷路了。我找不到一种方法来模拟与content_scripts > matches 和programmatic injection 相同的行为。
注意:使用webNavigation API 不是一个选项,因为该扩展程序已上线并且拥有数千名用户。因此,我不能将frameId 属性用于executeScript。因此,我对executeScript 的唯一选择是注入所有帧,但chrome-extension 主机问题不允许我继续。
更新:我能够完成我想要的,但只能在 HTTP 主机上完成。我使用了chrome.tabs.executeScript(选项3)。
问题仍然在于如何在扩展页面上进行这项工作。
【问题讨论】:
-
您无法将内容脚本注入到您的扩展程序中的页面中,这是您遇到的错误。您已经拥有或可以拥有在后台上下文中以提升的权限在页面中运行的 JavaScript,您不需要也不能使用内容脚本。此外,
tabs.executeScript()中的allFrames:true与 manifest.jsoncontent_scripts条目中的"all_frames": true的含义截然不同。 -
可以修改默认CSP,将youtube添加到script-src和frame-src。
-
@wOxxOm 我刚刚尝试过,但遇到了同样的
chrome-extension主机问题。如果我在 http 域中注入扩展页面内容,我可以绕过该错误。有没有办法使用declarativeContentAPI 在动态iframes 中注入代码?我在示例中写了 youtube,但我有几个域权限。 -
感谢您提供附加代码。为您已经尝试过但不起作用的事情提供代码也会很有帮助。
-
顺便说一句:虽然 IIFE 通常是很好的做法,但在代码所在的上下文/范围完全由您控制的扩展中,它们并不是必需的。除了您编写的代码之外,您的背景、内容脚本或扩展弹出窗口中没有任何内容。使用它们没有任何问题。显然,除非它们阻止您做您想做的事情(例如,在后台上下文中提供对范围之间数据的访问)。
标签: google-chrome google-chrome-extension