С момента запуска расширений Chrome платформа позволила разработчикам выставлять функциональность расширения непосредственно в верхнем уровне пользовательского интерфейса Chrome с помощью действий . Действие — это кнопка-значок, которая может открыть всплывающее окно или запустить некоторую функциональность в расширении. Исторически Chrome поддерживал два типа действий: действия браузера и действия страницы; Manifest V3 изменил это, объединив их функциональность в новом API chrome.action .
Краткая история действий по расширению
Хотя сам chrome.action
является новым в Manifest V3, базовая функциональность, которую он предоставляет, восходит к моменту появления первых расширений в стабильной версии в январе 2010 года. Первый стабильный выпуск платформы расширений Chrome поддерживал два различных типа действий: действия браузера и действия страницы .
Действия браузера позволили разработчикам расширений отображать значок «на главной панели инструментов Google Chrome, справа от адресной строки» ( источник ) и предоставили пользователям простой способ запуска функциональности расширения на любой странице. Действия страницы, с другой стороны, были предназначены для «представления действий, которые могут быть выполнены на текущей странице, но которые не применимы ко всем страницам» ( источник ).
Другими словами, действия браузера предоставили разработчикам расширений постоянную поверхность пользовательского интерфейса в браузере, в то время как действия страницы появлялись только тогда, когда расширение могло сделать что-то полезное на текущей странице.
Оба типа действий были необязательными, поэтому разработчик расширения мог либо не предоставлять никаких действий, либо выполнять действие страницы или действие браузера (указание нескольких действий не допускается).
Примерно шесть лет спустя Chrome 49 представил новую парадигму пользовательского интерфейса для расширений. Чтобы помочь пользователям понять, какие расширения у них есть, Chrome начал отображать все активные расширения справа от омнибокса. Пользователи могли «переливать» расширения в меню Chrome, если хотели.
Чтобы отображать значок для каждого расширения, это обновление также внесло два важных изменения в поведение расширений в пользовательском интерфейсе Chrome. Во-первых, все расширения начали отображать значки на панели инструментов. Если у расширения не было значка, Chrome автоматически его генерировал. Во-вторых, действия страницы были перемещены на панель инструментов вместе с действиями браузера и получили возможность различать их состояния «показать» и «скрыть».
Это изменение позволило расширениям действий страницы продолжать работать так, как ожидалось, но также уменьшило роль действий страницы с течением времени. Одним из последствий редизайна пользовательского интерфейса стало то, что действия страницы были фактически включены в действия браузера. Поскольку все расширения отображались на панели инструментов, пользователи ожидали, что нажатие значка панели инструментов расширения вызовет это расширение, и действия браузера стали все более важным взаимодействием для расширений Chrome.
Изменения Манифеста V3
Пользовательский интерфейс Chrome и расширения продолжали развиваться в годы после редизайна пользовательского интерфейса расширения 2016 года, но действия браузера и действия страницы оставались в значительной степени неизменными. То есть, по крайней мере, до тех пор, пока мы не начали планировать, как модернизировать платформу расширений с помощью Manifest V3.
Команда разработчиков расширений поняла, что действия браузера и действия страницы все больше превращаются в различие без смысла. Хуже того, их тонкие различия в поведении затрудняли разработчикам выбор того, что использовать. Мы поняли, что можем решить эти проблемы, объединив действие браузера и действие страницы в одно «действие».
Знакомьтесь с API действий: chrome.action
— это наиболее прямой аналог chrome.browserAction
, но у него есть несколько заметных отличий.
Во-первых, chrome.action
представляет новый метод getUserSettings()
. Этот метод дает разработчикам расширений возможность проверить, закрепил ли пользователь действие своего расширения на панели инструментов.
let userSettings = await chrome.action.getUserSettings();
console.log(`Is the action pinned? ${userSettings.isOnToolbar ? 'Yes' : 'No'}.`);
"getUserSettings" может показаться немного необычным названием для этой функциональности по сравнению, скажем, с "isPinned", но история действий в Chrome показывает, что пользовательский интерфейс браузера меняется быстрее, чем API расширений. Таким образом, наша цель с этим API — раскрыть пользовательские настройки, связанные с действиями, в общих интерфейсах, чтобы минимизировать будущий перебор API. Он также позволяет другим поставщикам браузеров раскрывать концепции пользовательского интерфейса, специфичные для браузера, в объекте UserSettings , возвращаемом этим методом.
Во-вторых, значок и включенное/выключенное состояние действия расширения можно контролировать с помощью API декларативного контента. Это важно, поскольку позволяет расширениям реагировать на поведение пользователя при просмотре без доступа к контенту или даже URL-адресам посещаемых страниц. Например, давайте посмотрим, как расширение может включить свое действие, когда пользователь посещает страницы на example.com.
// Manifest V3
chrome.runtime.onInstalled.addListener(() => {
chrome.declarativeContent.onPageChanged.removeRules(undefined, () => {
chrome.declarativeContent.onPageChanged.addRules([
{
conditions: [
new chrome.declarativeContent.PageStateMatcher({
pageUrl: {hostSuffix: '.example.com'},
})
],
actions: [new chrome.declarativeContent.ShowAction()]
}
]);
});
});
Приведенный выше код почти идентичен тому, что расширение будет делать с действием страницы. Единственное отличие в том, что в Manifest V3 мы использовали declarativeContent.ShowAction
вместо declarativeContent.ShowPageAction
в Manifest V2.
Наконец, блокировщики контента могут использовать метод setExtensionActionOptions
API declarativeNetRequest для отображения количества запросов, заблокированных расширением для данной вкладки. Эта возможность важна, поскольку она позволяет блокировщикам контента информировать конечных пользователей, не раскрывая потенциально конфиденциальные метаданные браузера расширению.
Заворачивать
Модернизация платформы расширений Chrome была одной из наших главных мотиваций для Manifest V3. Во многих случаях это означало переход на новые технологии, но это также означало упрощение поверхности API; вот что было нашей целью здесь.
Надеюсь, этот пост помог пролить свет на этот конкретный аспект платформы Manifest V3. Чтобы узнать больше о том, как команда Chrome подходит к будущему расширений браузера, ознакомьтесь со страницами Platform vision и Overview of Manifest V3 в нашей документации для разработчиков. Вы также можете обсудить расширения Chrome с другими разработчиками в группе chromium-extensions Google.