Действия расширения в манифесте V3

С момента запуска расширений Chrome платформа позволила разработчикам предоставлять функциональные возможности расширений непосредственно в пользовательском интерфейсе Chrome верхнего уровня с помощью действий . Действие — это кнопка со значком, которая может открыть всплывающее окно или активировать некоторые функции расширения. Исторически Chrome поддерживал два типа действий: действия браузера и действия страницы; Манифест V3 изменил ситуацию, объединив их функциональность в новом API chrome.action .

Краткая история действий расширения

Хотя сам chrome.action является новым в Манифесте V3, базовые функции, которые он предоставляет, восходят к тому моменту, когда расширения впервые появились в стабильной версии в январе 2010 года. Первая стабильная версия платформы расширений Chrome поддерживала два разных типа действий: действия браузера и действия страницы. .

Действия браузера позволили разработчикам расширений отображать значок «на главной панели инструментов Google Chrome, справа от адресной строки» ( источник ) и предоставили пользователям простой способ активировать функциональность расширения на любой странице. Действия страницы, с другой стороны, были предназначены для «представления действий, которые можно выполнить на текущей странице, но которые не применимы ко всем страницам» ( источник ).

В омнибоксе появляется действие страницы (слева), указывающее, что расширение может что-то делать на этой странице. Действие браузера (справа) всегда видно.

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

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

Примерно шесть лет спустя Chrome 49 представил новую парадигму пользовательского интерфейса для расширений. Чтобы помочь пользователям понять, какие расширения у них есть, Chrome начал отображать все активные расширения справа от омнибокса. Пользователи могли «переполнять» расширения в меню 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 API для отображения количества запросов, заблокированных расширением для данной вкладки. Эта возможность важна, поскольку она позволяет блокировщикам контента информировать конечных пользователей, не раскрывая потенциально конфиденциальные метаданные просмотра расширению.

Заворачивать

Модернизация платформы расширений Chrome была одной из наших главных мотиваций для Manifest V3. Во многих случаях это означало переход на новые технологии, но это также означало и упрощение поверхности нашего API; вот в чем была наша цель.

Я надеюсь, что этот пост помог пролить свет на этот конкретный аспект платформы Manifest V3. Чтобы узнать больше о том, как команда Chrome подходит к будущему расширений браузера, ознакомьтесь со страницами «Видение платформы» и «Обзор манифеста V3» в нашей документации для разработчиков. Вы также можете обсудить расширения Chrome с другими разработчиками в группе Google по расширениям Chrome .