从Chrome扩展程序访问iframe网址

Dan*_*nka 7 javascript cross-domain google-chrome-extension

我有一个扩展,需要在其后台页面中加载包含大量重定向的页面.一旦该页面到达已知URL(https://website.com/index.php),iframe应src设置为about:blank.

最后一页非常大,并且有大图像和所有不需要加载的内容,因此我不是连接到iframe的onload事件,而是以100毫秒的间隔设置以下函数:

function update(){
    if(document.getElementsByTagName('iframe')[0].contentDocument.location.href == "https://website.com/index.php"){
        console.log("Done!");
        clearInterval(updateInterval);
        document.getElementsByTagName('iframe')[0].src = "about:blank";
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,只要iframe开始加载,update()就会抛出此错误:

不安全的JavaScript尝试使用URL chrome-extension://hdmnoclbamhajcoblymcnloeoedkhfon/background.html从URL访问具有URL https://website.com/index.php的框架.请求访问的帧具有"chrome-extension"协议,被访问的帧具有"https"协议.协议必须匹配.

我尝试了catch()这个错误,但传递回Javascript的消息并不奇怪,不包括URL.页面重定向多次,因此了解确切的URL非常重要.srciframe 的属性也不会更新以反映重定向.

Dan*_*nka 8

经过大量的谷歌搜索和几乎放弃,我想出了以下解决方案.它使用注入的内容脚本在加载正确的页面后将消息发送回扩展.

manifest.json的:

{
    ...
    "background": {
        "page": "background.html"
    }, "content_scripts": [
        {
            "matches": ["http://website.com/index.php"],
            "js": ["content.js"],
            "all_frames": true,
            "run_at": "document_start"
        }
    ],
    "permissions": [
        "*://*.website.com/*"
    ]
}
Run Code Online (Sandbox Code Playgroud)

background.html:

<html>
    <head>
        <script type="text/javascript" src="background.js"></script>
    </head>
    <body>
        <iframe src="about:blank"></iframe>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

background.js:

var waiting = false;

function login(){ // Call this function to start
    var frame = document.getElementsByTagName('iframe')[0];
    frame.src = "https://website.com/login/";
    waiting = true;
}

function callback(){ // This gets called once the page loads
    console.log("Done!");
}

chrome.extension.onMessage.addListener(function(request, sender, sendResponse){
    if(request.loaded && waiting){
        // If you used a pattern, do extra checks here:
        // if(request.loaded == "https://website.com/index.php")
        document.getElementsByTagName('iframe')[0].src = "about:blank";
        waiting = false;
        callback();
    }
});
Run Code Online (Sandbox Code Playgroud)

content.js:

chrome.extension.sendMessage({loaded: window.location.href});
Run Code Online (Sandbox Code Playgroud)