Mozilla: session savers and extensions

23rd February 2006 - 15:59

Пара слов о всевозможных «session saver»-расширениях (далее SS) для Fx.

Имеем: несколько расширений, работа которых завязана, к примеру, на свойствах отдельно взятой вкладки (tab), и несколько тех самых SS. Далее я буду говорить лишь об ILO, но это не единственное расширение, нуждающееся в корректном восстановлении информации.

В ILO значение политики загрузки объектов хранится в свойствах вкладок. Для одной вкладки мы устанавливаем iloTabPolicy равным 1 («Загружать всё»), для другой — 3 («Загружать только из кеша») и т.д. При восстановлении пользовательской сессии при помощи одного из SS создаётся определённое количество окон/вкладок браузера, для каждого из них устанавливаются значения размеров окон, выбранной вкладки, позиции прокрутки, запрета/разрешения плагинов/js/графики, ещё-много-чего, но только не политики ILO. Отношение понятно: расширение (слава Б.) не слишком известное, поэтому авторы SS либо вообще не знают о его существовании, либо плевать хотели на него. Позиция логична, позиция принимается. Вопрос в другом: где API? Да, товарищи, где API? Где возможность легкого и комфортного сохранения данных моего расширения в расширении вашем?

Здесь получается так: либо авторы каждого SS пытаются сохранить данные о работе каждого мало-мальски известного расширения, нуждающегося в этом, либо эта обязанность перекладывается на плечи разработчиков неSS расширений. Второе гораздо логичнее, но… Ури, где у него API?

onLoad: function() {
... ...
  //~ for work with SessionSaver (like version 0.2.1.030.4) we need this lines:
  if (this.browser.__ssAddTabMod) {
    eval('SessionSaver.captureTab =' + SessionSaver.captureTab.toString().replace(
      'tab.__ssLocalData = tabSession;',
      'if (browser && browser.iloTabPolicy) tabSession += "##ILO##" + browser.iloTabPolicy; \
       tab.__ssLocalData = tabSession;'
    ));

    eval('SessionSaver.historyRecall =' + SessionSaver.historyRecall.toString().replace(
      'var historyURL = entry[1];',
      'var iloTabPolicy = entry[1].split("##ILO##")[1]; \
       var historyURL = entry[1].split("##ILO##")[0];'
    ));

    eval('SessionSaver.historyRecall =' + SessionSaver.historyRecall.toString().replace(
      'if (isStartup && this.orbiterChild)',
      'curBrowser.iloTabPolicy = parseInt(iloTabPolicy); \
       if (t == selectedtab) ILO.indicatorSet(curBrowser.iloTabPolicy); \
       if (isStartup && this.orbiterChild)'
    ));
  }
}

Разве не прелесть? С учётом того, что на данный момент в ILO приходится хакать три SS-расширения и нет никаких гарантий, что завтра все три не изменят свой формат хранения данных и логику работы…

А кто виноват? Ну, конечно же, я.

Привет!

Поставил расширение ImgLikeOpera, но при открытии браузера настройки сбрасываются на «Загружать только из кеша».

Да, совершенно реальное письмо. И не одно такое было. Без списка расширений и прочего. Пользователи даже не задумываются о механизме работы так называемого собери-сам-себе-браузер-из-расширений. Да они и не должны, откровенно говоря.

Одному письму я порадовался, без п.

From: Simon Bünzli

Then I’ve seen somebody requesting compatibility for Crash Recovery with another of your extensions: ImgLikeOpera — which through interesting hacks already supports the other two major players in the session saving business.

Unfortunately, Crash Recovery isn’t as easy to hack, since it’s an XPCOM component. Now, before I myself introduce major hacks for all possible extensions, I’ve been thinking about a way for any extension to store information which is restored automatically or with minimal interaction by the extension.

The one possibility I’ve come up with for today’s version 0.5.6 (resp. Session Manager 0.2.8) is to restore a specific set of XML attributes on the tab itself (where I already save values for Tabbrowser Preferences and Tab Mix Plus): all attributes whose name starts with "CR_" will be restored as is. All you’d have to do would thus for one save your persistent value as a tab attribute and restore it after Crash Recovery restored a tab. As for the restoring, I’m currently adapting the code to make it more bearable — this won’t thus be possible before the next release (which however is due in one or two days at most). So here goes the code which would be needed for ImgLikeOpera:

/* Test for the existence of Crash Recovery */
if ("@zeniko/crashrecoveryservice;1" in Components.classes) {
  // ...
}

/* Set the value in the correct place */
xulTab.setAttribute("CR_iloTabPolicy", browser.iloTabPolicy);
/* where xulTab is this.browser.selectedTab */

/* Listen for recovered tabs and restore the value if needed
 * - this event takes place after the tab has been restored,
 * but before its content is loaded (after loading the content,
 * you get a CRTabRestored event) */
/* -- THIS CODE REQUIRES CRASH RECOVERY 0.5.7 -- */
gBrowser.addEventListener("CRTabRestoring", function(aEvent) {
  var tab = aEvent.originalTarget;
  if (tab.hasAttribute("CR_iloTabPolicy")) {
    this.getBrowserForTab(tab).iloTabPolicy =
      parseInt(tab.getAttribute("CR_iloTabPolicy"));
  }
}, false);

This should be clean enough a solution to interact in an extensions-neutral way with Crash Recovery, don’t you think? Would be nice to actually see it implemented.

Вот собрались бы авторы SS вместе, да прикрутили бы каждый что-то вроде

gBrowser.addEventListener("SSRestoring", function(aEvent) {
  var data = ...SomeDepository...;
  if (data.ILO_GUID) {  ...  }
}, false);

И чтобы я отрабатывал этот SSRestoring не задумываясь о том, какой из SS установлен у пользователя.

Ну и здесь ещё непонятно как будет.

Categories: PHP,Soft | comments: (5)

Комментарии

1. kukutz 24th February 2006 - 13:21

Я не знал, что их больше одного.

А чем каждый из них лучше? Каким стоит пользоваться?

Mash:

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

Мне известно о следующих расширениях, работающих с сессиями:

  • SessionSaver;
  • TBE — наверное, уже наслышан о его «безконфликтности»;
  • Tab Mix Plus — начиная с версии 0.3;
  • упомянутый здесь Session Manager — ещё даже не устанавливал.

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

2. Anthonio 6th March 2006 - 12:45

Чем меньше нам надо, тем проще будет жизнь… Я вообще выключил SS в TBE.
P.S. Почему-то пробелы в форме не работают и кнопки управления??? Пробелы через буфер обмена вставляю…

3. Anthonio 6th March 2006 - 12:46

Sorry, TMP… Ошибся…

4. Владимир Палант 5th May 2006 - 04:50

А почему бы не попытаться договориться с авторами расширений? ИМХО для TBE и Tab Mix Plus это реально. Автора Session Manager не знаю, но попробовать можно. Вот с Session Saver придется тяжело, конечно…

Mash:

Я сам только из больницы выполз, да и с англицким туго. Попробую потом как-нибудь начать договариваться. Если есть желание/идеи (да ещё и знакомства с авторами TBE/TMP), то буду рад любой помощи.

5. Владимир Палант 18th May 2006 - 13:25

Ситуация несколько изменилась. В Firefox 2.0 будет встроенная функция для восстановления сессий (в BonEcho Alpha 2 уже есть, насколько помню). Соответственно расширения с такой функциональностью скоро исчезнут, и подстраиваться придется уже только под одну реализацию. При этом, если есть дельные предложения по улучшению — пробить их вполне реально. Рекомендую посмотреть, что они там сделали.

Mash:

Я в посте уже говорил, что с этим моментом ещё непонятно как будет. Теперь, раз уж всё-таки прикрутили nsSessionStore, то надо будет скачать/посмотреть. На днях попробую поковырять.

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