Как многие из вас помнят какое–то время назад Гугл во второй раз спрятал ссылку на Ридер, заменив ее ссылкой на Фотографии. В первый раз это вызвало волну недовольства пользователей и Гугл вернул все назад, сославшись на ошибку. Тогда, сразу же, появилось расширение для Хрома, возвращающее ссылку на Ридер. Я портировал это расширение для Оперы.
Когда второй раз Гугл перенес ссылку, волна возмущения уже была не такой сильной. Сначала мне даже показалось, что никто не обратил внимания. Сообщество было занято более важными новостями. Но появилось обсуждение на форуме поддержки Гугла и даже официальный ответ о том, что Гугл всегда стремится улучшить свои продукты и такое улучшение может приводить к действиям подобным случившемуся с ссылкой на Ридер. Я вспомнил про свое расширение, расчехлил запылившийся код и решил сделать расширение более приятным и более осмысленным. А именно — дать пользователю возможность задавать структуру ссылок самому. Расширение должно динамически выдергивать все ссылки со страницы, показывать их пользователю в виде двух колонок и позволить перетаскивать их мышкой. Оказалось, что для Хрома такого расширения тоже не было и дополнительно я задался идеей написать два расширения с общим кодом.
Архитектура расширений
Архитектура расширений похожа в обоих браузерах. Условно можно разделить внутреннюю часть расширения на то, что работает в контексте просматриваемой страницы, и то, что работает в контексте браузера. Почему важно разделять эти понятия? Потому, что для скриптов, внедряемых на страницу, действует более жесткая политика безопасности. Например, мне не удалось подключить сторонний скрипт. В качестве такого стороннего скрипта у меня выступает библиотека jQuery. При этом скрипт, который работает в контексте браузера, без проблем подключает все, что угодно. Для большей конкретики назовем скрипты своими именами: фоновый процесс работает в контексте браузера, встроенный – в контексте страницы.
Взаимодействие между фоновым и встроенным скриптами происходит через сообщения. Нужно повесить обработчики сообщений и там, и там и вперед. Подробности реализации уже освещались на Хабре.
Код
Если говорить про код, то можно выделить несколько интересных моментов:
- Трудности отладки. Иногда расширение просто переставало работать, в логе не было ничего. Потом выяснялось, что где–то была синтаксическая ошибка и все тихо умирало. Это случилось у меня 1 или 2 раза. Искуственно воспроизвести такую ошибку мне не удалось, и в логах я всегда получал указание на место синтаксической ошибки.
- Можно делать все согласно документации, а потом окажется, что сообщения не отправляются. Если основной функционал расширения завязан на сообщения, то оно перестает работать. В логе, понятное дело, никакой информации не отображается. Это привело к тому, что в какой-то момент я начал обильно покрывать свой код отладочными сообщениями, чтобы можно было проследить куда управление скрипта все-таки попадает, а куда нет.
- На мой взгляд интернационализация сделана в Хроме лучше, чем в Опере. Опера следует рекомендациям W3C по поводу виджитов и предлагает для каждого поддерживаемого языка создавать отдельную папку с полной копией расширения, переведенного на нужный язык. Я здесь вижу проблему в том, что когда понадобится чуть–чуть подправить верстку в одном из файлов, то это придется делать во всех копиях этого файла. Хром хранит только текстовые сообщения в разных папках и позволяет обращаться к ним по идентификатору.
- В файле с метаданными расширения (
config.xml
для Оперы иmanifest.json
для Хрома) можно разрешить доступ к другим сайтам. В Опере надо быть внимательным со слэшами. Вместо, например,<access origin="https://mc.yandex.ru/" subdomains="true" />
нужно писать<access origin="https://mc.yandex.ru" subdomains="true" />
В первом варианте расширение не получает доступа к указанной странице. - В Хроме для встраиваемого скрипта можно задать страницы, на которых он должен выполняться, прямо из манифеста. При этом поддерживаются символы обобщения. Например, чтобы скрипт работал на всех страницах домена
google.com
, можно написать
. Но нельзя написать*://*.google.com/*
, чтобы скрипт работал на любом домене со словом*://*.google.*/* google
. Мое расширение как раз должно работать на любом гугловском домене, поэтому оно содержит 182 доменных записи.
Техническая документация и сопутствующие материалы
По уровню помощи разработчику Опера и Гугл разнятся несильно. Обе компании предоставляют подробную документацию, видео, примеры. Субъективно, мне читать документацию Гугла тяжелее. Они очень любят гипер–ссылки и чтение превращается в чехарду: прочел абзац, перешел по ссылке, прочел абзац, перешел либо по новой ссылке, либо назад. Отдельный квест от Гугла: попробуйте зайти на страницу документации и найти рекомендации для публикации расширения. Гугл все больше ориентируется на приложения, а не расширения. Справочная информация для о процессе к публикации находится на страницах разработки приложений.
В Опере сделали отличную штуку — шаблоны для создания иконок. Шаблоны можно использовать в Фотошопе или Инкскейпе. Я далек от дизайна и мне понадобилось какое–то время на освоение этого шаблона, но потом я оценил его по достоинству. С ним действительно проще создавать иконки нужного размера.
Chrome Web Store и Opera Extensions
Opera | ||
---|---|---|
Локализация и описание расширения | Предлагает разработчику заполнить описание на всех языках локализации, показывая поля для ввода один за другим | Показывает только одно поле для ввода. Переключение на другой язык происходит с помощью комбо–бокса. Я не сразу нашел этот комбо-бокс и думал, что почему–то могу ввести описание только на языке, выбранном по умолчанию |
Скриншоты | Есть только одно требование к размерам — скриншоты должны быть меньше 800x600 пикселей | Предлагают сделать скриншоты фиксированного размера 1280x800 пикселей. Дополнительно предлагают сделать несколько рекламных изображений. Расширениям без рекламных изображений уделяется меньше внимания в поисковой выдаче |
Заметность расширения | Есть раздел — новые поступления. Через него люди хоть как–то могут узнать о новинках или обновлениях. Думаю, что мое расширение заметили именно благодаря этому разделу | Нет никакой информации о новых расширениях. Опубликованное расширение сразу же попадает в общий котел и через официальный каталог его очень сложно найти |
Гугл постепенно приучает нас к ненужности URL. Наверняка есть люди, которые заходят на фейсбук, набивая facebook в поиске и следуя по ссылке. Зачем нам адрес, который нужно запомнить, если есть Гугл, который помнит все за нас?! В результате у расширений в каталоге Хрома прекрасные идентификаторы вида
jlmhhcdodlafcgaopokedcaejpbiagkk
. Попробуйте, читая текст и встретив две ссылки chrome.google.com/webstore/detail/jlmhhcdodlafcgaopokedcaejpbiagkk
и chrome.google.com/webstore/detail/iiamfmleocemmjdnbfifnmdgekeokakh
, понять какая ссылка относится к какому расширению. Опера создает ссылку на основе имени расширения.О людях
Люди не читают уже написанные комментарии перед отправкой своего. Собственно, это не новость для любого блогера, но тем не менее. Взять тот же тред на форуме Гугла. Он на 99% процентов состоит из сообщений «верните назад ссылку на Ридер». В этом треде я оставил ссылку на свое расширение. Кажется, ее никто не заметил. Все так и продолжили гневно писать о возвращении ссылки. Кто-то даже выпустил еще одно такое расширение (просто меняющее ссылки местами) и тоже написал об этом в треде. Небольшим открытием было то, как одному человеку очень понравилось мое расширение, и он пошел и написал об этом все на том же форуме гугла и дал ссылку. Его сообщение, в отличии от моего, не осталось без внимания.
В Опере несколько раз люди писали, что ставят оценку 3 или 4 из-за того и из-за этого, а мышкой промахивались и реально ставили 2. Это, во–первых, вопрос о юзабилити. Возможно, такой рейтинг как на Хабре (плюс и минус) был бы понятнее. Во–вторых, вы не получаете рейтинг, который сделал бы ваше расширение заметнее для пользователей. В–третьих, если вы склонны сильно переживать из–за рейтинга, то переживаний у вас прибавится.
Статистика
Меня очень удивил подход к статистике у поискового гиганта. Разработчику доступна цифра под названием «количество пользователей в неделю». Мне эта цифра мало о чем говорит. Прикрученная статистика Гугл-аналитики помогла понять, что моим расширением в Хроме все-таки пользуются. Опера же показывает легко понятную цифру — количество скачиваний. С этой цифрой мне не понадобится дополнительная статистика, чтобы понять востребованность расширения. Но в обоих браузерах я ничего не знаю о тех, кто возможно установил себе расширение, а потом удалил его. Так что, в целом, хотелось бы более информативной штатной статистики от обоих браузеров.
Я прикрутил две кнопки для пожертвований: от пейпала и яндекс.денег. К моменту публикации второй версии я получил ровно ноль пожертвований. Не могу сказать, что я сильно удивился. как известно, пожертвования могут собрать очень немногие проекты. Вторую версию расширения я хотел сделать условно платной: полный функционал появлялся бы через 10 дней после установки. Если кто-то хотел раньше, то нужно было бы заплатить какую-нибудь символическую сумму. Меня остановило несколько вещей (юридического лица у меня нет). Первое, это отсутствие адекватных платежных систем для нерезидентов США. Нашелся только Пэйпал, в котором у меня счет в евро. По статистике я видел, что основная масса пользователей Хром-версии расширения из Штатов. Я не был уверен, что они были бы готовы платить 1 евро за расширение и еще полтора за сопутствующие расходы. Кроме того, надо было организовать прием платежей и надежное(доступное) хранение/получение информации о них, а это значит, что нужна серверная часть расширения.
Второе, это этические соображения. Я не имею никакого отношения к Гуглу, так почему я должен паразитировать на нем, даже потратив свое собственное время?! Я получил опыт, а деньги лучше заработать на чем-нибудь, что будет полностью моим.
Обновление версий
Хром поддерживает автообновление версий, но если вы в новой версии изменили список необходимых разрешений, то автообновление отключается. Пользователю придется самому узнать, что вышла новая версия и самому нажать кнопку «Обновить все установленные расширения». В Опере ситуация похожа. После изменения прав на доступ в манифесте, сообщения о новой версии не пришли.
Итоги
- Писать кросс-браузерные расширения очень даже возможно и на деле не так уж и сложно.
- Предполагается, что расширения являются бесплатными. Если вы, вдруг, захотите получить прибыль, то разработчики браузеров вам в этом не помогут. Для получения прибыли стоит смотреть в сторону приложений в Chrome Web Store.
- Для Хрома нужно подумать о рекламе где-то на стороне. Иначе никто не узнает про ваше замечательное расширение.
Ссылки: версия для Оперы, для Хрома, исходный код.
UPD: Wimsey уточняет, что в Опере автообновления есть. Текст подкорректирован.