Firefox: назад в будущее?

22nd September 2004 - 00:33

Сегодня вечером посидел, подумал, расширение ImgLikeOpera заработало и в FF1.0PR. «Гоп!» — воскликнул Данил, но, как оказалось, ещё не перепрыгнул. Ниже приведён кусок кода из компоненты этого расширения.

/**
 * nsImgLikeOpera.js
 *
 **/
  ... ... ...
var nsImgLikeOpera =
{
  shouldLoad: function(contentType, contentLocation, context, wnd)
  {
    dumpText = "Dump for: " + contentLocation.spec + "\r\n";
    dumpText += "contentType: " + contentType + "\r\n"
        + "contentLocation: " + contentLocation + "\r\n"
        + "context: " + context + "\r\n"
        + "wnd: " + wnd + "\r\n"
        + "nsIContentPolicy.IMAGE: "
        + Components.interfaces.nsIContentPolicy.IMAGE + "\r\n"
        + "nsIContentPolicy.TYPE_IMAGE: "
        + Components.interfaces.nsIContentPolicy.TYPE_IMAGE
        + "\r\n----------------\r\n";

    if ((contentType == Components.interfaces.nsIContentPolicy.IMAGE) &&
        (contentLocation.scheme == 'http' || contentLocation.scheme == 'https'))
    {
        //~ начинаем своё чёрное дело
        ... ... ...

Попробую объяснить «на пальцах» (другого объяснения с моим уровнем знаний просто не получится).

shouldLoad разрешает/запрещает загрузку контента (true/false). contentType — тип (скрипт, картинка, документ и т.д.) contentLocation — URL, грубо говоря. Проверка условия: если «поймали» картинку и запрос был по http(s).

Самое интересное: context и wnd. В FF0.9.3, проверяя существование context, я определял откуда пришла картинка (из HTML или из CSS), а сравнивая содержимое wnd.window.content.document с содержимым всех (ugh!) открытых в данный момент табов, находил родительский по отношению к этому контенту таб и смотрел его установки (не загружать, загружать только из кэша, etc.) Не важно, нравился мне этот алгоритм или нет. У него было одно очевидное достоинство: он работал. В прошедшем времени, ага.

Содержимое dumpText в разных версиях Firefox ("1.jpg" — обычный img в HTML; "bg.png" — не менее обычный background-image в CSS):

/**
 * Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.7)
 * Gecko/20040803 Firefox/0.9.3
 *
 **/

Dump for: http://localhost/img/1/a/1.jpg
contentType: 2
contentLocation: [xpconnect wrapped nsIURI]
context: [object HTMLImageElement]
wnd: [object Window]
nsIContentPolicy.IMAGE: 2
nsIContentPolicy.TYPE_IMAGE: undefined
----------------
Dump for: http://localhost/design/img/bg.png
contentType: 2
contentLocation: [xpconnect wrapped nsIURI]
context: null
wnd: [object Window]
nsIContentPolicy.IMAGE: 2
nsIContentPolicy.TYPE_IMAGE: undefined
----------------

/**
 * Mozilla/5.0 (Windows; U; Windows NT 5.2; rv:1.7.3)
 * Gecko/20040913 Firefox/0.10
 *
 **/

Dump for: http://localhost/img/1/a/1.jpg
contentType: 3
contentLocation: [xpconnect wrapped nsIURI]
context: [xpconnect wrapped nsIURI]
wnd: [object HTMLImageElement]
nsIContentPolicy.IMAGE: undefined
nsIContentPolicy.TYPE_IMAGE: 3
----------------
Dump for: http://localhost/design/img/bg.png
contentType: 3
contentLocation: [xpconnect wrapped nsIURI]
context: [xpconnect wrapped nsIURI]
wnd: null
nsIContentPolicy.IMAGE: undefined
nsIContentPolicy.TYPE_IMAGE: 3
----------------

Игра «найди хоть одно отличие в этих дампах» не займёт и пары секунд. Самое главное: теперь я не могу определить родительский таб для картинки, пришедшей из CSS (wnd:null). Во всяком случае теми методами, которые работали в предыдущих версиях этого браузера.

Я бы зафайлил в bugzilla, если бы знал, что это действительно баг, а не фича, связанная с подготовкой к выходу версии 1.0. С другой стороны, может быть я просто что-то не так понял/сделал. И английский, да. Зато теперь я хоть знаю ради чего жду релиза и/или последующих версий.

Categories: dHtml, Soft | comments: (4)

Комментарии

1. mihun 22nd September 2004 - 21:17

Кстати, вот здесь http://phptr.com/promotion/1484?redir=1
есть несколько интересных книг, в том числе фундаментальное чтиво «Rapid Application Development with Mozilla». Бесплатно.

Mash:

Спасибо. Правда, это уже есть в Q-Links :)

2. Aliot 26th September 2004 - 22:01

Случайно нашел страницу. Правда, плагин не заработал в FF1.0, но я был бы очень рад если бы заработал. Без этого не стану пользоваться FF, а он мне очень нравится.
Жду и надеюсь на успех!

Mash:

Хотел было коротко написать о механизме работы этого расширения, но понял, что коротко не получится. Попробую совсем-совсем коротко. :)

Суть в том, что определяя, нужно ли разрешать загрузку какой-либо картинки, мы должны найти родительский по отношению к этой картинке таб и узнать настройки данного таба. То есть выяснить, разрешил ли пользователь загружать в нём изображения или нет, если да, то все или только из кэша.

В младших версиях FF я могу это сделать (по крайней мере в FF0.9.3, в остальных не тестировал). В FF1.0PR сделать это для изображений, пришедших из CSS, невозможно. Есть ещё пара отличий PR-версии от предыдущих, но это основная проблема. Если затачивать под PR, то получится половинчатое решение поставленной задачи.

Самое главное. Подмена версии в install.rdf, как вы уже написали, не поможет. Причина неработоспособности кроется в баге PR и связано это со сборкой из «стабильных» исходников (одно из моих предположений оправдалось). В актуальных версиях Мозиллы этот баг исправлен. Начиная с версии 1.1 лиса и мозилла снова будут иметь общую базу исходников и тогда это расширение заработает. Если разработчики проникнутся необходимостью исправления этого бага до релиза FF1.0, то заработает и раньше.

В любом случае, я бы не советовал пользоваться тем расширением, которое в данный момент лежит на сайте. Оно слишком сырое. Постараюсь выложить нормальную версию в течение месяца. Или даже через пару недель. Сделано это будет для людей, желающих потестировать (в FF0.9) и высказать свои замечания. Потом останется лишь запастись терпением, ожидая выхода «нужной» версии FF. Так что заходите ещё, уже не случайно. :)

3. Aliot 26th September 2004 - 22:04

P.S. Собственно, чтобы он установился пришлось даже редактировать содержимое (версию). Но это не помогло.

4. Sagrer 12th October 2004 - 01:14

цитата
______
В младших версиях FF я могу это сделать (по крайней мере в FF0.9.3, в остальных не тестировал). В FF1.0PR сделать это для изображений, пришедших из CSS, невозможно.
______

Я нутра мозиллы не знаю такчто просто типа рассуждения :) :

Ну а вообще — можно в мозилле узнать, скачивалась ли ранее картинка по определенному адресу (в смысле есть ли она в кеше)?
И второе — можно ли узнать какой был режим загрузки изображений у родительского таба при создании дочернего таба?

Если и то и другое можно то почему нельзя сделать так — при создании дочернего таба ставится тот же режим загрузки картинок что и у родительского. Если режим — показывать только закешированные картинки — то проверять есть ли картинка уже в кеше, если есть — показать. Нет — не показать и ессно не скачивать.

З.Ы. Вот есть еще такая штука — бывает загружаеш страницу — сама страница грузится а ранее скачанные картинки берутся из кеша. А потом бывает грузиш ту же страницу — а картинки скачиваются заново хотя ранее были закешированы. Собсно потому такой вот экстеншн и нужен (и поэтому многие любят эту фишку в Опере) — ранее скачанные картинки никогда не качаются заново, даже если на сайте они изменились.
В общем можно ли сделать такой режим — если картинка не была закеширована — качается. Если хоть раз попадала в кеш — без особого распоряжения она не будет перезагружена никогда. ?

Mash:

>> Можно в мозилле узнать, скачивалась ли ранее картинка по определенному адресу (в смысле есть ли она в кеше)?

Да.

>> Можно ли узнать какой был режим загрузки изображений у родительского таба при создании дочернего таба?

Да.

>> Если и то и другое можно то почему нельзя…

Можно.

У меня есть две причины не торопиться с написанием этого расширения:

  • скорее всего оно не будет работать в FF1.0, т.к. исправить баги браузера этой версии я не могу. Поэтому спешить особого резона нет;
  • много других дел и, как следствие, мало свободного времени.

Потерпите, что-нибудь придумаем. :)

Комментарии временно отключены.