Коммуникация между расширением Firefox и страницей JavaScript

2 ответа

Действительно интересный вопрос…

Я только что узнал из этого сообщения на форуме MozillaZine, как легко это сделать. Методика в основном заключается в определении пользовательского элемента DOM на веб-странице, заполнении его некоторыми произвольными атрибутами, а затем использовать его как цель настраиваемого события. Затем событие может быть захвачено и использовано для передачи значений с веб-страницы в расширение.

Веб-страница (предполагается, что jquery доступен)

<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);

Обратите внимание, что doc.addEventListener имеет четвертый параметр, указывающий, что он будет принимать события, поступающие из ненадежного кода. Однако вы можете добавить этот прослушиватель событий выборочно, чтобы только доверенные страницы вашего сайта могли передавать значения в расширение.

11
ответ дан 6 December 2019 в 21:17
поделиться

Вы можете подключиться к объекту XMLHttpRequest из вашего расширения и отслеживать запросы, аналогично тому, что делает этот сценарий GreaseMonkey ( описание ). Добавьте оболочку в onreadystatechange так же, как он добавил оболочку для открытия, которая уведомляет расширение о завершении. Возможно, вам также понадобится код, который гарантирует, что вы делаете это только при посещении своей собственной страницы.

Firebug делает аналогичные вещи для своей панели Net, хотя кодовая база для этого немного более устрашающая :) Я также посмотрел на функция Firebug Lite watchXHR , но этот код для меня слишком хитрый,

1
ответ дан 6 December 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: