Доступ к javascript-переменной документа из расширения Firefox - PullRequest
9 голосов
/ 20 января 2010

Возможно ли расширение Firefox (панель инструментов) для доступа к переменным документа? подробное объяснение следует ..

загруженный документ:

<script type="text/javascript">
var variableForExtension = 'something';
</script>

расширение:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
alert(win.variableForExtension); // undefined

это было первое, что нужно попробовать, и он недоступен из-за механизмов безопасности ( XPCNativeWrapper ). я читал о доступе к нему через wrappedJSObject и использовании events (добавление слушателя в документ и отправка события из расширения), но не повезло. не слишком старался, хотя. Итак, прежде чем копать глубже («метод событий» звучит как путь), я хотел бы знать, возможно ли это?

спасибо

Ответы [ 3 ]

15 голосов
/ 29 января 2010

Да, доступ к переменной JS в содержимом есть и всегда был возможен. Делать это наивным способом было небезопасно (в том смысле, что вредоносная веб-страница могла получить права chrome) в старых версиях Firefox.

1) Если вы управляете веб-страницей и хотите передать информацию в расширение, вам действительно следует использовать технику events . Это работало и было / безопасно во всех версиях Firefox.

2) Если вы хотите прочитать значение из документа содержимого, вы можете просто обойти XPCNativeWrapper:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
// By the way, this could just be
//   var win = content;
// or 
//   var win = gBrowser.contentWindow;
alert(win.variableForExtension); // undefined
win.wrappedJSObject.variableForExtension // voila!

Это было небезопасно до Firefox 3. В Firefox 3 и более поздних версиях его можно использовать, вы получаете другой тип оболочки ( XPCSafeJSObjectWrapper ), который выглядит так же, как объект со страницы содержимого в ваш код, но гарантирует, что контентная страница не сможет сделать что-либо вредоносное.

3) Если вам нужно вызвать функцию на веб-странице с контентом или запустить собственный код в контексте страницы, это сложнее. Это спрашивалось и отвечалось в другом месте много раз, но, к сожалению, никогда полностью не документировалось. Поскольку это не имеет отношения к вашему вопросу, я не буду вдаваться в подробности.

4 голосов
/ 17 февраля 2011

не так сложно:)

в расширении:

var jso=window.content.document.defaultView.wrappedJSObject;

теперь вы можете получить доступ к любой функции или глобальной переменной на веб-странице из расширения:

alert(jso.pagevar);

jso.pagefunction("hey");
0 голосов
/ 05 марта 2015

Если вы работаете с новыми SDK высокого уровня, то доступ к переменной с помощью скриптов содержимого немного отличается. Вы не можете получить доступ к объектам JavaScript напрямую из кода надстройки, но вы можете получить к ним доступ из сценариев содержимого, которые были прикреплены к открытой странице через объект unsafeWindow . Например:

require("sdk/tabs").open({
  url: 'http://www.example.com/some/page/',
  onOpen: function(tab) {
    var worker = tab.attach({
      contentScript: 'unsafeWindow.variableForExtension = 1000;'
    });
  }
});

Чтобы прочитать переменные, вам нужно использовать методы port для переменной worker , как описано в статье со скриптами содержимого Mozilla.

Обратите внимание, что существуют некоторые ограничения безопасности при работе с объектами и функциями. Подробности смотрите в статьях.

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