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
в перезапускаемых надстройках исполняются в песочнице.
Основная идея заключается в следующем:
- Получите ссылку на окно контента, которое вы тоже хотите прикрепить.
- Выберите "принципал", под которым должен работать скрипт. Принципал по сути является контекстом / политикой безопасности, который также определяет то же происхождение. Сценарий непривилегированного содержимого обычно использует само окно содержимого (которое также является основным), а привилегированный сценарий (доступ Chrome к
Components
) сценарий будет использовать системный принципал. - Выберите, если вы хотите XRay обертки. Документы расскажут вам больше об этом.
- Выберите прототип Песочницы ("глобальный" или верхний уровень этого). Обычно для содержимого скриптов контента вы выбираете окно контента.
- Создать
Sandbox
, - Добавьте любой материал, который может понадобиться вашему скрипту контента, в Песочницу.
- Выполнить скрипт либо
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);