访问包含与活动选项卡不同的域的以编程方式打开的选项卡的DOM

时间:2017-06-26 08:01:13

标签: javascript google-chrome-extension

问题概述

我无法访问我在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}}? (正如我上面提到的,目前只适用于同域网站)

background.js

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

代码流

  1. background.js
  2. Code.js调用以var w = window.open(url)
  3. 开头的函数
  4. 然后是w.addEventListener("load", ...),这就是问题所在。仅当URL与活动选项卡属于同一域时才会触发。 (onLoad不能以任何方式使用,它永远不会触发我使用addEventListener的原因
  5. 注释

    • 我有"manifest_version": 2
    • 我需要注入这种方式而不是在清单中包含内容脚本(我想我可以将jquery库放在清单中,但我可以将其他文件放在清单中,而我更喜欢在&#中将所有注入一起放在一起34;代码&#34)

0 个答案:

没有答案