Связь между расширением Firefox и страницей JavaScript - PullRequest
7 голосов
/ 20 августа 2009

Я занимаюсь разработкой веб-приложения javascript / html с расширением сестринского firefox.

page-javascript приложения выполняет несколько вызовов XHR сразу после загрузки страницы, чтобы вывести и отобразить весь контент, который требуется странице.

Есть ли способ, без опроса DOM, чтобы мое расширение могло знать, что процедуры инициализации страницы завершены?

Ответы [ 2 ]

11 голосов
/ 20 августа 2009

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

Я только что узнал в этом посте на форуме 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>

Код хрома:

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 имеет четвертый параметр, указывающий, что он будет принимать события, поступающие из ненадежного кода. Однако вы можете выборочно добавлять этот прослушиватель событий, чтобы только доверенные страницы вашего сайта могли передавать значения в расширение.

1 голос
/ 20 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...