2013-03-26 8 views
7
zu

Ich habe eine Erweiterung, die eine Seite mit vielen Redirects in seiner Hintergrundseite laden muss. Sobald diese Seite eine bekannte URL erreicht (https://website.com/index.php), sollte der Iframe src auf about:blank gesetzt sein.Greifen Sie auf Iframe-URL von der Chrome-Erweiterung

Die letzte Seite ist recht groß und hat große Bilder und alles, was geladen werden, müssen nicht, so anstatt heften sich an die onload Veranstaltung iframe, habe ich die folgende Funktion auf einem 100 ms Intervall:

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

jedoch sobald die iframe zu laden beginnt, update() wirft diesen Fehler:

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.

ich fängt versucht(), dass Fehler ing, aber die Nachricht wenig überraschend auf Javascript zurückgeleitet beinhaltet nicht die URL . Die Seite wird mehrmals umgeleitet. Daher ist es wichtig, die genaue URL zu kennen. Die src-Eigenschaft des iframe wird ebenfalls nicht aktualisiert, um Weiterleitungen anzuzeigen.

Antwort

8

Nach viele Googeln und fast aufgeben, kam ich mit der folgenden Lösung. Es verwendet ein injiziertes Inhaltsskript, um eine Nachricht zurück an die Erweiterung zu senden, sobald die richtige Seite geladen wurde.

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}); 
Verwandte Themen