' +'' +'' +'' +'' +'' +'' +'' +'' +'' +'' +'' +'')//-->
В этой статье достаточно упрощённо, "на пальцах", рассказано об основных технических особенностях построения расширения x.Block : Русский резак. Почему "на пальцах" – да просто потому, что "тру‑профи" могут всё это увидеть самостоятельно в исходном коде аддона, поэтому и подача этого материала сделана не для них, а для "чисто конкретно интересующихся обычных граждан"…))
В этой статье:
Итак, поехали – начнём с главного…
Код использует только чистый JS (ES5), все неподдерживаемые в "старых" браузерах функции заменены на аналоги.
Все скрипты работают в "строгом" режиме – для гарантированного выполнения функций и облегчения отлова ошибок.
Всё управление работой расширения осуществляется через попап‑окно, вызываемое по щелчку на иконке на тулбаре. Интерфейс окна предельно прост и интуитивно понятен, для всех "кликабельных" элементов добавлены тултипы и подсказки. Текущая индикация работы расширения – через его значок на тулбаре.
Страница настроек всех основных и дополнительных опций и функций, включая управление параметрами браузера и самого x.Block'а, может быть открыта либо в этом же попапе, либо в отдельной вкладке.
В манифесте расширения отдельная страница настроек также указана – исключительно в связи со "старой привычкой" пользователей к способу вызова окна настроек, несмотря на то, что гораздо удобнее (и быстрее!) вызвать Настройки "в один клик" прямо со значка на тулбаре.)
Для отрисовки интерфейса попапа и страницы настроек не используются никакие сторонние JS/CSS библиотеки, весь интерфейс работает на чистом HTML с минимально необходимым набором стилей и скриптов. Язык интерфейса, сообщений, подсказок и описания – только русский (жёстко зашит в коде).
Расширение x.Block : "Русский резак" имеет модульную структуру скриптов, автозагружаемых по необходимости. Выгрузка модулей и очистка занимаемой ими памяти производится автоматически, по мере надобности (если модуль не используется постоянно). Это снижает общий текущий расход памяти и позволяет достаточно легко добавлять новые возможности и функции в системе "ECR". Основные функции управления работой аддона и запуском отдельных модулей размещены в скрипте xblockbg.js (невыгружаемый фоновый скрипт).
Функции управления inline‑обработкой страниц и запуска некоторых сервисных функций размещены в запускающем скрипте‑инжекторе xblockcs.js. Для запуска конкретных требуемых функций на конкретных страницах через связь между этим скриптом и фоновым процессом подгружаются отдельные (инжектируемые) скрипты‑модули. Набор этих модулей определяется настройками, заданными как для конкретного сайта, так и для всего аддона в целом (например, функция автоматической блокировки видео или флэша).
Все инлайн‑скрипты задействуются (отрабатывают) непосредственно при загрузке веб‑страниц и не занимают память при фоновой работе аддона. Все эти скрипты также удаляются из кода страницы сразу же после их загрузки и запуска, не "захламляя" в дальнейшем текущий статичный код страниц.
Основной API, используемый в аддоне – chrome.webRequest и его "блокирующая" часть webRequestBlocking, этот API отвечает непосредственно за проверку http‑запросов и их блокировку в соответствии с настроенными правилами фильтрации. Для обеспечения корректной работы аддона с любыми хостами и протоколами в манифесте запрашивается разрешение "<all_urls>".
Для выполнения инжекции скриптов и контекстных действий на веб-страницах задействуются два API – chrome.tabs и chrome.contextMenus. Также применяется разрешение activeTab, упрощающее отдельные контекстные действия на текущих страницах.
Для текущего хранения загруженных фильтров и подписок используется API chrome.storage, также в манифесте аддона запрашивается разрешение unlimitedStorage – "страшное и ужасное", но необходимое – поскольку размер даже небольшого числа фильтров и подписок практически всегда превышает лимит по умолчанию (5Мб). В частности – объём работающих правил блокировки с десятком подписок уже превышает 7–8 Мб в "сыром" виде.
При обработке загруженных подписок и частных правил, заданных пользователем, все правила сохраняются как текст (с разделением по строкам), списки используемых фильтров – в формате json.
Для управления блокировками по типу контента и настройками приватности, а также для отключения различных "следящих" механизмов браузера применяются два API: chrome.contentSettings и chrome.privacy. Управление блокировками по типу контента перекрывает часть настроек браузера (chrome://settings/content).
Для вызова попапа (или окна настроек вместо него) применяется API chrome.browserAction. Дополнительно, для получения кэшированных иконок посещённых сайтов и отображения их в попапе запрашивается разрешение "chrome://favicon/*".
Аддон не имеет практических ограничений по версии браузера, используемые API работают в версиях 29+.
Исходный код НЕ обфусцирован, исключительно с целью удобства при возможных доработках и для облегчения читаемости кода при его исследовании. Если кому‑то это критично – удалите комментарии и пропустите через компрессоры.)
Как уже сказано, x.Block использует модульную структуру скриптов. Эта концепция значительно сокращает потребляемый объём памяти "в моменте" и процессорных ресурсов. Также это уменьшает вероятность ошибок – модули каждый раз обрабатываются "с нуля". Некоторая задержка по времени на подгрузку модулей практически не сказывается на общем быстродействии (за счёт кэширующих механизмов системы).
Для отдельных функций используются следующие динамически подгружаемые блоки:
Как сказано выше, x.Block также использует модульную структуру и для запуска отдельных контентных скриптов на веб-страницах. Эта концепция также сокращает потребляемый объём памяти "в моменте" и процессорных ресурсов, затрачиваемых на обработку контента страниц. Этот подход, кроме того, снижает вероятность ошибок и конфликтов – все инжектируемые модули обрабатываются независимо друг от друга. Некоторая задержка по времени на подгрузку инлайн-модулей практически не сказывается на общем быстродействии (за счёт локального кэширования).
Для отдельных функций используются следующие динамически подгружаемые инжекторы:
Для расширения функционала правил добавлен дополнительный синтаксис:
Можно задавать и другие собственные правила, используя расширенный синтаксис AdBlock+.
После установки при первом запуске расширения выполняется автоматическая настройка наборов подписок по умолчанию и сразу же производится* их загрузка, автоматическое обновление и первоначальное построение фильтров и правил блокировки.
* В комплекте поставки x.Block'а отсутствуют те фильтры и подписки, которые могут быть загружены сразу же после установки расширения, непосредственно из Сети. Это даёт возможность комплектовать аддон минимально необходимым набором файлов и резко уменьшить размер поставляемого дистрибутива. Автор не видит смысла в создании "монструозного" дефольтного набора для блокировщика, поскольку часть комплектных фильтров "из коробки" становится неактуальной после первого же их обновления.
В дальнейшем процесс автообновления выполняется в соответствии с настройками, по умолчанию – один раз в сутки. Обновление в ручном режиме может выполняться в любое время, в том числе – после изменения наборов подписок, добавления или изменения (или после импорта) пользовательских правил. Во всех этих случаях также запускается полное перестроение всего списка правил фильтрации.
Если в процессе обновления любой из подписок произошёл сбой или если эта подписка не может быть загружена, все правила фильтрации, заданные в этой подписке остаются неизменными (от предыдущего успешного обновления).
Полное перестроение правил фильтрации производится только после успешного обновления всех активных подписок. В противном случае будет использована последняя "правильная" версия фильтров, имеющаяся в локальном хранилище расширения. Это сделано исключительно с целью повышения общей надёжности работы блокировщика, во избежание ситуаций, когда из‑за одного "кривого" фильтра может происходить некорректная обработка контента.
Общие подходы и важные особенности настройки и работы модуля автообновления смотрим в отдельной статье.
При первом запуске "Русского резака" все параметры настроек устанавливаются по умолчанию, любые дополнительные функции не задействуются, никакие системные (браузерные) настройки приватности и ограничения доступа по типу контента не устанавливаются.
Также при этом в Настройках выключены блоки пользовательских фильтров и дополнительных подписок.
В таком режиме x.Block будет работать до момента вызова пользователем окна Настроек. В принципе, этого достаточно для блокировки основного "мусора" с учётом правил подписок по умолчанию.
В общем, если "всё устраивает", можно просто установить, пользоваться и ничего не "крутить".)
В общем и целом, в x.Block'е поддерживается совместимость "снизу вверх", т.е. параметры предыдущих билдов штатно "подхватываются" (и применяются) каждым следующим. Это даёт возможность "безаврального" перехода на новые версии и повышает общий комфорт использования аддона.
Если производится обновление версии расширения, после его перезапуска проверяются все сохранённые параметры и, при необходимости, автоматически устанавливаются настройки добавленных новых функций (по умолчанию), все ранее изменённые или настроенные пользователем параметры при этом не изменяются (как и наборы ранее настроенных пользователем фильтров и подписок).
Запуск автоматического обновления установленных подписок при этом может и не производиться, если для них не превышен заданный "срок годности".