2010-10-22 9 views
9

Ich versuche zu blockieren, dass eine Skriptdatei auf benutzerdefinierten Websites geladen wird. Um eine Skriptdatei zu blockieren, verwende ich beforeload event und event.preventDefault(); im Inhaltsskript, das gut funktioniert, solange ich die Website-Liste bereits kenne. Mein Problem ist, dass ich die Website-Liste im Voraus nicht kenne, also um die Website-Liste zu erhalten, sende ich eine Anfrage an die Hintergrundseite, aber die Antwort ist asynchron und unbrauchbar.Synchrone Nachrichtenübergabe in Chrome-Erweiterungen?

Gibt es eine synchrone Nachricht in Chrome Extensions übergeben, die ich möglicherweise in Google-Dokumenten verpasst?

// my (simplified) code from content script: 
document.addEventListener("beforeload", function(event) 
{ 
    chrome.extension.sendRequest({fnc:"is_owner"}, function(response) 
    { 
    // asynchronous response is not usable because 
    // all scripts have already been loaded 
    if (response.is_owner) event.preventDefault(); 
    }); 
}, true); 
+1

Ein weiterer [Problembericht] (https://code.google.com/p/chromium/issues/detail?id=135095&thanks=135095&ts=1340923674) des gleichen Problems –

Antwort

6

Leider gibt es nicht. Es gibt eine bug report geöffnet über fehlende synchrone Nachrichtenübergabe, vielleicht, wenn genug Leute es startern, werden sie etwas dagegen tun.

+0

Danke für den Link, ich starrte es an. –

+0

Das Problem ist jetzt geschlossen als WontFix :( – cprcrack

1

Sie können die HTML5-Datei-API (navigator.webkitTemporaryStorage oder die ältere veraltete window.webkitStorageInfo mit der Option TEMPORARY) verwenden, um Einstellungen in einer Datei zu speichern. Dieser Teil ist asynchron, aber Sie können es aus dem Hintergrund oder Ihre Optionen Seite oder Popup tun. Diese API kann sich ändern, da sie noch nicht standardisiert ist. Da es sich um temporären Speicher handelt, muss Ihre Hintergrundseite möglicherweise dauerhaft ausgeführt werden, damit Chrome die Datei nicht löscht.

Dann können Sie synchrone XMLHttpRequest aus Ihrem Inhaltsskript verwenden, um die Datei von "filesystem:" + chrome.extension.getURL ("temporary /" + Dateiname) zu erhalten. Das Präfix "Dateisystem:" auf der URL ist ziemlich wichtig.

Am besten verwenden Sie die chrome.storage-API (oder localStorage) für Ihre Einstellungen und haken Sie das onChanged-Ereignis, um die temporäre Datei zu aktualisieren. Wenn Sie die Seite nach einer Änderung der Einstellungen erneut laden müssen, sollten Sie dies beim Rückruf durch den Schreibvorgang des FileSystems tun, damit Sie wissen, dass das Inhaltsskript die Änderung sehen kann.

Es sind keine speziellen Berechtigungen im Manifest erforderlich. Ich habe das persönlich in Chrome 35 getestet, aber ich weiß, dass es auch in früheren Versionen funktioniert hat. Ich kenne die Mindestversionsanforderung jedoch nicht. Ich erinnere mich an eine Erwähnung einer Regression in Zusammenhang mit der Sicherheitsveränderung in Chrome 33, wo sie nicht funktionierte, aber schnell behoben wurde.

Ich habe ein paar andere Problemumgehungen gesehen (zB Umleitung auf blob url oder data uri von onBeforeWebRequest), um Einstellungen in Inhaltsskripten zu erhalten, bevor die eigenen Skripte laufen, aber soweit ich weiß, sind sie alle absichtlich in den letzten Versionen von Chrome aufgrund der allgemeinen XSS- und Erweiterungssicherheitsverbesserungen.

+0

nach bestem Wissen, ist dies immer noch eine praktikable Lösung? –