Морозко • RU : Что "под капотом"

Бармалей 24.08.2014 09.03.2021 2780.0

Пояснения по особенностям работы расширения Морозко • RU. Некоторые технические подробности по разработке и особенности применения аддона на различных версиях браузеров.

В этой статье:


Как это работает: принцип блокировки неактивных вкладок

Основная функция Морозко • RU – выгрузка неактивных вкладок из памяти с целью уменьшения расхода потребляемых браузером ресурсов. Принципиально это выполняется за счёт автоматического (или ручного) переключения неактивных вкладок на пустую* страницу. При этом сохраняется возможность быстрого возврата (активирования) таких вкладок в предыдущее состояние. Этот метод решает задачу значительного снижения расхода памяти в браузере и позволяет существенно повысить общее быстродействие активных вкладок.

* Если быть точным, это не совсем так – при выгрузке производится замена на специальную статическую страницу‑заглушку, содержащую минимальный набор управляющих элементов и скриншот замороженной страницы (опционально, если задано в настройках). Тем не менее, такая "не совсем пустая" страница практически не потребляет никаких ресурсов и работает в одном потоке с самим расширением.

Процесс выгрузки (собственно "заморозка") приводит к полному удалению из памяти всех ресурсов и кода неактивной страницы (включая скрипты, стили и другие объекты). Это, естественно, приводит к высвобождению как памяти, так и процессорных ресурсов для работы с другими вкладками. Заморозка выполняется практически мгновенно, поскольку размер кода локальной страницы‑заглушки минимален. При необходимости, этот процесс можно ещё больше ускорить, отключив в Настройках функцию создания скриншотов.

В автоматическом режиме запуск процесса выгрузки производится фоновым скриптом расширения по заданному в настройках тайм‑ауту неактивности. Если в период, меньший этого времени, конкретная вкладка была активирована, отсчёт времени неактивности сбрасывается и начинается снова уже с момента повторного переключения с этой вкладки на любую другую.

Процесс обратного восстановления выгруженной страницы (ре-активация или "разморозка"), фактически равносилен её перезагрузке и, по понятным причинам, всегда будет более длительным, чем заморозка. Время ре-активации кокретных страниц зависит от настроек кэширования в вашем браузере и общей сложности кода восстанавливаемой страницы.

Дополнительным "бонусом" при разморозке является то, что при перезагрузке обнуляются и все возможные утечки памяти, возникающие при работе скриптов на веб-страницах.

В автоматическом режиме ре-активация замороженной вкладки запускается сразу же при переходе на выгруженную неактивную вкладку. При этом в Настройках можно задать и дополнительную задержку, позволяющую заблокировать автоперезапуск неактивной вкладки при случайном переходе на неё. Наконец, в Настройках можно полностью выключить автовосстановление и активировать "замороженное" только вручную.

Указанный метод выгрузки заимствован из базовой версии расширения-прототипа (4.74 от 21.02.2013, применяется и в некоторых других подобных аддонах). Этот метод является наиболее простым и удобным для решения задачи выгрузки неактивных вкладок, при этом расширение может работать не только с веб‑страницами и локальными файлами, но и управлять активностью любых служебных страниц браузера, включая открытые во вкладках страницы других аддонов. Кроме того, такой подход позволяет работать и со страницами "огороженных" сайтов (таких как Chrome WebStore и подобные), на которых расширения в принципе не работают.

Единственным минусом "классического" метода выгрузки является то, что при аварийном завершении работы или при сбое управляющего аддона (либо при его принудительном обновлении с перезагрузкой) закрываются также и все "замороженные" на этот момент вкладки. Тем не менее, этот минус не может считаться существенным, если учесть, что в аддоне есть функции восстановление аварийной сессии и осуществляется запись истории заморозок, позволяющие в пару кликов открыть все закрытые вкладки.

Для сравнения: в последующих версиях прототипа, начиная с инженерной версии 5.25 и вплоть до текущих версий, а также в некоторых других аналогичных расширениях, используется другой метод отслеживания и управления выгрузкой неактивных страниц. Этот метод предполагает инжекцию скрипта во все вкладки и, по определению, не может быть применён к служебным страницам браузера, других расширений и к страницам "огороженных" сайтов. Кроме того, с учётом ужесточения политики безопасности в современных браузерах, этот метод требует дополнительных разрешений в манифесте аддона, что, в свою очередь, ещё больше ограничивает его применение.

Теоретически, указанный выше недостаток "классического" метода выгрузки должен отсутствовать при инжектировании автономного скрипта в веб‑страницы. В "Морозко • RU" метод инжекции не применяется, поскольку кроме указанных ограничений он приводит к дополнительным "накладным расходам" ресурсов браузера (затраты на обработку конктент‑скриптов) и может быть потенциальным источником проблем при работе с некоторыми веб‑ресурсами. Применение комбинации обоих методов в русском форке также не предполагается, так как существенно усложняет структуру расширения и не может дать полную гарантию его работоспособности во всех случаях.


Условия и особенности применения расширения в разных браузерах

Расширение Морозко • RU может применяться на любых версиях любых браузеров. Эта универсальность обеспечена независимостью способов управления вкладками от особенностей кокретных версий, а также тем, что код скриптов аддона, фактически, является набором стандартных процедур, работающих независимо от функционала любого браузера на движке Chromium.

На браузерах достаточно старых версий аддон не имеет никаких ограничений, связанных со встроенным функционалом самого браузера, и может применяться безальтернативно для управления расходом ресурсов.

В современных версиях браузеров следует помнить и о штатных способах управления расходом памяти:

1. Метод выгрузки неактивных вкладок практически аналогичен работе "Tab Discard", функции блокировки вкладок, появившейся в Chromium‑браузерах с версии 46 и работающей во всех современных браузерах.

2. Метод выгрузки также может считаться аналогом "Tab Freeze", более продвинутой штатной функции замораживания вкладок, появившейся в Chromium‑браузерах с версии 77 и также имеющейся в более новых браузерах.

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

При этом нужно помнить, что в отличие от расширения штатные функции браузера работают не по таймеру неактивности, а по фактическому доступному объёму физической памяти в каждый конкретный момент времени. На практике это означает невозможность прогнозирования (и настройки) момента деактивации фоновых вкладок, так как в общем случае текущий расход ресурсов полностью зависит от конкретного текущего набора сайтов и определяется только "тяжестью" кода конкретных текущих открытых страниц.

В любом случае, применение аддона даёт более предсказуемый процесс "гашения" неактивных вкладок и позволяет достаточно гибко настроить условия их деактивации. Если же подобная гибкость не нужна, использование расширения на современных версиях браузеров не будет (для вас) оправданным, ведь сам аддон тоже расходует ресурсы… :)


Исходный код, интерфейс и задействованные API

В коде используется только чистый JavaScript (ES5), неподдерживаемые в "старых" браузерах функции отсутствуют.

В интерфейсе применяются стили стандарта CSS2, неподдерживаемые в "старых" браузерах директивы отсутствуют.

Интерфейс расширения представлен отдельными HTML-страницами, включая:

  • попап-окно с кнопками оперативных действий, вызывается при щелчке по кнопке расширения на тулбаре;
  • шаблон страницы-заглушки, динамически меняется в зависимости от замещаемой неактивной страницы, в общем случае содержит иконку и URL замороженной страницы, краткую инструкцию по разморозке, кнопку добавления сайта в список исключений и опциональный скриншот;
  • Настройки, выставляются все параметры расширения и указываются списки исключений;
  • Историю замороженных вкладок, оперативное открытие любой из ранее заблокированных вкладок;
  • Восстановление вкладок, автоматически отображается после аварийного завершения работы;
  • встроенную Справку с описанием основных опций и принципов их применения;
  • Историю версий с описанием изменений в текущих релизах.

Основным API, используемым для управления вкладками и выполнения большей части функций, является chrome.tabs, который также обеспечивает работу опционально запускаемых контент‑скриптов (при выборе в Настройках метода "HTML5‑Canvas" для снятия скриншотов).

Кроме автоматического управления вкладками через постоянно работающий фоновый скрипт, вызов действий вручную возможен из окна попапа, из контекстного меню страницы или с помощью горячих клавиш. Для работы с этими функциями применяются, соответственно, API chrome.browserAction, chrome.contextMenus и chrome.commands.

Для текущего хранения пользовательских настроек используется API chrome.storage. В манифесте также добавлено разрешение [ "unlimitedStorage" ], превентивно снимающее возможные ограничения на размер сохраняемых данных. Кроме настроек, локальное хранилище используется для хранения сделанных при заморозке скриншотов.

Для обеспечения работы аддона с любыми вкладками, включая локальные страницы и служебные страницы браузера и других расширений, в манифесте запрашиваются разрешения [ "*://*/*", "<all_urls>" ].

Для отрисовки иконок замораживаемых вкладок в манифесте запрашивается разрешение [ "chrome://favicon/*" ].

В "Морозко • RU" сделана полноценная русификация, используется единственный язык для всех элементов интерфейса, справочных и информационных сообщений и пунктов меню – русский. Текстовые строки жёстко зашиты в код, другие языковые локализации не предусматриваются. Это сделано с целью упрощения кода расширения и для повышения его быстродействия в целом.

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

Исходный код НЕ обфусцирован, исключительно для удобства при возможных доработках и облегчения читаемости кода при его исследовании.



Так держать! :)
Технические детали

Общие технические сведения о разработке
Статус разработки:Активная, поддерживается автором
Язык интерфейса:Русский
Версия браузера:25+
Протестировано в:SRWare Iron 31/36/49 + 360 Extreme Explorer 9/11/12/13 (CR-63/69/78/86)
Технологии и API:Чистый JavaScript (ES5), API: browserAction, tabs, storage, contextMenus, commands

URLПоделиться

Всего комментариев: 0
close