Полезная информация

Заказывай стафф с атрибутикой Mozilla и... пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!

№122-09-2006 18:01:41

abevziuk
Участник
 
Группа: Members
Зарегистрирован: 22-09-2006
Сообщений: 4

Перехват загрузки картинок(FF Extension)

Здравствуйте!
Необходимо до загрузки картинок, подменить адрес с которого они будут загружатся, делаю так:

Выделить код

Код:

var MyClass = {
....
  doLoad: function(e) {
  	dump("\n!DOMContentLoaded!\n");

	var doc = e.originalTarget;

	var images = doc.getElementsByTagName("img");
	for(i=0; i < images.length; i++) {
		images[i].src="http://127.0.0.1/1.gif";
	}
  },
}
window.addEventListener("DOMContentLoaded", MyClass.doLoad, false); 
...

Но проблема в том, что картинки загружаются раньше, чем функция MyClass.doLoad получает управление, т.е. сначала отображаются оригинальные картинки(страница продолжает загружатся), а только потом они подменяются моей. Смотрю в исходник AdBlock и что называется - вижу фигу. Подскажите, хоть в какую сторону смотреть ?

Отредактировано abevziuk (22-09-2006 18:11:39)

Отсутствует

 

№223-09-2006 05:22:13

Владимиp Палант
Участник
 
Группа: Extensions
Зарегистрирован: 06-11-2004
Сообщений: 906
Веб-сайт

Re: Перехват загрузки картинок(FF Extension)

Да уж, не слишком просто... Смотреть надо в сторону nsIContentPolicy. Вы должны написать XPCOM-компоненту, которая будет реализовывать этот интерфейс и зарегистрируется в категории content-policy - тогда вы сможете заблокировать загрузку картинки. А потом надо еще подменить ее на другую. Картинки реализуют интерфейс nsIImageLoadingContent, там можно вызвать метод loadImageWithChannel, чтобы подсунуть ей другое соединение. Сразу предупреждаю: все эти манипуляции с картинкой прямо в shouldLoad делать нельзя, будут страшные глюки. Для подобных изменений всегде нужно устанавливать таймаут на 0 мс.

BlockSite работает проще, регистрирует observer'а для сообщения http-on-modify-request. Вот только я не нашел способа перенаправить запрос из такого observer'а.

Отсутствует

 

№323-09-2006 10:12:56

Dionys
Участник
 
Группа: Members
Зарегистрирован: 20-09-2006
Сообщений: 19

Re: Перехват загрузки картинок(FF Extension)

Владимиp Палант

BlockSite работает проще, регистрирует observer'а для сообщения http-on-modify-request. Вот только я не нашел способа перенаправить запрос из такого observer'а.

Для решения задачи в таком обсервере достаточно заменить URI запроса. Но тут встаёт вопрос, как определить, что запрашивается картинка.

Отсутствует

 

№425-09-2006 11:27:05

Dark-Demon
Участник
 
Группа: Members
Зарегистрирован: 20-02-2006
Сообщений: 1278

Re: Перехват загрузки картинок(FF Extension)

Dionys, по расширению? :)


!

Отсутствует

 

№525-09-2006 12:37:01

INFOMAN
Телепаты в отпуске
 
Группа: Extensions
Откуда: Кишинев
Зарегистрирован: 31-12-2005
Сообщений: 1099
Веб-сайт

Re: Перехват загрузки картинок(FF Extension)

Dark-Demon, не пойдёт - иногда картинки генерятся динамически скриптами и, соответственно, имеют расширение .php

Отредактировано INFOMAN (25-09-2006 12:37:36)


Закрой кран
Включи свет ©
Fire! Kill IE is your desire | NULL | NULL

Отсутствует

 

№625-09-2006 13:24:56

Al_H
Away
 
Группа: Members
Откуда: SPb
Зарегистрирован: 10-06-2005
Сообщений: 5508

Re: Перехват загрузки картинок(FF Extension)

В отклике сервера будет стоять что-то вроде Content-Type: image/png - проблема в том, что если расширение php, браузер не знает, какой тип запрашивать, и истину мы узнаем только по отклику сервера.

Отсутствует

 

№725-09-2006 18:46:55

abevziuk
Участник
 
Группа: Members
Зарегистрирован: 22-09-2006
Сообщений: 4

Re: Перехват загрузки картинок(FF Extension)

Спасибо за ответы :)
Взял за основу BlockSite, но теперь появился новый вопрос:

Для решения задачи в таком обсервере достаточно заменить URI запроса.

Не совсем понятно, Вы предлагаете заменять прямо в Subject:

Выделить код

Код:

var observer = {
observe: function(subject, topic, data) {
.....
subject.URI.spec = "127.0.0.1.gif";
...
}

или через

Выделить код

Код:

var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
httpChannel.setRequestHeader ?

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


Также в BlockSite было замеченно, что у subject вызывается метод cancel

Выделить код

Код:

...
aSubject.cancel(Components.results.NS_ERROR_FAILURE);
...

Хотя в документации по nsISupports(http://www.xulplanet.com/references/xpc … sISupports)    (http://developer.mozilla.org/en/docs/nsISupports), не найдено, или я не туда смотрю ?

Отредактировано abevziuk (25-09-2006 19:10:24)

Отсутствует

 

№826-09-2006 09:58:50

Dionys
Участник
 
Группа: Members
Зарегистрирован: 20-09-2006
Сообщений: 19

Re: Перехват загрузки картинок(FF Extension)

Не совсем понятно, Вы предлагаете заменять прямо в Subject:
первый способ влобовую не работает, со вторым пока не успел разобратся.

Долно работать такое:

Выделить код

Код:

observe: function(subject, topic, data)
    {
        subject.QueryInterface(Components.interfaces.nsIHttpChannel);
        subject.URI.spec = "http://127.0.0.1/1.gif";
    }

Отсутствует

 

№926-09-2006 15:18:44

abevziuk
Участник
 
Группа: Members
Зарегистрирован: 22-09-2006
Сообщений: 4

Re: Перехват загрузки картинок(FF Extension)

Собственно говоря этот способ и не работает. В (http://xulplanet.mozdev.org/references/ … annel.html) и обозначено, что URI - read-only :(

Отсутствует

 

№1027-09-2006 09:36:56

Dionys
Участник
 
Группа: Members
Зарегистрирован: 20-09-2006
Сообщений: 19

Re: Перехват загрузки картинок(FF Extension)

Странно, у меня есть рабочее расширение, в котором используется именно этот способ. Кроме того хоть URI и read-only, но URI.spec - изменяемое свойство.

Отсутствует

 

№1127-09-2006 12:59:56

abevziuk
Участник
 
Группа: Members
Зарегистрирован: 22-09-2006
Сообщений: 4

Re: Перехват загрузки картинок(FF Extension)

Вообщем-то да, оно изменяется, но картинка грузится с оригинального адреса. Временно сделал костыль ввиде отмены загрузки картинки, а затем прохождения по DOM и подмене своей(ну ооочень не хочется за xpcom браться) :)

Отсутствует

 

№1229-09-2006 16:39:39

Владимиp Палант
Участник
 
Группа: Extensions
Зарегистрирован: 06-11-2004
Сообщений: 906
Веб-сайт

Re: Перехват загрузки картинок(FF Extension)

Проблема не в том, чтобы определить, что загружается картинка - при загрузке картинки браузер посылает другой заголовок Accept. Но все эти штуки с изменением URI.spec я уже пробовал (этот код в BlockSite - мой), они не работают. Судя по всему, на стадии http-on-modify-request браузер уже определился, к какому серверу уйдет запрос, и менять можно уже только адрес внутри этого сервера. Поэтому я и сказал, что смотреть надо в стороны nsIContentPolicy.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]