Пользовательский интерфейс расширения должен быть целеустремленным и минимальным. Как и сами расширения, пользовательский интерфейс должен настраивать или улучшать качество просмотра, не отвлекая от него.
В этом руководстве рассматриваются обязательные и дополнительные функции пользовательского интерфейса. Используйте его, чтобы понять, как и когда реализовывать различные элементы пользовательского интерфейса в расширении.
Активируйте расширение на всех страницах
Используйте браузер_действие , если функции расширения работают в большинстве ситуаций.
Зарегистрировать действие браузера
Поле "browser_action"
зарегистрировано в манифесте.
{
"name": "My Awesome browser_action Extension",
...
"browser_action": {
...
}
...
}
Объявление "browser_action"
сохраняет цвет значка, указывая, что расширение доступно пользователям.
Добавить значок
Значки отображают цветной баннер, содержащий до четырех символов, поверх значка браузера. Их могут использовать только расширения, которые объявляют "browser_action"
в своем манифесте.
Используйте значки, чтобы указать состояние расширения. В примере события «Питьевая вода » отображается значок «ВКЛ», чтобы показать пользователю, что он успешно установил будильник, и ничего не отображается, когда расширение не используется.
Установите текст значка, вызвав chrome.browserAction.setBadgeText
, а цвет баннера, вызвав chrome.browserAction.setBadgeBackgroundColor
.
chrome.browserAction.setBadgeText({text: 'ON'});
chrome.browserAction.setBadgeBackgroundColor({color: '#4688F1'});
Активируйте расширение на выбранных страницах
Используйте page_action , когда функции расширения доступны только при определенных обстоятельствах.
Объявить действие страницы
Поле "page_action"
зарегистрировано в манифесте.
{
"name": "My Awesome page_action Extension",
...
"page_action": {
...
}
...
}
Объявление "page_action"
раскрасит значок только тогда, когда расширение доступно пользователям, в противном случае он будет отображаться в оттенках серого.
Определите правила активации расширения
Определите правила использования расширения, вызвав chrome.declarativeContent
в прослушивателе runtime.onInstalled
в фоновом скрипте . Пример расширения « Действие страницы по URL-адресу» устанавливает условие, согласно которому URL-адрес должен содержать букву «g». Если условие выполнено, расширение вызывает declarativeContent.ShowPageAction()
.
chrome.runtime.onInstalled.addListener(function() {
// Replace all rules ...
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
// With a new rule ...
chrome.declarativeContent.onPageChanged.addRules([
{
// That fires when a page's URL contains a 'g' ...
conditions: [
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { urlContains: 'g' },
})
],
// And shows the extension's page action.
actions: [ new chrome.declarativeContent.ShowPageAction() ]
}
]);
});
});
Включить или отключить расширение
Расширения, использующие "page_action"
можно активировать и отключать динамически, вызывая pageAction.show
и pageAction.hide
.
Пример расширения Mappy сканирует веб-страницу в поисках адреса и показывает его местоположение на статической карте во всплывающем окне . Поскольку расширение зависит от содержимого страницы, оно не может объявлять правила, позволяющие предсказать, какие страницы будут релевантны. Вместо этого, если на странице найден адрес, он вызывает pageAction.show
чтобы раскрасить значок и сообщить, что расширение можно использовать на этой вкладке.
chrome.runtime.onMessage.addListener(function(req, sender) {
chrome.storage.local.set({'address': req.address})
chrome.pageAction.show(sender.tab.id);
chrome.pageAction.setTitle({tabId: sender.tab.id, title: req.address});
});
Предоставьте значки расширений
Для расширения расширений требуется хотя бы один значок. Предоставление значков в формате PNG обеспечивает наилучшие визуальные результаты, хотя принимаются любые форматы, поддерживаемые WebKit, включая BMP, GIF, ICO и JPEG.
Назначение значков панели инструментов
Значки, относящиеся к панели инструментов, регистрируются в поле "default_icon"
в разделе browser_action
или page_action
манифеста. Рекомендуется включать несколько размеров для масштабирования на 16-диапазонное пространство. Рекомендуется использовать как минимум размеры 16x16 и 32x32.
{
"name": "My Awesome page_action Extension",
...
"page_action": {
"default_icon": {
"16": "extension_toolbar_icon16.png",
"32": "extension_toolbar_icon32.png"
}
}
...
}
Все значки должны быть квадратными, иначе они могут быть искажены. Если значки не указаны, Chrome добавит общий значок на панель инструментов.
Создание и регистрация дополнительных значков
Включите дополнительные значки следующих размеров для использования за пределами панели инструментов.
Размер значка | Использование значка |
---|---|
16x16 | фавикон на страницах расширения |
32х32 | Компьютерам под управлением Windows часто требуется этот размер. Использование этой опции предотвратит искажение размера при уменьшении параметра 48x48. |
48x48 | отображается на странице управления расширениями |
128х128 | отображается при установке и в интернет-магазине Chrome |
Зарегистрируйте значки в манифесте в поле "icons"
.
{
"name": "My Awesome Extension",
...
"icons": {
"16": "extension_icon16.png",
"32": "extension_icon32.png",
"48": "extension_icon48.png",
"128": "extension_icon128.png"
}
...
}
Дополнительные функции пользовательского интерфейса
Неожиданно возникнуть
Всплывающее окно — это HTML-файл, который отображается в специальном окне, когда пользователь щелкает значок на панели инструментов. Всплывающее окно работает очень похоже на веб-страницу; он может содержать ссылки на таблицы стилей и теги скриптов, но не поддерживает встроенный JavaScript.
Во всплывающем окне примера события «Питьевая вода» отображаются доступные параметры таймера. Пользователи устанавливают сигнал тревоги, нажав одну из предоставленных кнопок.
<html>
<head>
<title>Water Popup</title>
</head>
<body>
<img src='./stay_hydrated.png' id='hydrateImage'>
<button id='sampleSecond' value='0.1'>Sample Second</button>
<button id='15min' value='15'>15 Minutes</button>
<button id='30min' value='30'>30 Minutes</button>
<button id='cancelAlarm'>Cancel Alarm</button>
<script src="popup.js"></script>
</body>
</html>
Всплывающее окно можно зарегистрировать в манифесте, в действии браузера или действии страницы.
{
"name": "Drink Water Event",
...
"browser_action": {
"default_popup": "popup.html"
}
...
}
Всплывающие окна также можно настроить динамически, вызвав browserAction.setPopup
или pageAction.setPopup
.
chrome.storage.local.get('signed_in', function(data) {
if (data.signed_in) {
chrome.browserAction.setPopup({popup: 'popup.html'});
} else {
chrome.browserAction.setPopup({popup: 'popup_sign_in.html'});
}
});
Подсказка
Используйте всплывающую подсказку, чтобы давать пользователям короткие описания или инструкции при наведении курсора на значок браузера.
Подсказки регистрируются в поле "default_title"
browser_action
или page_action
в манифесте.
{
"name": "Tab Flipper",
...
"browser_action": {
"default_title": "Press Ctrl(Win)/Command(Mac)+Shift+Right/Left to flip tabs"
}
...
}
Всплывающие подсказки также можно установить или обновить, вызвав browserAction.setTitle
и pageAction.setTitle
.
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.browserAction.setTitle({tabId: tab.id, title: "You are on tab:" + tab.id});
});
Специализированные строки локали реализуются с помощью Internationalization . Создайте каталоги для размещения сообщений, специфичных для конкретного языка, в папке с именем _locales
, например:
-
_locales/en/messages.json
-
_locales/es/messages.json
Форматируйте сообщения внутри messages.json
каждого языка.
{
"__MSG_tooltip__": {
"message": "Hello!",
"description": "Tooltip Greeting."
}
}
{
"__MSG_tooltip__": {
"message": "Hola!",
"description": "Tooltip Greeting."
}
}
Включите имя сообщения в поле всплывающей подсказки вместо самого сообщения, чтобы включить локализацию.
{
"name": "Tab Flipper",
...
"browser_action": {
"default_title": "__MSG_tooltip__"
}
...
}
Омнибокс
Пользователи могут вызывать функциональные возможности расширения через омнибокс . Включите в манифест поле "omnibox"
и укажите ключевое слово. Пример расширения «Поиск новой вкладки» в омнибоксе использует «nt» в качестве ключевого слова.
{
"name": "Omnibox New Tab Search",\
...
"omnibox": { "keyword" : "nt" },
"default_icon": {
"16": "newtab_search16.png",
"32": "newtab_search32.png"
}
...
}
Когда пользователь вводит «nt» в омнибокс, расширение активируется. Чтобы сообщить об этом пользователю, он окрашивает предоставленный значок размером 16x16 в оттенки серого и включает его в омнибокс рядом с именем расширения.
Расширение прослушивает событие omnibox.onInputEntered
. После запуска расширение открывает новую вкладку, содержащую поиск Google по записи пользователя.
chrome.omnibox.onInputEntered.addListener(function(text) {
// Encode user input for special characters , / ? : @ & = + $ #
var newURL = 'https://www.google.com/search?q=' + encodeURIComponent(text);
chrome.tabs.create({ url: newURL });
});
Контекстное меню
Добавьте новые параметры контекстного меню , предоставив разрешение "contextMenus"
в манифесте.
{
"name": "Global Google Search",
...
"permissions": [
"contextMenus",
"storage"
],
"icons": {
"16": "globalGoogle16.png",
"48": "globalGoogle48.png",
"128": "globalGoogle128.png"
}
...
}
Значок размером 16x16 отображается рядом с новым пунктом меню.
Создайте контекстное меню, вызвав contextMenus.create
в фоновом скрипте . Это должно быть сделано в рамках события прослушивателя runtime.onInstalled
.
chrome.runtime.onInstalled.addListener(function() {
for (let key of Object.keys(kLocales)) {
chrome.contextMenus.create({
id: key,
title: kLocales[key],
type: 'normal',
contexts: ['selection'],
});
}
});
const kLocales = {
'com.au': 'Australia',
'com.br': 'Brazil',
'ca': 'Canada',
'cn': 'China',
'fr': 'France',
'it': 'Italy',
'co.in': 'India',
'co.jp': 'Japan',
'com.ms': 'Mexico',
'ru': 'Russia',
'co.za': 'South Africa',
'co.uk': 'United Kingdom'
};
В примере контекстного меню глобального поиска Google создается несколько параметров из списка в locales.js . Если расширение содержит более одного контекстного меню, Google Chrome автоматически сворачивает их в одно родительское меню.
Команды
Расширения могут определять определенные команды и привязывать их к комбинации клавиш. Зарегистрируйте одну или несколько команд в манифесте в поле "commands"
.
{
"name": "Tab Flipper",
...
"commands": {
"flip-tabs-forward": {
"suggested_key": {
"default": "Ctrl+Shift+Right",
"mac": "Command+Shift+Right"
},
"description": "Flip tabs forward"
},
"flip-tabs-backwards": {
"suggested_key": {
"default": "Ctrl+Shift+Left",
"mac": "Command+Shift+Left"
},
"description": "Flip tabs backwards"
}
}
...
}
Команды можно использовать для предоставления новых или альтернативных ярлыков браузера. Пример расширения Tab Flipper прослушивает событие commands.onCommand
в фоновом сценарии и определяет функциональные возможности для каждой зарегистрированной комбинации.
chrome.commands.onCommand.addListener(function(command) {
chrome.tabs.query({currentWindow: true}, function(tabs) {
// Sort tabs according to their index in the window.
tabs.sort((a, b) => { return a.index < b.index; });
let activeIndex = tabs.findIndex((tab) => { return tab.active; });
let lastTab = tabs.length - 1;
let newIndex = -1;
if (command === 'flip-tabs-forward')
newIndex = activeIndex === 0 ? lastTab : activeIndex - 1;
else // 'flip-tabs-backwards'
newIndex = activeIndex === lastTab ? 0 : activeIndex + 1;
chrome.tabs.update(tabs[newIndex].id, {active: true, highlighted: true});
});
});
Команды также могут создавать привязку клавиш, которая работает специально с ее расширением. Пример Hello Extensions дает команду для открытия всплывающего окна.
{
"name": "Hello Extensions",
"description" : "Base Level Extension",
"version": "1.0",
"browser_action": {
"default_popup": "hello.html",
"default_icon": "hello_extensions.png"
},
"manifest_version": 2,
"commands": {
"_execute_browser_action": {
"suggested_key": {
"default": "Ctrl+Shift+F",
"mac": "MacCtrl+Shift+F"
},
"description": "Opens hello.html"
}
}
}
Поскольку расширение определяет browser_action
оно может указать "execute_browser_action"
в командах для открытия всплывающего файла без включения фонового сценария . Если вы используете page_action
, его можно заменить на "execute_page_action"
. В одном расширении можно использовать как команды браузера, так и расширения.
Переопределить страницы
Расширение может переопределить и заменить веб-страницу «История», «Новая вкладка» или «Закладки» пользовательским HTML-файлом. Как и всплывающее окно , оно может включать специализированную логику и стиль, но не поддерживает встроенный JavaScript. Одно расширение ограничено переопределением только одной из трех возможных страниц.
Зарегистрируйте страницу переопределения в манифесте в поле "chrome_url_overrides"
.
{
"name": "Awesome Override Extension",
...
"chrome_url_overrides" : {
"newtab": "override_page.html"
},
...
}
Поле "newtab"
следует заменить на "bookmarks"
или "history"
при переопределении этих страниц.
<html>
<head>
<title>New Tab</title>
</head>
<body>
<h1>Hello World</h1>
<script src="logic.js"></script>
</body>
</html>