Основы
Расширение, это файловый архив, содержащий 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 асинхронные. Они не ожидают, когда запрашиваемая операция выполнится. Если результат для вас важен, необходимо передавать в качестве параметра коллбэк функцию. Эта функция будет выполнена позже, когда точно – никто не знает.
Но есть и синхронные методы, они возвращают результат сразу.
Поэтому внимательно читайте доки, чтобы не попасть впросак.
Комментариев нет:
Отправить комментарий