ContentScript в расширении Firefox без использования Add-On SDK

Есть ли простой способ создать расширение Firefox для простого скрипта контента, БЕЗ необходимости использовать SDK Add-On и PageMod? Это действительно кажется излишним, чтобы пройти через установку Python и SDK, научиться использовать SDK и API, а также добавить ненужные слои раздувания и абстракции, просто чтобы выполнить простой скрипт содержимого.

Я уже пытался использовать браузер наложения XUL и вставлять туда скрипты, но все вставлялось в browser.xul контекст вместо document.body также добавляет много сложности...

Так какой же самый простой и легкий способ вставить несколько скриптов и CSS-файлов в HTML-документ вместо XUL-документа?

1 ответ

Решение

Ваше предположение слишком широкое, поэтому я не буду подробно обсуждать все, а дам общий обзор.

Легко может быть преувеличением, но скрипты контента SDK (и на самом деле тоже модули), Greasemonkey/Scriptish и все остальное, что похоже на скрипт контента, использует Sandbox внутренне. Четное bootstrap.js в перезапускаемых надстройках исполняются в песочнице.

Основная идея заключается в следующем:

  1. Получите ссылку на окно контента, которое вы тоже хотите прикрепить.
  2. Выберите "принципал", под которым должен работать скрипт. Принципал по сути является контекстом / политикой безопасности, который также определяет то же происхождение. Сценарий непривилегированного содержимого обычно использует само окно содержимого (которое также является основным), а привилегированный сценарий (доступ Chrome к Components) сценарий будет использовать системный принципал.
  3. Выберите, если вы хотите XRay обертки. Документы расскажут вам больше об этом.
  4. Выберите прототип Песочницы ("глобальный" или верхний уровень этого). Обычно для содержимого скриптов контента вы выбираете окно контента.
  5. Создать Sandbox,
  6. Добавьте любой материал, который может понадобиться вашему скрипту контента, в Песочницу.
  7. Выполнить скрипт либо evalInSandbox или индексный загрузчик.

Вот ограниченный пример добавления сценария непривилегированного содержимого в окно:

// 1. get the content window, e.g. the currently selected tab window
var contentWindow = gBrowser.contentWindow;
// 2. Choose the principal, e.g. just use the content window again
var principal = contentWindow;
// 3. We want XRay wrappers, to keep our content script and the actual
// page scripts in their own corners.
var wantXrays = true;
// 4. Our prototype will be the window
var sbProto = contentWindow;
// 5. Putting it all together to create a sandbox
var sandbox = Cu.Sandbox(principal, {
  sandboxPrototype: sbProto,
  wantXrays: wantXrays
});
// 6. Adding a random helper function (e.g.)
sandbox.getRandomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
};
// 7. Execute some content script, aka. the stupid example.
try {
  var execute = function() {
    var demo1 = document.querySelector('title').textContent;
    var demo2 = getRandomInt(1, 1000);
    alert(demo1 + " " + demo2);
  }
  Cu.evalInSandbox(
    "(" + execute.toSource() + ")()",
    sandbox
  );
} catch(ex) {
  console.error(ex);
}

PS: этот пример будет работать дословно в Scratchpad с окружающей средой / браузером.

Что касается стилей:

Делайте то, что делает SDK, я думаю, что упрощено:

var wu = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).
         getInterface(Ci.nsIDOMWindowUtils);
var uri = Services.io.newURI(
  "chrome://myaddon/style/content-style.css",
  null,
  null);
wu.loadSheet(uri, wu.USER_SHEET);
Другие вопросы по тегам