Заставить модули Pagemod и Page-worker работать вместе? - PullRequest
2 голосов
/ 08 марта 2011

Я работаю над проектом расширения Firefox, который требует, чтобы я использовал клавишу TAB, чтобы переключаться между всеми ссылками на странице, извлекать ее URL, извлекать ее исходный код и анализировать его.

В настоящее время я могу использовать клавишу TAB для переключения по странице, чтобы получить ее URL следующим образом:

exports.main = function() {};
var pageMod = require("page-mod");

pageMod.PageMod({
  include: "*.org",
  contentScriptWhen: 'ready',
  contentScript:

  'document.onkeydown = function(ev) {var key; ev = ev || event; key = ev.keyCode; if (key == 9) { setTimeout (function(){console.log(document.activeElement.href);'+
  '}, 1000 ); } };'+

  'var a = "Access Tab URL Extraction: New Page Found."; console.log(a);'
});

... и получить исходный код любого URL-адреса с указанным ниже (например, Википедия):

exports.main = function() {};

console.log("Start");
var pageWorkers = require("page-worker");

var script = "var elements = document.body.innerHTML; " +

             "  postMessage(elements) " ;

// Create a page worker that loads Wikipedia:
pageWorkers.Page({
  contentURL: "http://en.wikipedia.org/wiki/Internet",
  contentScript: script,
  contentScriptWhen: "ready",
  onMessage: function(message) {
    console.log(message);
  }
});

Итак, как я могу передать URL-адрес, полученный от Pagemod (в данном случае document.activeElement.href) в contentURL работника страницы и заставить его извлекать и отображать исходный код каждый раз, когда я нажимаю клавишу TAB в качестве новых URL продолжайте извлекаться в Pagemod.

Я попробовал следующее, но оно не работает, кажется, нельзя вызвать page-worker как часть contentScript для мод-страницы?

exports.main = function() {};
var pageMod = require("page-mod");
var pageWorkers = require("page-worker");


pageMod.PageMod({
  include: "*.org",
  contentScriptWhen: 'ready',
  contentScript:

//Get New URLs by Pressing the Tab Key

'document.onkeydown = function(ev) { var key; ev = ev || event; key = ev.keyCode; if (key == 9) { setTimeout (function(){console.log(document.activeElement.href);'+

  '}, 1000 ); } };'+



//Fetch new URL source code

'document.onkeyup = function(ev) { var key; ev = ev || event; key = ev.keyCode; if (key == 9) {'+

'pageWorkers.Page({'+
'contentURL: "document.activeElement.href",'+
'contentScript: "var elements = document.body.innerHTML;"+"postMessage(elements)",'+
'contentScriptWhen: "ready",'+
'onMessage: function(message) {'+
'console.log(message);'+
'}'+
'});'+

   ' } };'

});

Любая помощь будет принята с благодарностью! :)

1 Ответ

2 голосов
/ 16 июня 2011

Сценарии содержимого не могут использовать ресурсы addon-sdk, так как они запускаются в контексте веб-страницы.Таким образом, вы должны использовать передачу сообщений.Ваш обработчик нажатия клавиш должен передать сообщение обратно в аддон с чем-то вроде

  self.port.emit('url', document.activeElement.href)

, а затем в объявлении вашего мод-страницы вы получите сообщение и создадите рабочий лист для получения источника:

onAttach: function(worker) {
  worker.port.on('url', function(url) {
    pageWorkers.Page({
      contentURL: url,
      contentScript: script,
      contentScriptWhen: "ready",
      onMessage: function(message) {
        console.log(message);
      }
    });
  });
}

Обратите внимание, что вам, вероятно, понадобится некоторая проверка, поэтому вы передаете только URL-адреса аддону, и вам, вероятно, придется иметь дело с ошибками при загрузке страницы на рабочем месте.

...