我无法访问我在chrome扩展程序中以编程方式打开的窗口的DOM。我相信这可能是由于源/跨站点脚本限制。我试图给它最大的权限,包括"< all_urls>"," activeTab"和"标签"
我还玩过" content_security_policy _"设置,但从我希望的文档,而不是期望帮助。
我有一个简单的扩展,在单击按钮时运行代码,我想打开几个不同的选项卡(但来自不同的域),然后访问每个选项卡的DOM。但是,如果我在域的选项卡上然后打开同一域的另一个选项卡,它似乎才有效。然后我可以访问新选项卡的窗口加载。当它是一个不同的领域时,我没有运气。
e.g。如果我按下带有activeTab的按钮" foo.com"然后,如果它window.open
是一个新选项卡" foo.com/something"然后我可以访问该打开的选项卡的文档。但如果它是" bar.com"然后我就无法访问" foo.com/something"' DOM
P.S。请注意,使用executeScripts
而不是清单内容脚本,因为我的代码必须能够工作。我必须以这种方式注入至少一些文件,否则我的代码将无法工作(原因在示例中并不完全明显)
我能解决这个问题的方法 - 我的意思是能够访问我打开的任何标签的DOM,无论在按下扩展按钮时活动标签中的哪个网站工具栏?
我是否应该将内容脚本注入已使用window.open
打开的标签,并以某种方式将其文档传递给Code.js
?如果是这样,我怎么能这样做呢?我可以以某种方式将文件传递给background.js
吗?并以某种方式将其传递给注入的Code.js
?
如果这样可以解决(绕过安全限制),那么这些内容脚本是否可以以编程方式注入(我不确切地知道它们将在运行时到底是什么网站,因此我无法在清单)
或者有什么方法可以放宽安全限制,并能够直接访问window.open
window
document
的{{1}}? (正如我上面提到的,目前只适用于同域网站)
// this is the background code...
// listen for our browerAction to be clicked
chrome.browserAction.onClicked.addListener(function (tab) {
executeScripts(null, [ // jquery can be inserted here: https://stackoverflow.com/questions/21317476/how-to-use-jquery-in-chrome-extension
{ file: "lib/jquery-3.2.1.js" },
{ file: "lib/kotlin.js" },
{ file: "Code.js" } // don't include it in manifest "content_scripts" because it gives an error about kotlin.js not present that way
])
});
/*
* https://stackoverflow.com/questions/21535233/injecting-multiple-scripts-through-executescript-in-google-chrome
*/
function executeScripts(tabId, injectDetailsArray)
{
function createCallback(tabId, injectDetails, innerCallback) {
return function () {
chrome.tabs.executeScript(tabId, injectDetails, innerCallback);
};
}
var callback = null;
for (var i = injectDetailsArray.length - 1; i >= 0; --i)
callback = createCallback(tabId, injectDetailsArray[i], callback);
if (callback !== null)
callback(); // execute outermost function
}
background.js
Code.js
调用以var w = window.open(url)
w.addEventListener("load", ...)
,这就是问题所在。仅当URL与活动选项卡属于同一域时才会触发。 (onLoad
不能以任何方式使用,它永远不会触发我使用addEventListener
的原因"manifest_version": 2