Xpoint
   [напомнить пароль]

Расширение для запрета загрузки картинок

Метки: [без меток]
2007-05-12 16:08:00 [обр] GEN4IK[досье]
Здраствуйте.
 Я хочу написать плагин для Firefox который запрещает загрузгу картинок ,а вместо них
вставляет мой значок. Плагин я пишу впервый раз . Прочитал как создавать XPCOM компоненту и как создавать тулбар.Так же просмотрел интерфейсы которые предоставляет мозила , но идеи по созданию не появились. Как я могу реализавать этот плагин ?
спустя 12 минут [обр] GEN4IK[досье]
Вернее есть ли такая компонента где реализуесть методы:запрет загрузки кортинок и вставление своей картинки?
спустя 1 час 22 минуты [обр] Владимир Палант(434/4445)[досье]
сообщение промодерировано

Во-первых, расширение и плагин — вещи абсолютно разные. Вам нужно расширение.

Во-вторых, похожая тема уже обсуждалась здесь (Extension: images, cached images only, no images). В результате появилось расширение ImgLikeOpera.

Смотреть вам нужно таки в сторону nsIContentPolicy. Как пример кода существует Adblock Plus, хотя это уже далеко не минимальный пример. Так что я выложил минимальный пример, это легкая вариация кода, который я иногда использую для тестирования. Вам, судя по всему, нужно в shouldLoad проверять contentType, и если это Components.interfaces.nsIContentPolicy.TYPE_IMAGE, то менять contentLocation.spec.

спустя 8 часов [обр] GEN4IK[досье]

Спасибо за ссылки . Я просмотрел ваш код . Я так понял мне надо в функцию shouldLoad добавить следующий код :

 shouldLoad: function(contentType, contentLocation, requestOrigin, context, mimeTypeGuess, extra) {
   
if ((contentType == Components.interfaces.nsIContentPolicy.IMAGE) &&
        (contentLocation.scheme == 'http' || contentLocation.scheme == 'https'))
    {
        contentLocation.spec = "file:///C:/1/1.gif" ;
    }

 return Components.interfaces.nsIContentPolicy.ACCEPT;
  },

если да то что дальше делать ? ImgLikeOpera смотрел, только там много функций для моего понимания . А как я могу запустить ваш код для проверки ?

спустя 3 часа 39 минут [обр] Владимир Палант(434/4445)[досье]

Можете запаковать его в расширение (XPI-файл). Нашел по этому поводу даже статью на русском: http://www.toolbar.net.ru/6.html, вот только XPCOM-компоненты она не упоминает — им полагается быть в каталоге XPCOM внутри XPI-файла (не в JAR, туда вам класть пока нечего).

Но пока что можно потестировать и проще — кинуть этот файл в подкаталог components в каталоге приложения Firefox, а потом создать файл с названием ".autoreg" в профиле пользователя, чтобы компоненты заново зарегистрировались.

спустя 6 часов [обр] GEN4IK[досье]
А вообще есть разница как файл назвать , который в подкаталог components кидаю ? И еще в вашем коде есть еще функция shouldProcess , а зачем она? Мне с ней тоже надо чтото делать?
спустя 43 минуты [обр] GEN4IK[досье]
Еще такой вопрос, в shouldLoad передается параметр contentType , а надо создавать обьект данного класса или он передается уже обьектом ?
спустя 2 часа 4 минуты [обр] Владимир Палант(434/4445)[досье]

Название файла роли не играет, хотя константы в начале файла вам, конечно, нужно поменятэ. Функция shouldProcess по идее вызывается после shouldLoad, когда загрузка уже началась и нужно решить, следует ли отображать файл. Практически же она не вызывается никогда, может в будущих версиях интерфейса nsIContentPolicy ее удалят.

Создавать вам ничего не надо — картинка уже существует и вам лишь задают вопрос, следует ли ее загружать. Вы отвечаете: "да, следует", но при этом меняете адрес, который должен загрузиться.

спустя 2 часа 33 минуты [обр] GEN4IK[досье]

Это я все сделал. Меня сейчас интересует вопрос, как происходит загрузка моего расширения.
т.е. какова процедура:

  1. Регистрации расширения
  2. Как сделать, чтоб расширение загружалось автоматически с загрузкой FireFox-а
  3. И как проверить загрузилось ли мое расширение или нет.

Просто мои знания в этой области очень скудны + проблемы с английским.
А так, зная, все что я перечислил, мне будет легче ориентироваться в дальнейшей работе и что в том, что у меня не так...

спустя 15 минут [обр] Владимир Палант(434/4445)[досье]

Ну давайте перейдем к расширениям. Я выше давал ссылку на статью, как пишутся/упаковываются/устанавливаются расширения. У вашего расширения пользовательского интерфейса (пока?) нет, поэтому каталог chrome и JAR-файл вам не нужны. А нужно, чтобы в XPI был подкаталог components с вашей компонентой. Файл install.rdf описан в той же статье: http://www.toolbar.net.ru/2.html.

Когда пользователь установит ваше расширение, компонента зарегистрируется автоматически (вызовется module.registerSelf). После этого она уже будет постоянно прописана в категории content-policy и будет вызываться при загрузке любых элементов. Проверить, загружена ли ваша компонента, просто: введите в адресную строку about:config, а потом туда же alert(Components.classes["@mozilla.org/testpolicy;1"]). Если увидите "undefined" — значит компонента не зарегистрировалась. Смотрите тогда консоль ошибок (предварительно проверьте, что у установок javascript.options.showInConsole и javascript.options.strict в about:config стоит значение true).

спустя 2 часа 13 минут [обр] GEN4IK[досье]

я так понял что мне нужно сделать такой каталог :
+- plagin/
   +- instal.rdf
   +- components/
      +-MyComponentTest.js - код компоненты
      +- .autoreg - пустой файл

instal.rdf я реализовал так :

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
    <em:creator>GEN4IK</em:creator>
    <em:description>
       A Firefox blokirovshik kartinok.
    </em:description>
    <em:homepageURL>http://www.greenclassic.ru/freescripts/</em:homepageURL>
    <em:id>{d7a0cc0d-2559-4b0c-a351-c597f8ecdb80}</em:id>
    <em:name>Risunochki</em:name>
    <em:version>1.0</em:version>
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>1.0</em:minVersion>
        <em:maxVersion>2.0.0.*</em:maxVersion>
        </Description>
    </em:targetApplication>
  </Description>
</RDF>

после того ка я его упаковал и запустил мне выдала ошибку, что нет сценария для запуска.
А где надо реализовать сценарий ?

спустя 26 минут [обр] GEN4IK[досье]
 Я пытался разобраться как он реализован в ImgLikeOpera , но непонял . А в http://www.toolbar.net.ru/2.html там реализация без компонент.
спустя 43 минуты [обр] Владимир Палант(434/4445)[досье]

.autoreg не нужен, при установке расширения регистрация происходит автоматически. instal.rdf должен быть install.rdf (надеюсь, это опечатка). В остальном правильно, все это нужно упаковать в файл extension.xpi (название "extension" при этом произвольное).

А как вы его запускаете? Если просто в Windows Explorer, то может у вас нет ассоциации между Firefox и XPI-файлами. Откройте этот файл в Firefox (нажать Ctrl+O в браузере).

спустя 50 минут [обр] GEN4IK[досье]

ОЙ, я не так install.rdf написал даже не так как в форуме :( . Расширение установилось.
После того как я загрузил расширение , хотел посмотреть зарегистрирована ли компонента

Проверить, загружена ли ваша компонента, просто: введите в адресную строку about:config, а потом туда же alert(Components.classes["@mozilla.org/testpolicy;1"]). Если увидите "undefined" — значит компонента не зарегистрировалась. Смотрите тогда консоль ошибок (предварительно проверьте, что у установок javascript.options.showInConsole и javascript.options.strict в about:config стоит значение true).

а там выскочила Подтверждение цитирую :

Вы собираетесь зарегистрироваться на сайте "mozila.org" с именем пользователя
"alert(Components%2Eclasses%5B%22", но данный сайт не требует аутентификации. Это может быть попыткой обмануть вас. Является ли "mozila.org" сайтом , что вы хотите посетить?

и два варианта ответа да и нет . когда выбираю да то не заходит на сайт.
 А вы случайно не знаите что это означает ?

спустя 3 минуты [обр] Владимир Палант(434/4445)[досье]
Извиняюсь, имелось в виду, что писать надо javascript:alert(Components.classes["@mozilla.org/testpolicy;1"])
спустя 46 минут [обр] GEN4IK[досье]
Сделал как вы говорите мне выдает Предупреждение : @mozilla.org/testpolicy;1 .
Я так понимаю что компонента зарегистрирована . Только она делает не то , что я хочу ,вернее она вообще ничего не делает. А можно так менять местоположение картинки ?
contentLocation.spec = "file:///C:/1/1.gif" ;
спустя 55 минут [обр] Владимир Палант(434/4445)[досье]
Надо попробовать, может там настройки безопасности запрещают с file:/// грузить...
спустя 45 минут [обр] Владимир Палант(434/4445)[досье]

Да, file:/// таки не проходит, хотя chrome:// — пожалуйста. Ну и еще ошибка у вас — константа называется nsIContentPolicy.TYPE_IMAGE, а не nsIContentPolicy.IMAGE.

Кроме того, работает все это только для фоновых картинок. Обычные картинки почему-то не дают менять адрес. Я еще смотрю, в чем там дело...

спустя 15 минут [обр] Владимир Палант(434/4445)[досье]
Разобрался, почему не работает с обычными картинками. Это только в Gecko 1.9, они там защищают nsIURI от изменений. Кончилась наша халява :-(
спустя 16 часов [обр] GEN4IK[досье]
Исправил ошибки все заработала. Пробовал вместо адреса указывать адрес картинки в интернете, работает замечательно. Пробовал указывать адрес через chrome:// чегото не получается . Наверное я не понимаю аналогии между адресом в contentLocation.spec='chrome://1.gif' и реальным адресом на диске. Если я так меняю адрес , то в какой папке на диске должна лежать моя картинка (уже перепробовал все chrome папки на диске)?
спустя 6 часов [обр] Владимир Палант(434/4445)[досье]
сообщение промодерировано
Это оно сейчас работает, в Firefox 2.0. В Firefox 3.0 уже не будет, см. bug 337246.
спустя 20 минут [обр] GEN4IK[досье]
сообщение промодерировано

У меня Firefox 2.0.0.3 . Я так понял мне надо сделать так :

+- plagin/

   +- instal.rdf

   +- components/

      +-MyComponentTest.js
   
+- chrome /
     
1.gif

а в contentLocation.spec = "chrome://1.gif" ;
 
только это не работает .

спустя 57 минут [обр] Владимир Палант(434/4445)[досье]
Конечно так не будет работать. chrome://-адреса выглядят так: chrome://myextension/content/1.gif. Вот только боюсь, что у меня сейчас нет времени объяснять вам, как регистрируются именные пространства в chrome://, может позже. В принципе, в статье, на которую я ссылался выше, это все есть.
спустя 22 часа [обр] GEN4IK[досье]
Все разобрался как зарегистрировать chrome . Все работает .
ОГРОМНОЕ ВАМ ЧЕЛОВЕЧЕСКОЕ СПАСИБО ЗА ПОМОЩЬ , без вас я бы не написал.
Powered by POEM™ Engine Copyright © 2002-2005