>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >[FF3]Вопрос о ContentPolicy http://forum.mozilla-russia.org/viewtopic.php?id=23452 |
dev > 27-05-2008 08:41:53 |
Задача: есть домен для нескольких сайтов которого нужно заменить часть картинок, скриптов и css на свои (часть лежит у клиентов локально, часть другой сервер). Есть расширение которое решало эту задачу через ContentPolicy: Все чудесно работает под 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 где безболезненно можно подменить юрл? |
Anton > 27-05-2008 10:59:36 |
Вот прямо так что ли ? Может быть, хотя бы Вообще интересно, надо попробовать. |
dev > 27-05-2008 11:30:02 |
Нет, не прямо. Собирается по частям в смысле aContentLocation.scheme = new_scheme; и тд. |
Anton > 27-05-2008 13:47:21 |
Результат исправления бага https://bugzilla.mozilla.org/show_bug.cgi?id=337246 Вот пара ссылок, может быть будет полезным: http://groups.google.com/group/mozilla.dev.tech.network/browse_thread/thread/0f51892f8951b676, Начинать, я думаю, лучше с http-on-modify-request, потому что подмена mime уже будет происходить когда данные начнут поступать с исходного url, а перекрывать протоколы http и file это уж слишком уж круто. |
dev > 27-05-2008 14:43:20 |
Anton пишет
Огромное, спасибо за ссылку.
Видимо я приплыл, чтож сам себе злобное буратино.
К сожалению, это не совсем то (или совсем не то), что требуется. Тянуть исходные url не приемлемо. |
Anton > 27-05-2008 16:49:15 |
Достаточно чётко, мне понятно было с самого начала. У меня у самого примерно такая же сейчас, разница лишь в том, что изменить uri я могу, потому что использую нестандартный протокол, но в FF3 это ничего не даёт, так как исправили не один только #337246. Подменить http протокол, скорее всего, задача нереальная. То есть, свою компоненту @mozilla.org/network/protocol;1?name=http сделать можно, но можно ли её реализовать в чистом javascript (и сколько это потребует кода) или можно ли её связать с дефолтной, чтобы передавать последней не интересующие запросы - это интересные вопросы. Далее, можно попробовать исследовать http-on-modify-request (который случается перед отправкой запроса) на предмет подмены ему если и не uri, то, может хотя бы потока. Ещё можно отлавливать уже входящий контент и, если попадётся интересующий, менять ему mime на нестандартный, и в собственном конвертере этого mime делать нужную работу. Это мои соображения, но, может быть есть ещё какие-нибудь варианты. |
Anton > 01-06-2008 14:42:41 |
Вот такая вот: http://pastebin.mozilla-russia.org/91417 штука, вроде декоратора на стандартный обработчик http-протокола. Работает в FF2 и FF3. Я не проверял, но предполагаю, что при регистрации двух подобных компонент работоспособной будет только одна. Можно попробовать использовать динамическую регистрацию фабрики обработчика, возможно, в этом случае получится полноценный декоратор. |
Anton > 01-06-2008 18:03:05 |
Попробовал сделать динамическую регистрацию двух компонент типа такой: http://pastebin.mozilla-russia.org/91418 но не получилось, работает только одна. |
Elexander > 24-12-2008 18:56:11 |
Интерестно посмотреть на этот декоратор. Стоит похожая задача. Поделитесь рабочей ссылкой. |
Anton > 24-12-2008 22:24:49 |
Elexander |
Elexander > 25-12-2008 16:50:41 |
Спасибо, Anton. Прочитав ваш диалог я прихожу к выводу, что для реализации поставленной задачи в Firefox 3 нет вообще подходящих методов. Так как: 1) В ShouldLoad реализации ContentPolicy нельзя подменить aContentLocation (ошибка NS_ERROR_ABORT) Или все же есть? Прошло 6 месяцев с момента обсуждения. Есть ли какие-то находки? Как вы справились с задачей? |
Anton > 25-12-2008 18:39:42 |
Вполне возможно, что есть. Я бы посмотрел в сторону блокировщиков - ilo, adblock и т. д., но у меня такая задача не стоит. |