понедельник, 17 февраля 2014 г.

Обзор возможностей

Основы

Расширение, это файловый архив, содержащий HTML, CSS, JavaScript, картинки и все что угодно. Подключаясь к браузеру, он дополняет его функциональные возможности. Для расширения доступны все API, которые браузер предоставляет обычным веб-страницам и немножко сверх того. Существуют два основных способа взаимодействия расширения со страницами и серверами: это контент-скрипты и межсайтовый скриптинг. Кроме того, расширение может взаимодействовать с вкладками, букмарками, и т.д. Но все это с различными оговорками.

Так, контент-скрипты могут взаимодействовать с элементами страницы через DOM, но не могут непосредственно обращаться к некоторым API и использовать переменные и функции определенные на странице или в других контент-скриптах.

Тут уместно сделать небольшое лирическое отступление: безопасность в интернете, если вникать в детали, это такой мозголомный предмет… и вечная головная боль разработчиков. Подходы меняются от “запретить и не пущать” и “лучше перебдеть, чем недобдеть” до “если нельзя, но очень хочется, то можно”. Любое решение – всегда компромис, и в конечном итоге все оказывается в руце божией и на совести разработчика. А иначе рамки оказываются настолько жесткими, что в результате ничего полезного сделать вообще нельзя. К расширениям это все относится в полной мере. Кто поручится, что выполняя какие-то  нужные функции, загруженное расширение не делает что-то еще? Поэтому ограничениям здесь несть числа.

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

Пользовательский интерфейс расширения

Большая часть расширений добавляют кнопку на панель браузера, либо в адресную строку. Называется это соответственно browser action и page action. Первый вариант рекомендуется для расширений, которые актуальны для всех страниц, второй – когда расширение более специализированное и используется только в некоторых случаях, и соответственно умеет отличить когда оно требуется, а когда нет. В остальном оба варианта равноценны.

Доступ к файлам расширения

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

Также к файлам расширения можно адресоваться как chrome-extension://<extensionID>/<pathToFile>. ЕxtensionID можно узнать на странице расширений. Правда смысл этого от меня ускользает.

Архитектура расширения

Фоновые страницы

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

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

Интерфейсные страницы

Это обычные страницы для взаимодействия с пользователем. Например всплывающее окно, которое мы рассматривали в прошлый раз. Или страница настроек расширения. Или override pages (кто бы мне сказал как это назвать по-русcки? и надо ли?) – расширение может подменить стандартные страницы менеджера закладок, историю посещения или новой вкладки. В чем глубокий смысл того, что расширение может перекрыть лишь одну из-этих страниц, от меня опять ускользнул.

Можно использовать tabs.create или window.open() для того чтобы открыть новую страницу

Интерфейсные и фоновые страницы имеют доступ к DOM друг друга, переменным и функциям.

Контентные скрипты

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

Использование chrome.* API

В дополнение к стандартным API для работы с веб-страницей, поддерживаемым всеми браузерами, расширение может использовать API Chrome, который позволяет более тесную интеграцию с браузером. Так, например, вместо window.open() можно использовать tab.create(), который дает больше возможностей

Синхронные и асинхронные методы

Большинство методов chrome.* API асинхронные. Они не ожидают, когда запрашиваемая операция выполнится. Если результат для вас важен, необходимо передавать в качестве параметра коллбэк функцию. Эта функция будет выполнена позже, когда точно – никто не знает.

Но есть и синхронные методы, они возвращают результат сразу.

Поэтому внимательно читайте доки, чтобы не попасть впросак.

Комментариев нет:

Отправить комментарий