Здравствуйте все ещё раз,

Пытаюсь в своём аддоне проследить все редиректы. HTTP-редиректы (3xx) отслеживаются легко - см. LiveHTTPHeaders. META-редиректы тоже легко находятся - см. RefreshBlocker. Остался последний "вид" редиректов - изменение скриптом свойства location.href.

Можно ли как-нибудь в Мозилле (со стороны аддона) отследить, что пользовательский скрипт (который на загруженной HTML странице) этот location.href меняет?

Заранее спасибо.

P.S. Здесь советуют: "Для этого нужно запускать скрипты в контексте аддона (т.е. вместо родного объекта window порождать свой аналогичный, эмулирующий оригинал через getters/setters)." Чтобы это значило? Автор того поста молчит...

я делал примерно так:

Выделить код

Код:

var foo = {

  load: function ()
  {
    document.getElementById("appcontent").addEventListener("load", foo.load_listener, true);
  },

  load_listener: function (event)
  {
    alert(event.originalTarget.location.href);
  }

}

window.addEventListener("load", function () {
  foo.load();
}, false);

shutnik: вы просто отслеживаете изменение адреса текущей страницы; я имел ввиду немного другое - как отследить изменение свойства href объекта location при прямом обращении к нему из пользовательского JavaScriptа.

Перефразирую: можно ли отследить из аддона, к каким объектам/свойствам обращается клиентский скрипт?

вы просто отслеживаете изменение адреса текущей страницы

тут отслеживается изменение url всех открытых табов

Перефразирую: можно ли отследить из аддона, к каким объектам/свойствам обращается клиентский скрипт?

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

Можно попробовать что-нибудь вроде:

Выделить код

Код:

var brs = getBrowser().browsers;
for(var i = 0; i < brs.length; i++) {
	var br = brs[i]; // или по добавлению вкладки обращаться к конкретному brs[i]
	br.addEventListener("unload", unloadHandler, true);
	var el = ...; // не помню, что возвращает getBrowser().browsers, скорее всего, массив из <browser>
	el.watch(
		"property", // "href", видимо...
		function(propName, oldVal, newVal) {
			alert(newVal);
			return newVal;
		}
	);
}

В unloadHandler делать
el.unwatch("property");
и
br.removeEventListener("unload", unloadHandler, true);

Либо по добавлению вкладки (DOMNodeInserted ?) запускать цикл с проверкой
for(var i = 0; i < brs.length; i++) {
    if(!br.isInit) {
        br.isInit = true;
        // ...
    }
}
Либо после добавления вкладки узнавать конкретный br

те же яйца, только в профиль

Infocatcher: тут ещё такая ерунда: в chrome-режиме (= в аддоне) объект location не имеет функции watch - хотя если смотреть со стороны HTML-страницы, то до location.watch("href", ...) достучаться можно.

Но даже это не поможет, т.к. нужно ещё отслеживать location.refresh(...) например.

Здесь советуют: "Для этого нужно запускать скрипты в контексте аддона (т.е. вместо родного объекта window порождать свой аналогичный, эмулирующий оригинал через getters/setters)." Только вот чтобы это значило? Вытаскивать тексты скрипта из страницы и работать eval'ом?