Допустим есть HTML-страница:

Выделить код

Код:

<html><head>
<script type="text/javascript">  
  var variable1 = 'variable1Value';
  var variable2 = 4;
  var variable3 = new Array('elem1', 'elem2');
</script>
</head>
<body> ... </body>
</html>

Как из расширения получить значения переменных (variable1, variable2, ...) на этой странице?
Конструкция window._content.variable1 не помогает.
Расширение перекрывает browser.xul

doc.defaultView, где doc - ссылка на документ страницы.

Расширение перекрывает browser.xul

это как понимать?

alert(window._content.document.defaultView.variable1);

Выводит undefined. Может быть "синтаксис" не такой?

это как понимать?

overlay

Tearis, DOM инспектором ковырялся? я что-то никакого _content у основного окна не нахожу. а вот в defaultView документа он имеется.

Выделить код

Код:

alert(_content.document.defaultView.variable1);

Dark-Demon
Какая разница между тем, что написал Tearis:

alert(window._content.document.defaultView.variable1);

и тем, что написал ты:

alert(_content.document.defaultView.variable1);

?

Tearis
Тут всё дело в безопасности.
Напрямую получать доступ к свойствам веб-страниц небезопасно.
Поэтому вместо

alert(content.variable1);

нужно использовать

alert(content.wrappedJSObject.variable1);

Но при этом это будет небезопасный доступ к variable1.

Почитать об этом можно тут:
http://developer.mozilla.org/en/docs/XPCNativeWrapper#Accessing_unsafe_properties
http://developer.mozilla.org/en/docs/Safely_accessing_content_DOM_from_chrome
http://kb.mozillazine.org/XPCNativeWrapper

Yan
Спасибо, то что нужно :D

Добавлено Срд 08 Ноя 2006 20:13:35 :
Вопрос уже не конкретно по теме, но косвенно к ней относящийся.

Почему нельзя использовать _content.document.defaultView. для этой цели? Ведь тут тоже проблем с перекрытием имен не должно оказываться (если я правильно понял о какой безопасности идет речь на приведенных страницах).
Кстати, как-то я в обычном скрипте на странице объявил переменную (допустим myVar) и мне консоль JavaScript сказала что "переназначение const myVar, ошибка". Странно, если говорят, что подобное пофиксили еще в версии Firefox 1.0.3 (вроди бы это написано на  http://kb.mozillazine.org/XPCNativeWrapper).

Tearis

Почему нельзя использовать _content.document.defaultView. для этой цели? Ведь тут тоже проблем с перекрытием имен не должно оказываться (если я правильно понял о какой безопасности идет речь на приведенных страницах).

То, что доступ к небезопасным свойствам веб-страниц усложнён -- это хорошо, т.к. если программист и обращается к небезопасным объектам, то он безусловно знает, что делает -- принудительное использование wrappedJSObject послужит хорошим напоминанием.
А _content.document.defaultView. использовать можно, но только для обращения к безопасным (неперекрытым) объектам.
Пример:
На HTML-странице перекрываем метод createElement документа:

Выделить код

Код:

<html><head>
<script type="text/javascript">  
document.createElement = ' метод изменён';
</script>
</head>
<body> ... </body>
</html>

А потом из расширения проверяем, что нам выдадут различные способы обращения к createElement:

Выделить код

Код:

alert('безопасный доступ:'+content.document.createElement);
alert('НЕбезопасный доступ:'+_content.document.defaultView.document.wrappedJSObject.createElement);
alert('НЕбезопасный доступ:'+content.document.wrappedJSObject.createElement);

В общем, примерно так я считаю. Могу ошибаться, конечно.

Кстати, как-то я в обычном скрипте на странице объявил переменную (допустим myVar) и мне консоль JavaScript сказала что "переназначение const myVar, ошибка"

Правильно. Если переменная уже объявлена, то её нельзя переназначать.
Простейший пример:

Выделить код

Код:

var x=1;
const x=1;

вызовет такую же ошибку. Это с вышеизложенными случаями про безопасность никак не связано.

Правильно. Если переменная уже объявлена, то её нельзя переназначать.

Я не первый день web-программированием занимаюсь :D Естественно я не объявлял нигде выше на странице константу "myVar". В IE и Opera все было нормально.

Tearis
Значит, переменная myVar у window уже была изначально. Ничего другого быть не может.
Воспроизвести мне такую же ошибку удалось только при попытке переопределить существующие переменные как константы:

Выделить код

Код:

const location='...';
const console='...';
/*и т.п.*/

Кстати, в Опере как раз alert(typeof window.console) выдаёт undefined, а в Firefox Object.

Возник соответствующий теме вопрос.

Допустим я ловлю событие "DOMContentLoaded" и получаю ссылку на document той страницы которая инициировала это событие.

Выделить код

Код:

window.addEventListener('DOMContentLoaded', function(e){
	var doc = e.target;
}, false);

Как мне операясь на "doc" получить доступ к переменным конкретно этой страницы?
Я пробовал что-то типа:
doc.defaultView.window.content.wrappedJSObject.variable1
Работает, но не до конца правильно. В момент возниконовения события "DOMContentLoaded" сценарий пытается достать "variable1" со страницы в той вкладке, которая была активна на момент возникновения события, а она, страница, не обяательно та что нужна.

Tearis
Во-первых, addEventListener, надо применять не к window, а к tabbrowser (его возвращает функция getBrowser()), а во-вторых, зачем так сложно:

doc.defaultView.window.content.wrappedJSObject.variable1

?

У меня успешно работает вот такой пример, заточенный под страницу этого форума:

Выделить код

Код:

getBrowser().addEventListener('DOMContentLoaded', function(e){
	var x=e.target.defaultView.wrappedJSObject.google_color_text;
	alert(x?x:'переменная не определена -- не та страница');
}, false);

При загрузке страницы выдаёт "000000" независимо от того, какая вкладка активна в момент загрузки.

Yan
Огромное спосибо.

столкнулся с этим XPCNativeWrapper. ужасная вещь :blush:

может кто-нибудь объяснить мне каким образом мне добраться скажем до

Выделить код

Код:

document.getTlementById("foo").value

документа? бюсь уже много времени, но реализовать не могу...
пример

Выделить код

Код:

var winWrapper = new XPCNativeWrapper(content, "document",
                                      "getSelection()");
var docWrapper = new XPCNativeWrapper(winWrapper.document,
                                      "title");
return docWrapper.title == winWrapper.getSelection();

с http://developer.mozilla.org/en/docs/XPCNativeWrapper у меня работает

Наверное, так:

Выделить код

Код:

var winWrapper = new XPCNativeWrapper (content, "document");
var docWrapper = new XPCNativeWrapper (winWrapper. document, "getElementById()");
var siWrapper = new XPCNativeWrapper (docWrapper. getElementById ("search-input"), "value");
var sivWrapper = siWrapper. value;

Добавлено Сбт 18 Авг 2007 13:20:26 :
p.s. хотя, там написано

This syntax has been kept for compatibility with versions prior to Firefox 1.5.

А в более поздних версиях можно короче:

var winWrapper = new XPCNativeWrapper (content);
var docWrapper = winWrapper. document;
var siWrapper = docWrapper. getElementById ("search-input");
var sivWrapper = siWrapper. value;

Anton
спасибо большое