расширение для оперы «у всех работает»

кратко: установите расширение в оперу, откройте неработающий сайт, смотрите внизу страницы

подробно: недавно меня восхитила функция браузера Chrome, которая при недоступности сайта проверяет его доступность для других пользователей. Я нередко пользовался для такой проверки сайтом DownForEveryoneOrJustMe.com, но заходить на него приходилось вручную, и это было не очень удобно. А тут проверкой занимается сам браузер — это же круто! Думаю, уже через полгода такое будет во всех браузерах.

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

казалось бы, всё очень просто: допиливаем под себя пример конфига, пишем пару скриптов, зипуем, меняем расширение на oex и всё. Но нет. Во-первых, статьи на dev.opera.com не очень-то структурированы, с которой начинать, неясно. Во-вторых, с момента, когда были написаны многие из них, кое-что успело измениться, в том числе спецификация виджетов. В-третьих, куда же без глюков.

локализация — самое интересное для меня, потому что система хорошая, и мне давно было интересно попробовать, как всё само работает. Получилось не так радужно из-за остальных косяков, но когда я их исправил, всё и правда стало хорошо. У меня строки используются только в скриптах, поэтому я положил в locales/en/messages.js и locales/ru/messages.js по объекту со строками, подключил в index.html <script src="messages.js"></script>, быстро набросал nano-gettext с подстановками. Если бы в html было много строк, пришлось бы и сам index.html копировать в папки локалей и переводить целиком. А сейчас я понимаю, что нужно было оставить английский messages.js в корне, чтобы для неизвестных локалей включался именно он.

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

когда я ещё не знал, что messages.js будет автоматически выниматься из нужной папки, я собирался основывать локализацию на <content xml:lang="">, чтобы каждый из них ссылался на соответствующий index.html, а тот уже подключал бы правильный messages.js. Потом выяснилось, что это не работает, и не по спеке, но index.html сохранил радующий своей минималистичностью вид:

<!DOCTYPE html>
<title></title>
<script src="script.js"></script>
<script src="messages.js"></script>

отдельная забавная задача: как определить, что опера сейчас показывает ошибку подключения к сайту? Сейчас это работает не очень-то надёжно : ) Скрипт будет активизироваться на любом документе, содержащем только один стиль, адрес которого начинается на file:// и заканчивается на styles/error.css. К сожалению, мне не удалось найти никаких более надёжных переменных или значений. Парсить же текст страницы смысла не имеет, потому что он переведён на кучу языков и меняется в разных версиях. Надеюсь, мой способ будет работать достаточно хорошо : )

теперь мне нужно подождать несколько дней, пока расширение изучат и выложат на сайт. Если это случится, адрес, скорее всего, будет вот такой: «Up For Everyone». Там будет работать автообновление, поэтому лучше использовать этот источник.

Артемий Трегубенко,
,

comments powered by Disqus