Разработка кроссбраузерного юзерскрипта HabrAjax подошла к той стадии, что для установки его в Опере требуется отдельная обширная инструкция, шире обычной. Причина — в том, что используется работа с другим доменами, один из которых — на протоколе HTTPS (plusone.google.com — кнопки Google Plus), и проверяются обновления скрипта на другом домене — userscripts.org. Всё это требует дополнительных настроек, которые в своё время были описаны прямо в юзерскрипте (ссылка в настройках "примеч.для Оперы"), но сделаны довольно кратко и с одной иллюстацией. Здесь посмотрим на вопрос шире, чтобы пользователи Оперы и разработчики юзерскриптов для неё имели инструкции под рукой и полностью понимали широту вопроса. Заодно, описаны места установки юзерстилей. Для тех, кто всё это знает, полезно будет посмотреть абзац выводов с 2 замечаниями в самом низу.
Первая особенность работы юзерскриптов в Опере — в том, что для них не работают специальные события BeforeScript, которые отлично работают для обычных скриптов и обеспечивают кроссбраузерность. Поэтому, если мы хотим работать с другим доменом в фрейме, юзерскрипту надо обеспечить доступ к другому домену, а значит, прописать в настройках скриптов для сайтов и основной сайт, и сайт, находящийся в фрейме — строго с соответствии с тем, что прописано в мета-директивах скрипта для остальных браузеров.
Вторая особенность — если сайты работают по протоколу https:, для них нужно поставить разрешение работы юзерскриптов в этом протоколе — общая настройка Оперы, которая затем часто будет напоминать о себе невпопад. Если не хочется этого делать, есть выход в оформлении юзерскрипта как аддона. Теперь — подробнее.
Как запустить в Опере простой односайтовый юзерскрипт?
Юзерскрипты в Опере умеют запускать очень много пользователей. Достаточно посмотреть на статистику использования юзерскрипта HabrAjax в браузерах, которые согласились дать 26 человек, то видно, что 8 человек устанавливали скрипт на Оперу (не исключая других браузеров). Кстати, если вы пользовались HabrAjax, прошу пройти голосование в этом опросе: "В каком браузере вы используете HabrAjax?". Он поможет набрать больше статистики.
Для справки, для тех, кто ещё не устанавливал в Опере юзерскрипты, приведена инструкция ниже. Она не самая простая, но весь фокус данной статьи в том, что для защищённых страниц с юзерскриптами она ещё сложнее. Не все также знают, что способов установки скриптов в Опере не один, а два (не считая аддонов); в инструкциях — проиллюстрированы оба. В мобильной Опере (Mobile) также имеются все возможности работы с юзерскриптами и юзерстилями, но настройки разрешения функций могут быть отключены в opera:config и понадобится приверять и их, если что-то не работает (выходит за рамки статьи).
1. Установить юзерскрипт (без механизма аддонов, введённых в 11-й версии) можно в Опере в 2 режимах: для всех сайтов сразу, с задействованием мета-директив скриптов, или для некоторого сайта на одном домене (и таких сайтов может быть много). Юзерскрипты, принятые как фактический стандарт в 2 основных браузерах (Firefox и Chrome), имеют мета-директивы — несколько закомментированных строк, обычно расположенных в начале файла юзерскрипта. В них записываются адреса URL, в которых действуют скрипты, поэтому установка правил работы определяется директивами и требует единственного клика по кнопке «Разрешить установку» в этих браузерах. В Опере изначально было не так, но было лучше, чем на заре введения юзерскриптов, когда в Safari скрипты запускались для всех сайтов сразу, и только действия самого скрипта могли выбрать группу URL, в каких он продолжал работать. Поэтому первый режим (для всех сайтов) — это повторение примитивного способа запуска скриптов, но с улучшениями в плане понимания директив.
Второй способ — прописать настройки для сайтов — уходит в сторону от современного способа настройки юзерскриптов через директивы. Но они оставлены в Опере из-за того, что сайтам можно вручную задавать множество ограничений и особеннстей, в том числе индивидуальные стили и скрипты. Эти 2 способа несколько конфликтуют друг с другом: применение второго блокирует работу первого способа (не запускаются скрипты из общей папки, даже имеющие нужные директивы) для выбранного сайта. Это нужно понимать при прописывании индивидуальных настроек, так как неочевидно. Покажем эту общую информацию с иллюстрациями.
1.а) Открыть браузер и его Общие Настройки (Ctrl-F12 или из меню, как на рисунке).
Здесь и далее будем показывать Оперу 11.61 в ОС WinXP с темой оформления (Shift-F12) Netbook Skin v.11.3 — для компактности:
1.б) Открываем вкладку "Инструменты — Общие настройки — Расширенные — Содержимое — Настроить Javascript" — попадаем в настройки 1-го режима юзерскриптов. Если разместить скрипт в Папке пользовательских файлов, указанной в настройках, он будет выполняться в каждом окне браузера. Если написать директивы @include, как обычно для скриптов, с указанием сайтов, он будет фильтроваться директивами в иных сайтах. Совсем без директив оставляют скрипты редко. Не всегда скрипт, написанный для конкретного сайта, может корректно работать везде (ничего не делать на всех чужих сайтах), да и ресурсы на начальный запуск скрипта в каждом окне будут тратиться.
Особенности юзерскриптов: если в папке общих скриптов есть скрипт с директивами @include и при этом же есть более точные настройки для сайтов для этого же сайта (Кнопка «Настройки для сайтов...») — он не выполняется. Скрипт не обязан иметь расширение *.user.js, достаточно *.js. Скрипты выполняются в алфавитном порядке их названий файлов, без учёта регистра (в Win по крайней мере).
1.в) Аналогично скриптам, имеются настройки общих стилей: для всех сайтов, для каждого окна в "Инструменты — Общие настройки — Расширенные — Содержимое — Настроить стили...".
Они тоже могут иметь побочные эффекты на не свои сайты, если стиль для конкретного сайта положим в папку для всех сайтов (надпись на скриншоте — "Моя таблица стилей"). Подобная примитивная возможность есть в IE7-9 и Safari. Поэтому для сайтов в Опере сделаны индивидуальные сайтовые настройки для скриптов и стилей.
Индивидуальные настройки скриптов и стилей, имеющиеся только у Оперы среди основных браузеров — это тоже устаревшее и несовременное явление на фоне аддонов, которые Опера поддерживает (с 11-й версии), потому что работы для пользователя по настройкам браузера намного больше, чем при установке аддона.
1.г) Открываем "Инструменты — Общие настройки — Расширенные — Содержимое — Настройки для сайтов...", чтобы установить скрипты и стили для некоторых сайтов. Так как все другие настройки установлены в обычное положение, требуется обратить внимание на 3 места: название домена, путь к стилям для сайта, путь к скриптам для сайта (к папке скриптов).
Итого, получается, что если для сайта есть хотя бы одна особенность кроме скриптов, например, пользовательские стили, то и скрипты вынуждены писать не в общей папке скриптов с действием директив, а в «Настройках для сайтов». Тогда, если в директивах упомянуто более одного сайта, необходимо и для них прописать настройки для сайтов. Если же скрипт лежит в общей папке скриптов, можно положиться на директивы юзерскрипта — они будут работать.
Закончено общее описание 2 вариантов установки юзерскриптов в Опере и их особенностей. Но есть ещё одна особенность, после которй будет понятно, что трудности интерфейсов браузера только начинаются.
Работа юзерскриптов на страницах с защищённым протоколом HTTPS
2. Что делать, если среди сайтов есть URL с защищённым протоколом https? Такие сайты Опера просто так не пропускает для работы с юзерскриптами. Они по умолчанию в ней не работают. Разрешить работу юзерскриптов на таких сайтах можно установкой браузера:
"opera:config#on%20https" (написать это в адресной строке; покажет нужную настройку в разделе «User Prefs»)
— User JavaScript on HTTPS — Checked (выбрать чекбокс)
— "Сохранить" (нажать кнопку внизу в этом разделе)
— перезапустить браузер Оперу.
Эта установка доставит немало неприятных минут в дальнейшем. На каждом сайте с HTTPS она будет задавать один и тот же вопрос (при первом заходе на сайт после открывания браузера или после смены скрипта): ". И совершенно неважно, что скрипт пользователя не собирается заглядывать в этот домен. Открываете, скажем, GMail — вопрос будет (первый раз). После перезапуска Оперы — снова.
Неустановки навязчивого параметра нельзя избежать и при запуске скрипта из общей папки — и там требуется это разрешение в настройках.
Несовершенство параноидального и нелогичного вопроса вряд ли будет исправлено в ближайшем будущем — у компании много более серьёзных багов, висящих годами. Логично было бы иметь более гибкие настройки (UserJS on https в «Настройках для сайтов») и спрашивать разрешение только тогда, когда в браузере ПРИСУТСТВУЕТ юзерскрипт для работы в данном сайте. Поэтому, для достижения совершенства, придётся отказаться от такого способа разрешения https и попробовать создать аддон по скрипту.
(Чтобы Опере было не одиноко чувствовать себя среди багов юзерскриптов, в следующей статье разберём баг Хрома (2.5 года от момента его оформления) с доступом к соседнему фрейму и его решение.)
Создание аддона Оперы и проблематика аддонов вообще
Переход от юзерскрипта к аддону — это другое количество «суеты» разработчика вокруг кодов и их вариантов для браузеров. Кроссбраузерный юзерскрипт — это удобный способ проектирования и публикации. Разработчику не требуется специальная среда компиляции вариантов под браузеры. Поэтому разработчик меньше зависим от рабочего места. Точнее, независим. Достаточно текстового редактора, чтобы исправить или дописать юзерскрипт.
Пользователю — тоже удобно работать с одним файлом. По крайней мере, в Firefox и Chrome требуется 2 клика на скачивание и подтверждение установки. В Safari — тоже, хотя NinjaKit кое-в-чём не поддерживает функции GreaseMonkey — среды поддержки юзерскриптов в Firefox, существующей как стандарт де-факто. В Опере, если не делать настройки для сайтов — тоже суеты немного — скопировать файл в общую папку скриптов.
Но, начиная с «кастомизации» (в плохом смысле) по браузерам, становится хуже всем. Пользователю надо знать, что для разных браузеров есть разные места
Разработчику — ещё хуже, оттого, что логика кастомизации выходит за пределы одного языка (JS) и растекается на скрипт сборки или на набор собственных правил ручной сборки и публикации в разных местах. Поэтому, по возможности, нужно стремиться к минимальной смешанности технологий в кастомизации по браузерам. Но раз уж в Опере нельзя обойтись приличной работой скриптов с HTTPS, придётся заглянуть в проблемы построения аддонов.
Есть ещё шальная мысль — создавать кроссбраузерные аддоны, работающие везде с одним кодом, различающиеся буквами расширений. Это очень подойдёт также Safari, для которого нет полноценной поддержки юзерскриптов (проблемы, например, в реализации кроссдоменного обмена). Правда, для IE7-9 понадобится тоже уникальное решение, идущее назад к юзерскрипту, потому что формат юзерскриптов для аддонов IE — это классический юзерскрипт с большим количеством ограничений и, конечно, различием в логике JS.
Вот какова цена решения перехода к аддону вместо юзерскрипта. Если обе стороны — разработчики и группа пользователей — согласна к переходу на аддон, чтобы избежать проблем с HTTPS, переходим к инструкциям по созданию аддона в Опере.
Как положительный фактор, получаем в аддонах более гибкие и новые возможности, которые частично недоступны в юзерскриптах. Например, момент запуска скриптов определяется гибче, стили устанавливаются до создания документа, поэтому картинка сайта не «прыгает» в первую секунду после загрузки.
На этом позволим себе прервать дозволенные речи, а создание аддона разобрать в следующий раз, чтобы завершить тему особенностей создания юзерскриптов для Оперы.
Практические выводы
Установка в Опере такого многофункционального скрипта как HabrAjax, дополненного юзерстилями (ZenComment), содержащего работу с несколькими сайтами и с защищёнными страницами (https), наталкивается на 2 особенности установки. В зависимости от типа установки (в общий каталог или в специальный для сайта), если ставятся индивидуальные настройки сайтов, надо не забыть прописать настройки того же скрипта для всех сайтов, упомянутых в директивах @include. Или положить скрипт в общий каталог, но указать его в индивидуальных настройках. Иначе возникнет недоумение — почему же не работают вспомогательные функции? Баг? Нет, это будет не баг, а недостаточные настройки. И если скрипт работает с защищёнными страницами (а ему приходится работать с ними, если есть кроссдоменный обмен), приходится включать разрешение HTTPS для юзерскриптов, что в дальнейшем мешает «спокойно жить» на Опере. Спасение — в аддонах, но об этом — в следующий раз.
(Статья — из общего пула статей, порождённых работой с юзерскриптами для Хабра.)
Автор: spmbt