Firefox: назад в будущее?
Сегодня вечером посидел, подумал, расширение 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:
>> Можно в мозилле узнать, скачивалась ли ранее картинка по определенному адресу (в смысле есть ли она в кеше)?
Да.
>> Можно ли узнать какой был режим загрузки изображений у родительского таба при создании дочернего таба?
Да.
>> Если и то и другое можно то почему нельзя…
Можно.
У меня есть две причины не торопиться с написанием этого расширения:
Потерпите, что-нибудь придумаем. :)