Copy URL CR.RU : Что "под капотом"
Опубликовано: Бармалей · 04.11.2014 · 00:02 ••• Обновление: 15.05.2021 · 04:15 0

Отличия от аналогов и некоторые технические подробности.
Применяемые технологии и API. Особенности использования.


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

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

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


Отличия от оригинала и аналогов

По большому счёту, Copy URL CR.RU не является "единственным и уникальным" копировщиком ссылок, но для "осознанного и правильного выбора" следует знать (и понимать) различия между этим аддоном и его "коллегами".

По отношению к исходному аддону и его аналогам в этом форке имеются следующие основные отличия:

  • Форк оптимизирован для работы на любых версиях хром-браузеров, код проверен на версиях 29-78.
  • Аддон работает на любых страницах, в том числе – на локальных, служебных и в гуглозине…)
  • Полностью удалена гугло-аналитика и "статистические" функции, работавшие на всех страницах.
  • Выше скорость работы за счёт оптимизации кода и изменения логики вызова и запуска скрипта.
  • Аддон НЕ использует* инжект скриптов в просматриваемые страницы (меньше "накладные" расходы).
    * Кроме функций, связанных с цитированием, для копирования только ссылок инжекция не требуется.
  • В отличие от оригинала форк не имеет фонового процесса и выгружается* из памяти при неактивности.
    * В текущих версиях – быстрая выгрузка через 1-1,5 секунды после завершения копирования.
  • Расширенное определение URL элементов страницы и дополнительные* функции копирования.
    * В частности – короткие URL, создание форумных ссылок и цитат из выделенного текста и др.
  • Вывод сообщений* при возможных ошибках копирования (полезно для понимания причин проблемы).
    * Для удобства анализирования эти сообщения также сохраняются в консольном логе.
  • Удалены все лишние файлы, необходимые скрипты объединены в один, размер уменьшен вдвое.
Технические отличия от аналогов

Кроме вышеуказанных, есть также и другие, чисто технические отличия, которые также следует учитывать.

Для начала сто́ит упомянуть, что кроме Copy URL CR.RU существует ещё один альтернативный вариант исходного расширения – Game Edition: Репак CopyUrl_RpR, сделанный в июле 2016 года на основе оригинальной версии 1.7 и отличающийся от оригинала выгрузкой из памяти и "жёсткой" русификацией на уровне исходного кода (смотрим архивную копию этого форка в файловом архиве проекта).

В связи с этим иногда могут возникать вопросы "а чем твоё круче и почему", на которые есть аргументированный ответ, раскрывающий основные преимущества Copy URL CR.RU с технической точки зрения:

Цитата:
Есть ли существенная разница между твоей версией и репаком, размещённым на game-edition несколько лет назад?

если честно - не смотрел, что "там" выкладывалось.. я лепил изначально с оригинала..
потому как первый репак я сделал за пару лет ДО оного репака - в посте история релизов есть..)
потом функционал не менялся, а тут случайно попался на глаза оригинал 1.8.5 с контекстным меню, пришлось допилить..

..но раз уж всплыл вопрос - качнул/посмотрел форка с гейм-едишн.. нескромно, может, но скажу - мой лучше! :))
потому как "там" не менялся общий подход оригинала и реализация самого механизма копирования не самая лучшая..

итак, судя по коду из CopyUrl_RpR_16.07.2016.rar:

1) как и в оригинале - на все страницы лепится инжект из двух скриптов, у моего - инжект отсутствует в принципе!

2) следствие из п.1 - мой работает везде - и в гуглозине тоже, а оригинал/репак с ГЕ по определению этого не могут сделать..)

3) связь кнопки/меню с инжектом - через апи сообщений, шо в данном случае не нужно - всё нужное получается и так..)

4) авторы оригинала/репака вынуждены ставить лишние разрешения в манифесте, у меня сделано проще..

5) в оригинале/репаке с ГЕ один и тот же скрипт грузится дважды - в фоне и в инжекте - неоптимально, мягко говоря..

6) я делал свой первый репак на базе исходной версии 1.3 и вставил иконки прямо в скрипт, а в ГЕ-форке это "слизано".. х)
    в той версии, кстати, у автора оригинала ещё всё было красиво - и скрипт был один и никаких инжектов не было..

7) функция отрисовки иконки омнибокса в оригинале/форке с ГЕ сделана хуже - потому как постоянно "дёргает" фоновый скрипт..
    в смысле - "там" скрипт вызывается при каждом изменении вкладок, а у меня отрисовка НЕ связана с вызовом бэкграунда..

8) с т.з. "выгрузки из памяти" - в оригинале её нет, а в форке с ГЕ она не имеет смысла, потому как см.п.7.. =)

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

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

11) в форке с ГЕ не весь мусор за автором оригинала подчищен, причём - он был закоменчен самим автором в оригинале..

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

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

Короче говоря, в Copy URL CR.RU всё сделано "как надо", всё компактно и удобно для пользователя.)

Но если всего этого мало – смотрим также на…


Дополнительные возможности, отсутствующие в оригинале и аналогах

При разработке Copy URL CR.RU изначально ставилась задача расширения полезного функционала по отношению к исходному аддону.

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

С версии 2018.5.17 кроме простого копирования URL объектов с текущей страницы доступно:

  • создание файла ярлыка на текущую страницу (файл *.URL), по умолчанию сохраняется в папке загрузок;
    Исходный код этой функции заимствован из авторского расширения .URL+ RU.
  • копирование URL и заголовка вкладки в виде форумной ссылки: [url=адрес]заголовок[/url];
  • копирование URL вкладки и выделенного на ней текста в виде форумной цитаты: [url=адрес][q]текст[/q][/url];
  • копирование URL по выбору – например, если объект под курсором является картинкой под ссылкой во фрейме;
  • копирование URL аудио/видео объектов по курсором, работает в том числе и во фреймах YouTube-плейера.

С версии 2018.5.20 для объектов текущей страницы также доступно:

  • создание "подсвеченной цитаты" из выделенного текста – на базе сервиса TLDRify (пример перехода к цитате);
  • копирование сокращённых ссылок сервиса TinyURL для текущей страницы или любой ссылки под курсором;
  • копирование сокращённых форумных ссылок на страницу и для форумных цитат из выделенного текста (TinyURL).

Важные примечания по этим функциям:

  1. Все операции с сокращёнными ссылками выполняются автоматически, результат помещается в буфер обмена.
  2. Функция "подсветки цитат" ограничена только вызовом инжект-скрипта сервиса, копирование результата – вручную.
  3. Не забываем, что на локальных и служебных страницах обе эти функции не работают!
    …хотя можно попытаться их вызвать и почитать сообщение об отказе…))
  4. Выбор внешних сервисов обусловлен удобным доступом к их API и отсутствием у них обязательной регистрации.
  5. Следует понимать, что любые ссылки, созданые в подобных сервисах, перестанут работать при их закрытии!
  6. При использовании функции подсвеченной цитаты сервиса TLDRify возможна несовместность с подписками в вашем блокировщике рекламы, связанная с применением в нём фильтров социального комментирования.

    В частности, включение подписки Fanboy's блокирует выполнение штатного букмарклета сервиса цитирование. Для решения этой проблемы следует добавить в пользовательские фильтры блокировщика разрешающие правила (пример для uBlock):

    @@||tldrify.com/static/*/sharebox.$script,stylesheet,domain=tldrify.com
    @@||tldrify.com/sharebox?$generichide

С версии 2019.1.19 для изображений текущей страницы доступно:

  • копирование картинки под курсором в формате base64 (сохранение в PNG, преобразование canvas/png).

С версии 2019.1.25 для изображений текущей страницы дополнительно доступно:

  • копирование картинки под курсором в base64 в формате оригинала (без промежуточного преобразования).

С версии 2020.10.15 для объектов текущей страницы дополнительно доступно:

  • выбор альтернативного сервиса коротких ссылок clck.ru (в дополнение к TinyURL, переключатель в меню);
  • копирование коротких ссылок выбранного сервиса для всех объектов (изображения, фреймы, медиа-объекты);
  • копирование ссылки на страницу в виде стандартного html-кода <a href="ссылка">заголовок страницы</a>;
  • опциональное "выпрямление" и очистка копируемых ссылок от гугло-аналитики и различного utm-мусора.

С версии 2020.11.25 для объектов текущей страницы дополнительно доступно:

  • вложенное контекстное меню настроек;
  • опциональный атрибут target="_blank" для ссылок на страницу в виде стандартного html-кода.

Технические детали разработки

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

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

Copy URL CR.RU не использует для работы никакие сторонние библиотеки (привет любителям JQuery)).

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

Скрипт работает в "строгом" режиме – для гарантированного выполнения функций и облегчения отлова ошибок.

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

* С версии 2018.5.16 – быстрая выгрузка через 1-1,5 секунды после завершения копирования.
…теоретически – можно выгружать и немедленно, но нам же ещё иконку надо "покрасить"…))

Для вызова функции копирования URL текущей вкладки применяется стандартный API chrome.pageAction. Для ускоренной и гарантированной отрисовки кнопки на всех вкладках используется API chrome.declarativeContent.

Для вызова дополнительных функций из меню кнопки в омнибоксе и для работы с контекстом страницы применяется стандартный API chrome.contextMenus.

Для работы с веб-страницами в активных вкладках задействуется API chrome.tabs. Также применяется разрешение activeTab, упрощающее отдельные действия на текущих страницах.

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

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

Для помещения в буфер обмена результатов работы в манифесте запрашивается разрешение [ "clipboardWrite" ].

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

Контекстное меню омнибокса и страницы

В версиях браузеров 49+ часть функций контекстного меню дублируется в меню иконки в омнибоксе:

В версиях браузеров 63+ эти же функции контекстного меню отображаются в меню кнопки на тулбаре:

С версии 2018.5.17 там же есть опция отключения контекстного меню страницы (в омнибоксе меню есть всегда). При выключении контекстного меню страницы будут недоступны все функции, связанные с копирование её контекста.

В более старых версиях браузера дублирования меню в омнибоксе нет, контекстное меню страницы неотключаемое.

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

Индикация состояния и сообщения об ошибках

Во всех версиях состояние аддона индицируется изменение цвета значка в омнибоксе:

Такой значок означает успешное завершение любой из операций копирования/преобразования URL. Значок меняется на дефольтный через 1 секунду, никаких сообщений об успешном выполнении действий не выдаётся.

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

Начиная с версии 2018.5.20 при ошибках также выводится сообщение и событие заносится в консольный лог.

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

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

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

При разработке расширения часть API обновлена под современные стандарты, на версиях браузера старше 29/31, возможно, не будет* работать совсем.

* Если кому-то это нужно – проверяйте самостоятельно и пишите "фидбэк про иссуй", будем думать.)

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

* Впрочем, если "дело пойдёт", прикрутить ещё и "басурманский" не является особой проблемой…)



Технические детали Бармалей
Бармалей 04.11.2014 15.05.2021 380 0.0

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

Поделиться

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