Задача: есть домен для нескольких сайтов которого нужно заменить часть картинок, скриптов и css на свои (часть лежит у клиентов локально, часть другой сервер).

Есть расширение которое решало эту задачу через ContentPolicy:
shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
  ...
  if (aContentLocation == то_что_нужно) {
    aContentLocation = замена;
    ...
  }
  ...
}

Все чудесно работает под FF1.5/2.0/3bx и НЕ работает под 3rc1

Выделить код

Код:

Ошибка: [Exception... "Component returned failure code: 0x80004004 (NS_ERROR_ABORT) [nsIURI.scheme]"  nsresult: "0x80004004 (NS_ERROR_ABORT)"  location: ... Строка: 134

Штудирование Firefox_3_for_developers к сожалению не помогло.


Может кто уже сталкивался с подобной задачей или есть место отличное от ContentPolicy где безболезненно можно подменить юрл?

shouldLoad: function(aContentType, aContentLocation, aRequestOrigin, aContext, aMimeTypeGuess, aExtra) {
  ...
  if (aContentLocation == то_что_нужно) {
    aContentLocation = замена;
    ...

Вот прямо так что ли ? Может быть, хотя бы
aContent. location. spec = ....

Вообще интересно, надо попробовать.

Вот прямо так что ли ? Может быть, хотя бы
aContent. location. spec = ....

Нет, не прямо. Собирается по частям в смысле aContentLocation.scheme = new_scheme; и тд.
И это реально работает до FF3rc1 не смотря на обещанный readonly в доках. (Через .spec тоже само сабой работает). А вот в последнем FF не работает((( И что самое печальное, идей как это обойти у меня нетъ.

Результат исправления бага https://bugzilla.mozilla.org/show_bug.cgi?id=337246

Вот пара ссылок, может быть будет полезным: http://groups.google.com/group/mozilla.dev.tech.network/browse_thread/thread/0f51892f8951b676,
http://xpoint.ru/forums/programming/XUL/thread/41061.xhtml

Начинать, я думаю, лучше с http-on-modify-request, потому что подмена mime уже будет происходить когда данные начнут поступать с исходного url, а перекрывать протоколы http и file это уж слишком уж круто.

Anton пишет

Результат исправления бага https://bugzilla.mozilla.org/show_bug.cgi?id=337246

Огромное, спасибо за ссылку.

I think anyone who relied on something as undocumented as that deserves what
they get.

Видимо я приплыл, чтож сам себе злобное буратино.

Начинать, я думаю, лучше с http-on-modify-request, потому что подмена mime уже будет происходить когда данные начнут поступать с исходного url, а перекрывать протоколы http и file это уж слишком уж круто.

К сожалению, это не совсем то (или совсем не то), что требуется. Тянуть исходные url не приемлемо.
Может я не достаточно четко описал задачу:
Хочется такого: при любом http запросе http://host.domain.tld/path/file
если на локальном компе в условленном месте присутствует host/path/file то грузим локальную копию.

Может я не достаточно четко описал задачу

Достаточно чётко, мне понятно было с самого начала. У меня у самого примерно такая же сейчас, разница лишь в том, что изменить uri я могу, потому что использую нестандартный протокол, но в FF3 это ничего не даёт, так как исправили не один только #337246.

Подменить http протокол, скорее всего, задача нереальная. То есть, свою компоненту @mozilla.org/network/protocol;1?name=http сделать можно, но можно ли её реализовать в чистом javascript (и сколько это потребует кода) или можно ли её связать с дефолтной, чтобы передавать последней не интересующие запросы - это интересные вопросы.

Далее, можно попробовать исследовать http-on-modify-request (который случается перед отправкой запроса) на предмет подмены ему если и не uri, то, может хотя бы потока.

Ещё можно отлавливать уже входящий контент и, если попадётся интересующий, менять ему mime на нестандартный, и в собственном конвертере этого mime делать нужную работу.

Это мои соображения, но, может быть есть ещё какие-нибудь варианты.

Вот такая вот: http://pastebin.mozilla-russia.org/91417 штука, вроде декоратора на стандартный обработчик http-протокола. Работает в FF2 и FF3. Я не проверял, но предполагаю, что при регистрации двух подобных компонент работоспособной будет только одна. Можно попробовать использовать динамическую регистрацию фабрики обработчика, возможно, в этом случае получится полноценный декоратор.

Попробовал сделать динамическую регистрацию двух компонент типа такой: http://pastebin.mozilla-russia.org/91418 но не получилось, работает только одна.

Интерестно посмотреть на этот декоратор. Стоит похожая задача. Поделитесь рабочей ссылкой.

Elexander
http://pastebin.mozilla-russia.org/93903 == .../91417
http://pastebin.mozilla-russia.org/93902 == .../91418

Спасибо, Anton.

Прочитав ваш диалог я прихожу к выводу, что для реализации поставленной задачи в Firefox 3 нет вообще подходящих методов. Так как:

1) В ShouldLoad реализации ContentPolicy нельзя подменить aContentLocation (ошибка NS_ERROR_ABORT)
2) В обсервере события http-on-modify-request замена URI у связанного Channel-а не имеет эффекта.
3) При подмене контента в событии http-on-examine-response все же будет выполнен запрос в Internet.
4) Декоратор для стандартного обработчика http будет работать только для последнего установленного компонента. То есть все предыдущие работать не будут.

Или все же есть? Прошло 6 месяцев с момента обсуждения. Есть ли какие-то находки? Как вы справились с задачей?

Или все же есть? Прошло 6 месяцев с момента обсуждения. Есть ли какие-то находки? Как вы справились с задачей?

Вполне возможно, что есть. Я бы посмотрел в сторону блокировщиков - ilo, adblock и т. д., но у меня такая задача не стоит.