2013-03-26 5 views
7

Ho un'estensione che deve caricare una pagina con molti reindirizzamenti nella sua pagina di sfondo. Una volta che la pagina raggiunge un URL noto (https://website.com/index.php), l'iframe deve avere il proprio src impostato su about:blank.Accesso all'URL iframe dall'estensione Chrome

La pagina finale è abbastanza grande e ha le immagini grandi e tutto ciò che non hanno bisogno di essere caricati, quindi piuttosto che si attaccano alla manifestazione del iframe onload, ho impostato la seguente funzione in un intervallo di 100 ms:

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

Tuttavia, non appena l'iframe inizia a caricare, update() throws questo errore:

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.

ho provato catch() ing tale errore, ma il messaggio passato di nuovo al Javascript sorprende non include l'URL . La pagina reindirizza più volte, quindi è importante conoscere l'URL esatto. Anche la proprietà src dell'iframe non viene aggiornata per riflettere i reindirizzamenti.

risposta

8

Dopo lotti di Google e quasi mi arrendo, ho trovato la seguente soluzione. Utilizza uno script di contenuto iniettato per inviare un messaggio all'estensione una volta caricata la pagina corretta.

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}); 
Problemi correlati