2009-08-20 13 views
7

Pracuję nad aplikacją javascript/html opartą na sieci WWW z siostrzanym rozszerzeniem firefox.Komunikacja między rozszerzeniem firefox a stroną javascript

Strona aplikacji javascript wykonuje kilka wywołań XHR bezpośrednio po wczytaniu strony, aby wprowadzić i wyświetlić całą zawartość wymaganą przez stronę.

Czy istnieje sposób, bez odpytywania DOM, że moje rozszerzenie może wiedzieć, że procedury inicjalizacji strony są kompletne?

Odpowiedz

11

Ciekawe pytanie rzeczywiście ..

Właśnie dowiedziałem się poprzez this post na forum MozillaZine prosty sposób do osiągnięcia tego celu. Technika polega głównie na zdefiniowaniu niestandardowego elementu DOM na stronie internetowej, wypełnieniu go pewnymi arbitralnymi atrybutami, a następnie wykorzystaniu go jako celu niestandardowego zdarzenia. Zdarzenie może być następnie przechwycone i użyte do przekazania wartości ze strony do rozszerzenia.

Strona WWW (zakłada jQuery jest dostępny)

kod
<script type="text/javascript"> 
    $(document).ready(function(){ 

    $.get("http://mywebsite.net/ajax.php",function(data){ 
     //[...]process data 

     //define a custom element and append it to the document 

     var element = document.createElement("MyExtensionDataElement"); 
     element.setAttribute("application_state", "ready"); 
     document.documentElement.appendChild(element); 

     //create a custom event and dispatch it 
     // using the custom element as its target 

     var ev = document.createEvent("Events"); 
     ev.initEvent("MyExtensionEvent", true, false); 
     element.dispatchEvent(ev); 
    });    
    }); 
</script> 

Chrome:

function myListener(e) { 
    alert("data:" + e.target.getAttribute("application_state")); 
} 

function on_specialpage_load(event) { 
    if (event.originalTarget instanceof HTMLDocument && 
     event.originalTarget.location.href == "http://mywebsite.net/myspecialpage.html") { 

    var doc=event.originalTarget; 
    doc.addEventListener("MyExtensionEvent", myListener, false, true); 
    } 
} 
gBrowser.addEventListener("DOMContentLoaded",on_specialpage_load,false); 

Uwaga, doc.addEventListener ma czwarty parametr, co wskazuje, że będzie akceptować wydarzenia nadchodzi z niezaufanego kodu. Możesz jednak dodać ten detektor zdarzeń selektywnie, aby tylko zaufane strony z Twojej witryny mogły przekazywać wartości do rozszerzenia.

+0

... i rzeczywiście bardzo interesująca odpowiedź. Jestem naprawdę zaintrygowany techniką niestandardowego zdarzenia i słuchacza. Czy uważasz, że byłby to najlepszy sposób dla strony javascript, aby móc "wywoływać" funkcję w rozszerzeniu. na przykład zaimplementować XHR typu XSS w witrynie (w mojej zaufanej aplikacji i domenach). – Cheekysoft

+0

Nie jestem pewien, czy to * najlepszy * sposób, ale wydaje się być wydajny i dość bezpieczny. Właśnie próbowałem zawinąć do słuchacza żądanie XHR do zewnętrznej strony i działało dobrze! –

+0

Jest to zalecana technika, tak: . – Nickolay

1

Można podłączyć się do obiektu XMLHttpRequest z rozszerzenia i monitorować żądania, similar to what this GreaseMonkey script does (description). Dodaj wrapper do onreadystatechange w ten sam sposób, w jaki dodaje otwieranie wrappera, które informuje o zakończeniu rozszerzenia. Prawdopodobnie chcesz również kod, który zapewnia, że ​​robisz to tylko podczas odwiedzania własnej strony.

Firebug robi podobne rzeczy dla swojego panelu Net, podstawa kodu jest nieco bardziej onieśmielająca :) Spojrzałem też na Firebug Lite watchXHR function, ale ten kod jest dla mnie zbyt przebiegłym, jeśli możesz to zrobić daj mi znać.

Powiązane problemy