2013-03-26 4 views
7

У меня есть расширение, которому необходимо загрузить страницу с большим количеством переадресаций на своей фоновой странице. После того, как эта страница попадет на известный URL-адрес (https://website.com/index.php), iframe должен иметь свой src, установленный в about:blank.Доступ к URL-адресу iframe из расширения Chrome

Последняя страница является довольно большой и имеет большие изображения и все, что не должны быть загружены, поэтому вместо того, прикрепляются к onload событию Iframe, я установить следующую функцию на 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"; 
    } 
} 

Однако, как только IFrame начинает загружать, обновлять() выдает эту ошибку:

Unsafe JavaScript attempt to access frame with URL https://website.com/index.php from frame with URL chrome-extension://hdmnoclbamhajcoblymcnloeoedkhfon/background.html. The frame requesting access has a protocol of 'chrome-extension', the frame being accessed has a protocol of 'https'. Protocols must match.

Я попытался поймать() ИНГ эту ошибку, но сообщение передается обратно Javascript Unsurprisingly не включает в себя URL , Страница перенаправляется несколько раз, поэтому важно знать точный URL. Свойство iframe src также не обновляется, чтобы отражать перенаправления.

ответ

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/*" 
    ] 
} 

background.html:

<html> 
    <head> 
     <script type="text/javascript" src="background.js"></script> 
    </head> 
    <body> 
     <iframe src="about:blank"></iframe> 
    </body> 
</html> 

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(); 
    } 
}); 

content.js:

chrome.extension.sendMessage({loaded: window.location.href}); 
Смежные вопросы