Get CRX RU : Что "под капотом"
Опубликовано: Бармалей · 04.01.2014 · 02:00 ••• Обновление: Вчера · 06:13 0

Расширение Get CRX RU предназначено для использования в браузерах с движком Chromium и построено на базе стандартных API для этих браузеров. Кроме собственно функций API, в расширении применяются "самописные" процедуры (функции), написанные на языке JavaScript. Эти инструменты применяются для решения основной задачи расширения – загрузки (локального сохранения) из официальных репозиториев установочных файлов любых имеющихся там расширений, приложений или тем (далее – аддонов).

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

Функции получения прямой ссылки различаются для разных репозиториев. В частности, наиболее "анально-огорожен" в этом плане магазин приложений Google (CWS, Chrome WebStore). Тем не менее, шаблоны конечных URL известны достаточно давно и изменяются они достаточно редко (в CWS, напр., последний раз замена шаблона была сделана в июне 2014 года), что позволяет строить на их основе любые загрузчики (навскидку – только разнообразных клонов Get CRX в магазине CWS попадалось порядка десятка). К слову – кроме расширений-загрузчиков существуют также простейшие букмарклеты (как минимально необходимое) и даже отдельные сайты (как максимально комфортное для юзера)), позволяющие "скачать из гуглозина".

Кроме самой главной (и самой простой) задачи в Get CRX RU присутствуют и другие "фирменные фишки", напр., создание файлов описаний (генерация), поиск удалённых аддонов в архивах, просмотр исходного кода аддонов перед их загрузкой и т.д..

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

В этой статье мы рассмотрим:

Итак, поехали!


Классические версии

С технической точки зрения всё просто – по известному шаблону и с учётом URL текущей страницы (конкретного расширения в CWS) формируется прямая ссылка на установочный CRX-файл. Эта ссылка подставляется в окно интерфейса в виде поля ввода (чтобы можно было изменить имя файла на желаемое). При нажатии пользователем кнопки сохранения файл загружается из репозитория с атрибутом "download" (иначе будет запрос на установку) и сохраняется локально.

Основной API, применяемый в этой версии – chrome.contextMenus, служит собственно для вывода пункта в меню страницы и отработки щелчка по нему.

Второй API – chrome.tabs – служит для создания отдельной вкладки или окна с юзер-интерфейсом и для принудительной переотрисовки значка в омнибоксе (поскольку мы его гасим на время загрузки (и меню, кстати, тоже отключаем)), чтобы исключить конфликты многократного нажатия и т.п.). Принципиально его можно было бы и не использовать (что и было сделано в конечном счёте с заменой разрешения на универсальное activeTab).

В отличие от исходного аддона, в Get CRX RU дополнительно используется API chrome.pageAction – для вывода значка-кнопки в адресной строке страницы (омнибокс). Сюда же относится API chrome.declrativeContent – позволяет сделать выгружаемое из памяти расширение и задать правила отрисовки значка в омнибоксе (статический фильтр по URL страницы, позволяет выводить значок на нужных страницах без удержания аддона в памяти). В связи с периодическими "новшествами", вводимыми производителями браузеров, взаимодействие с омнибоксом также периодически глючило и отваливалось (не отрисовывался или не работал значок-кнопка). Для решения этих проблем и были выпущены своевременные фиксы в отдельных билдах (причём, не только в классических версиях).

Кроме указанных, в этой линейке был также задействован API chrome.downloads. Сделано это было исключительно для обхода огороженности хром-браузеров по части CRX-файлов (у них особый статус, по этому расширению браузер сразу же пытается либо установить "нечто", либо вякнуть "отсюда ставить нельзя" и т.д.). Это сразу наложило определённые ограничения на работу аддона и заложило его потенциальный конфликт с другими (криво написанными) качалками. Почему "криво" – потому как нормальный аддон "понимает", что качается и кем/чем инициирован процес закачки. Соответственно, нормальный аддон и не будет конфликтовать с загрузчиком Get CRX RU (сам загрузчик ни с чем не конфликтует, в нём отслеживаются только собственные закачки).

Для упрощения обработки "своих" загрузок и с учётом автоматической выгрузки фонового скрипта из памяти введено ограничение на число одновременных закачек – нельзя качать больше одного файла за раз. Кому "маловато будет" – простой совет – купите таблеток от жадности.)) Потому как на сегодняшних скоростях закачки подождать несколько секунд не является проблемой.

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

Остальные части кода классических версий предназначены чисто для украшательства юзер-интерфейса. Поэтому в дальнейшем, при развитии проекта Get CRX RU, автор отказался от интерфейсной части в виде хтмл-файла (окно или вкладка) и оставил только фоновую скриптовую часть, добавив к ней все остальные "плюшки".

Сначала это вылилось в…


Get CRX RU : Mini

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

Применяемые API – те же, что и в классических версиях, дополнительно добавлены отдельные улучшения скрипта для повышения стабильности, корректности и удобства загрузок. В частности, добавлено автоформирование имени.

К этому времени уже стало ясно, что голым загрузчиком нам не обойтись, тут и появилась линейка…


Get CRX RU : Mini Plus

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

Дополнительно (для формирования расширенных файлов описаний загрузок) в этой линейке запрашивается разрешение [clipboardRead] – чтение текущего буфера обмена с последующей вставкой его содержимого в файл описания.

Кроме того, расширен запрос разрешений по маске URL с масок только для CWS до глобальной [<all_urls>] – это позволяет работать со ссылками на страницы аддонов не только на сайтах самих репозиториев, но и на любом другом ресурсе. Соответственно, в скрипт/меню добавлены функции работы со ссылками, а также определяется маска допустимых URL, на которых в контекстном меню страницы будет показан значок "Скачать расширение…".

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

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

Поэтому автору пришлось немного "почесать репу" и сделать…


Get CRX RU : Mini Plus : Toolbar Mod

Выпущена единственная версия этой линейки, всё отличие от Mini Plus – в пересадке значка из омнибокса на тулбар.

Соответственно, изменился и API – chome.pageAction был заменён на chrome.browserAction.

Попутно был выпилен API chrome.commands – с 72-й версии движка появились мелкие проблемки при его использовании, вплоть до нерабочести аддона в целом. Проблемки, конечно же, были оперативно решены, но "осадочек остался", да и необходимости в нём в тулбар-моде нет – для кнопки на тулбаре можно использовать штатный браузерный способ задания горячей клавиши вызова ("Быстрые клавиши").

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

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

Так появилась линейка…


Get CRX RU : Micro Plus : Context Menu Mod

..или просто Micro Plus, в которой нет никаких других API кроме контекстного меню и загрузчика.

Смотрим текущий манифест, осталось всего два API + уже применяемые разрешения:

"permissions": [ "activeTab", "contextMenus", "downloads", "clipboardRead", "<all_urls>" ]

В интерфейсе управления расширениями эти разрешения отображаются следующим образом:


Щёлкните по изображению, чтобы просмотреть скриншот на другом языке.

При этом в функционал Get CRX RU добавлена возможность полноценной загрузки аддонов и тем из репозиториев Opera Addons (OWS), Addons Mozilla.org (AMO), MS Edge (MEA), GreasyFork (GFK), OpenUserJS (OJS) и UserScripsMirror (USM) . Всё сделано по аналогии с ранее имеющимися функциями для CWS, подробное описание всех дополнительных функций линейки Micro Plus приведено в её описании, поэтому повторяться не стану, отмечу лишь, что в этой линейке также решён и ряд "застарелых болячек" аддона и добавлены некоторые полезные сервисные функции.

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

В итоге: из всех линеек наиболее удобной и гарантированно работающей, а также имеющей максимальный дополнительный функционал, является линейка Get CRX RU : Micro Plus : Context Menu Mod. Эта линейка рекомендуется к использованию на любых версиях браузеров.


Get CRX RU : CWS JS Mod

..или просто JS Mod, в котором нет никаких специфичных браузерных API, только чистый код JavaScript ES5.

Линейка является обычным пользовательским скриптом (User.JS) и может быть установлена в любой ES5‑совместимый браузер либо нативно (если поддерживается как в Chromium'ах) либо с помощью любого подходящего менеджера скриптов (GreaseMonkey, TamperMonkey, ViolentMonkey и другие подобные).

Подчеркну, что эта линейка ни в коей мере не является "конкурентом" основному аддону проекта Get CRX RU, но позиционируется в качестве альтернативы для пользователей любых не‑хромбраузеров.

Основное отличие линейки – кроссбраузерность и универсальность, скрипт может работать в Internet Explorer, Firefox, Opera и вообще в любых* браузерах, не имеющих "анальной огороженности" по отношению к репозиторию CWS.

* Принципиально скрипт может работать и в любом Chromium'е, если запустить его вручную на странице Chrome WebStore (например, в консоли). Однако, исходя из известной "огороженности", удобство применение скрипта при этом минимально и именно поэтому и оговаривается "для не‑хромбраузеров".

В целях обеспечения совместимости с максимально широким диапазоном версий браузеров в скрипте не применяются новшества, присутствующие в текущих стандартнах JS (ES6/7), все функции скрипта работоспособны в любом достаточно старом браузере с поддержкой стандартов ES5 (все версии 29+).

Применяемые в скрипте разрешения определяют доступ к страницам поддерживаемого репозитория (CWS):

// @include https://chrome.google.com/webstore/detail/*
// @match   https://chrome.google.com/webstore/*/*

Из всего функционала "Get CRX RU" оставлена только возможность упрощённой* загрузки аддонов и тем из репозитория Chrome WebStore и функции онлайн‑просмотра его исходного кода (Rob Wu CRX-viewer) и перехода в архив текущего аддона (если он есть). Всё сделано по аналогии с фичами для CWS, ранее опробованными в других линейках проекта, описание вызова и использования дополнительных функций скрипта приведено в общей документации.

* Только скачать напрямую и сохранить файл, понятное имя и файл описания не создаются.


Локализация интерфейса и перевод на другие языки

Язык интерфейса: до версии 2021.9.25 – только русский (локализация жёсткая, зашита в коде), другие* локализации отсутствовали. Это было связано со значительным упрощением кода, а также с тем, что при создании расширения автор в первую очередь ориентируется на русскоязычных пользователей. На текущий момент, начиная с указанной версии, в аддоне имеется и вторая локализация, английская.

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

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

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

Единственным исключением являются пункты переключения языка страниц в репозиториях CWS и MEA (расположены в подменю "Сервисные функции и интерфейс"):
• "Изменить язык страницы на [ EN ]" – принудительно переключает язык страницы с любого на английский;
• "Изменить язык страницы на [ RU ]" – вместо "RU" здесь может отображаться и другой язык, в зависимости от текущей локали браузера, и, соответственно, переход будет сделан на страницу, соответствующую языку этой локали.

Оба этих пункта НЕ будут отображаться в английских (en, en-US, en-GB) локалях браузера.
Это исключение добавлено исходя из отсутствия (в целом) необходимости переключения с английского на английский. :)

При работе с локализованными версиями расширения необходимо помнить важный момент:

После смены языковой локали в браузере следует обязательно сделать перезапуск для перестроения меню!

В противном случае локализация меню остаётся от предыдущего языка интерфейса браузера.

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

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

Если расширение у вас установлено в режиме разработчика, переустановка НЕ требуется, после смены локали и перезагрузки браузера достаточно выполнить обычный сброс аддона – выбрать в подменю "Сервисные функции и интерфейс" пункт "Перезагрузить и устранить ошибки" (в английской локали "Restart and reset any errors"):


Щёлкните по изображению, чтобы просмотреть скриншот на другом языке.

Во избежание вопросов из серии "у меня всё равно не получается", следует помнить, что:

1. В текущих версиях перезапуск с переопределением меню сделан максимально просто и этот "трюк" сработает только если расширение установлено в режиме разработчика (Developer Mode).
В дальнейшем планируется реализовать принудительную переустановку меню, работающую независимио от языковой локали.

2. Если же расширение установлено у вас "обычным способом" (из загруженного CRX‑файла), для перестроения меню при изменении текущей локали браузера потребуется переустановка аддона обновлением поверх установленной версии (любым способом, например, перетаскиванием CRX‑файла нужной версии на страницу chrome://extensions). Никакие настройки при этом не теряются, но меню будет автоматически перестроено по языку текущей локали браузера.

Этот вариант всегда сработает корректно, он применим ко всем версиям браузеров и является единственным возможным во всех браузерах версий CR48+.

3. В браузерах версий CR29-47 переустановка НЕ потребуется, если был включен режим принудительного* стартового перестроения меню – подменю "Сервисные функции и интерфейс", опция "Принудительное перестроение меню" (в английской локали "Force startup context menu build").

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

Поддержка перевода на другие языки

Для локализации интерфейса расширения используется стандартный API и перевод на любой язык может быть выполнен простой добавкой в комплект аддона дополнительного текстового файла в формате JSON.

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

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

Короче, велкам… :)


На этом общее описание "матчасти" отдельных линеек Get CRX RU завершено.

…но чтобы читатель был полностью "в курсе", следует добавить ещё и…


Дополнительные примечания по исходному коду

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

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

До версии 2021.9.25 все функции загрузчика и все сервисные функции и настройки "Get CRX RU" размещались в одном общем скрипте. Кроме этого файла, установщик аддона содержал только файлы манифеста и иконки.

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

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

В связи с указанным подходом, теперь в комплект аддона входят следующие файлы скриптов:

  • get_crx_file.js – основной скрипт с функциями загрузчика и запуска всех других модулей;

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

  • mod_cmenu.js – модуль установки контекстного меню и запуска ссылочных переходов;

    Запускается только при перестроении меню, при изменении настроечных опций или при вызове ссылок из меню.

  • mod_desctx.js – модуль запроса и формирования текстовых описаний загрузок;

    Запускается и работает только при включении настройки "Создавать описание для загрузки".

  • mod_extens.js – модуль проверки обновления и прямых ссылочных переходов.

    Наиболее редко используемый модуль, запускается из модуля mod_cmenu.js, в текущих версиях – только при выборе пунктов меню группы "Cкачать CRX : Ресурсы и ссылки".

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

Кроме того, на современных браузерах с движком CR‑81+ могут быть проблемы с получением дополнительных данных (но не самих CRX‑файлов!) со страниц репозитория Chrome WebStore. Это связано с общим ужестожением политики безопасности в этих браузерах и с применением в аддоне XHR‑запросов для доступа к таким данным. Во избежание сложностей, я настоятельно рекомендую вам ознакомиться с подробностями этой проблемы и методами её решения, которые приведены в отдельной статье (а также и в кратком FAQ'е).

Практических ограничений по версии браузера не имеется, используемые API работают в версиях 29+ (рекомендуемая версия для полнофункционального применения 31+).

Исходный код текущей версии расширения можно просмотреть в режиме онлайн на любом из ресурсов, приведённых в материале Get CRX RU : Micro Plus : LBSC*.

* См.также: Что такое "LBSC" и зачем это нужно.

Об использовании расширения в браузерах версий старше CR49

При использовании "Get CRX RU" в браузерах достаточно старых версий возможна некорректная работа отдельных функции загрузчика. Это не является ошибкой расширения и связано с ограничениями в некоторых браузерах полноценной поддержки API загрузки файлов.

Подобная ситуация возможна при работе с любым браузером версии старше CR31. В частности, она наблюдается в браузере SRWare Iron 29. Для смягчния этих проблем в аддон добавлены некоторые дополнительные "костыли", устраняющие бо́льшую часть подобных ошибок.

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

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

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

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


Как говорится, "начальник воровайки доклад закончил", или – как там в одном старом фильме – "вот и вся наука!" -)



Технические детали Бармалей
Бармалей 04.01.2014 Вчера 68 0.0

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

Поделиться

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