В Firefox 14 и выше пофиксили баг 754608.
Bug 754608 - [New Tab Page] shows thumbnails from pages with "Cache-Control: no-store", and HTTPS pages when HTTPS disk caching is disabled
Страницы с no-store в Cache-Control не будут сохранять свои эскизы для новой вкладки. Сделано это для безопасности, но оказалось, что сотни самых обычных страниц почему-то прописывают себе no-store (например, thepiratebay.se, kinopoisk.ru, ubuntu.ru, thevista.ru). Зачем они это делают, не знаю, но это реальность. Получается, что половина моих превьюшек совершенно пустая, хотя никакой секретной информации на сайте про Убунту, разумеется, нет.

Хотя в программировании я полный ноль, я попытался исправить это для себя, взяв за основу известное расширение InlineDisposition (оно меняет значение заголовка Content-Disposition). Я хотел переделать его, чтобы выреза́ть no-store из Cache-Control, для этого в файле inlinedisposition.js я заменил:

Выделить код

Код:

_re: /^\s*attachment/i,

    _httpResponse: function( chan )
    {
        var disp = "";

        try {
            chan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
            disp = chan.getResponseHeader("Content-Disposition");
        } catch (e) { }

        if (chan.loadFlags & Components.interfaces.nsIChannel.LOAD_DOCUMENT_URI && this._re.test(disp))
            chan.setResponseHeader("Content-Disposition", disp.replace(this._re, "inline"), false);
    }

на

Выделить код

Код:

_re: /[\s]*no-store[\s]*[,]?/i,

    _httpResponse: function( chan )
    {
        var disp = "";

        try {
            chan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
            disp = chan.getResponseHeader("Cache-Control");
        } catch (e) { }

        if (chan.loadFlags & Components.interfaces.nsIChannel.LOAD_DOCUMENT_URI && this._re.test(disp))
            chan.setResponseHeader("Cache-Control", disp.replace(this._re, ""), false);
    }

Некоторые странички с no-store начали сохранять эскизы, но вот, к примеру, те четыре, ссылки на которые я привёл выше, не хотят. ЧЯДНТ?

Sid
Так выложите его в "Расширения". Думаю, многие будут благодарны Вам.

Пандёнок
То, что получилось, криво работает по непонятной мне причине. Это я просто приложил XPI, чтобы можно было легко потестить.

В патче делается проверка на httpChannel.isNoStoreResponse(), а после удаления no-store isNoStoreResponse() по-прежнему true, так что, видимо, надо еще что-то удалить/изменить.

10-07-2012 01:22:17
Наверное, надо поизучать спецификации, а то какой-то второй BetterCache выходит.
Оно работает, но это слишком сурово, надо понять, что реально надо удалять.
Можно попробовать найти исходник nsIHttpChannel.isNoStoreResponse().

10-07-2012 01:24:50
А вообще, пусть переделывают патч, чтобы хотя бы закрепленные сайты были с превьюшками.

Infocatcher пишет

Можно попробовать найти исходник nsIHttpChannel.isNoStoreResponse().

http://mxr.mozilla.org/mozilla-central/ … l.cpp#1085

Выделить код

Код:

HttpBaseChannel::IsNoStoreResponse(bool *value)
{
  if (!mResponseHead)
    return NS_ERROR_NOT_AVAILABLE;
  *value = mResponseHead->NoStore();
  return NS_OK;
}

http://mxr.mozilla.org/mozilla-central/ … eHead.h#36

Выделить код

Код:

bool                  NoStore() const { return mCacheControlNoStore; }

а поле mCacheControlNoStore устанавливается, в частности, вот здесь:
http://mxr.mozilla.org/mozilla-central/ … ad.cpp#615

Выделить код

Код:

void
nsHttpResponseHead::ParseCacheControl(const char *val)
{
    if (!(val && *val)) {
        // clear flags
        mCacheControlNoCache = false;
        mCacheControlNoStore = false;
        return;
    }

    // search header value for occurrence(s) of "no-cache" but ignore
    // occurrence(s) of "no-cache=blah"
    if (nsHttp::FindToken(val, "no-cache", HTTP_HEADER_VALUE_SEPS))
        mCacheControlNoCache = true;

    // search header value for occurrence of "no-store" 
    if (nsHttp::FindToken(val, "no-store", HTTP_HEADER_VALUE_SEPS))
        mCacheControlNoStore = true;
}

вызовом вот отсюда:
http://mxr.mozilla.org/mozilla-central/ … ead.cpp#19

Выделить код

Код:

nsHttpResponseHead::SetHeader(nsHttpAtom hdr,
                              const nsACString &val,
                              bool merge)
{
    nsresult rv = mHeaders.SetHeader(hdr, val, merge);
    if (NS_FAILED(rv)) return rv;

    // respond to changes in these headers.  we need to reparse the entire
    // header since the change may have merged in additional values.
    if (hdr == nsHttp::Cache_Control)
        ParseCacheControl(mHeaders.PeekHeader(hdr));
    else if (hdr == nsHttp::Pragma)
        ParsePragma(mHeaders.PeekHeader(hdr));

    return NS_OK;
}

Во всём этом хозяйстве заставляет задуматься вот этот кусочек:

Выделить код

Код:

if (!(val && *val)) {
        // clear flags
        mCacheControlNoCache = false;
        mCacheControlNoStore = false;
        return;
    }

Уж не к тому ли это, что, что поля mCacheControlNoCache/mCacheControlNoStore устанавливаются в false только при совсем пустом хидере Cache-Control?

okkamas_knife
Вот именно. Размер эскизов во встроенном решении (точнее, во встроенной проблеме) - 800х600. ошибся - 640х360.
Для сравнения: Fast Dial сохраняет эскизы размером 300х225, SuperStart - 212х132, FVD SpeedDial - 400х480, Рабочий стол - 286х202.

okkamas_knife
Да, реально. Причем они в папке thumbnails с расширением .png, никак не спрятаны. И их не девять штук, а много. В общем, кеш всех недавно посещённых страниц в картинках.

10-07-2012 11:13:22

okkamas_knife пишет

взять и поставить спиддиал

А вот это вредный совет. Как раз в классическом SpeedDial размер эскизов в кеше - 800х800!

okkamas_knife пишет

спиддиал назвал только потому что помню название ибо подобными расширениеями не пользуюсь и считаю их бесполезными т тормозящими.

Да, как раз спиддиал самый тормозящий. Я на почти новом профиле не дождался, когда же он загрузит эскизы. 8-(

hydrolizer пишет

Уж не к тому ли это, что, что поля mCacheControlNoCache/mCacheControlNoStore устанавливаются в false только при совсем пустом хидере Cache-Control?

Возможно... :/
У меня выходит, что надо удалить Cache-Control, а вот Pragma почему-то не мешает.

Как-то так, но это весьма корявое решение.

okkamas_knife
Вот подвела меня память. Во встроенном решении всё-таки 640х360. Но это тоже немало.

Эх, всё оказалось совсем запущено. Будем писать в мозиллу.
Но спасибо за помощь! :beer:

Infocatcher пишет

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

Вот-вот. Определённая логика в этом патче есть, но когда половина сайтов использует Cache-Control от фонаря, то получается маразм: скриншот аккаунта PayPal (на котором можно прочитать имя, баланс и список последних платежей) сохраняется, а невинная страничка ya.ru — нет.

https://bugzilla.mozilla.org/show_bug.cgi?id=756881
https://bugzilla.mozilla.org/show_bug.cgi?id=725189