2013-03-26 18 views
7

Mam rozszerzenie, które musi załadować stronę z dużą liczbą przekierowań na jej stronie w tle. Po przejściu do znanego adresu URL (https://website.com/index.php) element iframe powinien mieć wartość src ustawioną na about:blank.Adres URL elementu iframe z rozszerzenia Chrome

Na ostatniej stronie jest dość duży i ma wielkie obrazy i wszystko, co nie muszą być ładowane, więc zamiast dołączyć do iframe onload razie ustawić następujące funkcje na 100ms przedziale:

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"; 
    } 
} 

jednak jak tylko iframe zaczyna ładować, update() generuje ten błąd:

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.

próbowałem złapać() ing tego błędu, ale wiadomość przekazywana z powrotem JavaScript zaskoczeniem nie zawiera adres URL . Strona przekierowuje wiele razy, dlatego ważne jest, aby znać dokładny adres URL. Właściwość iframe o wartości src również nie jest aktualizowana w celu odzwierciedlenia przekierowań.

Odpowiedz

8

Po partii z Googling i prawie się poddając, wpadłem na następujące rozwiązanie. Używa wstrzykniętego skryptu treści, aby wysłać wiadomość z powrotem do rozszerzenia po załadowaniu prawidłowej strony.

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}); 
Powiązane problemy