Как добавить значок в адресной строке для расширения Chrome?
Я не уверен, как это сделать, и документация, похоже, не делает это совершенно очевидным.
Я пытался сделать background_page
и ставишь chrome.pageAction.show(tab.id);
внутри, но это, похоже, не работает.
Я не хочу использовать browser_action
значок, потому что значок просто отражает статус плагина, но это не кнопка для выполнения каких-либо действий.
как добавить значок page_action в адресной строке для любой страницы / вкладки в любое время?
EDIT: вот мой манифест.в JSON:
{
"name": "My Very First Extension :D",
"version": "0.0.1",
"description": "Awesomeness",
"background_page": "background.html",
"page_action": {
"default_icon": "icon.png"
},
"content_scripts": [{
"matches": ["http://*/*", "https://*/*"],
"js": ["mmm.js"]
}]
}
значок где.png является 19x19 пикселей PNG графика. Вот предыстория.HTML источник, где я пытаюсь сделать значок page_action для всех вкладок:
<!DOCTYPE html>
<html>
<head>
<script>
chrome.pageAction.show(tab.id);
</script>
</head>
</html>
3 ответов
Я вижу две проблемы с вашим кодом.
вы не можете использовать встроенные блоки скриптов на фоновой странице -- JS-код может быть запущен только из связанного скрипта (например:
<script type="text/javascript" src="background.js"></script>
). Это из-за Политика Безопасности Контента.-
как отмечено в ответе Абрахама, поскольку вы хотите, чтобы значок отображался для всех страниц, вы должны использовать browser_action, а не page_action. Согласно документация Google по pageAction страница:
не используйте действия страницы для функций, которые имеют смысл для большинства страниц. Вместо этого используйте действия браузера.
значки для действий страницы отображаются внутри omnibar (адресная строка Chrome), а значки для действий браузера отображаются в виде кнопки панели инструментов рядом с omnibar. Либо может использоваться для отражения статуса плагина и в качестве кнопки действия.
решений
чтобы значок появился, вы должны позвонить: chrome.pageAction.show(tabId)
. Однако вы не можете просто вызвать это из сценария содержимого, потому что chrome.pageAction.show () должен быть передан tabId, и tabId извлекается из chrome.вкладки и chrome.вкладки недоступны из сценариев содержимого.
чтобы добавить кнопку действия браузера и определить ее поведение при нажатии, определите элемент browser_action в манифесте.файл json ...
"browser_action": {
"default_title": "action description",
"default_icon": "icon.png"
}
... и поместите этот код в фоновом режиме сценарий:
// Define behavior when browser action icon is clicked
chrome.browserAction.onClicked.addListener(function(tab) {
// executed when the user clicks on the browser action icon
});
или, если вы хотите пойти против правил и использовать pageAction, вы можете использовать манифест.код json из вашего вопроса и поместите следующее в свой фоновый скрипт:
// Show page action icon in omnibar.
function showPageAction( tabId, changeInfo, tab ) {
chrome.pageAction.show(tabId);
};
// Call the above function when the url of a tab changes.
chrome.tabs.onUpdated.addListener(showPageAction);
для дальнейших исследований проверьте исходный код некоторых из них пример расширения.
Если вы хотите, чтобы контент-скрипт показывал значок действия страницы, он (контент-скрипт) не может этого сделать, но он может отправить сообщение в фоновом режиме.js, чтобы сделать это (фон.js разрешено показывать значки действий страницы)
сценарий содержимого (например . foo.в JS):
chrome.runtime.sendMessage({action: "showIcon"}, function(response) {});
фон.js:
// Received a message from content script
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.action == "showIcon") {
chrome.pageAction.show(sender.tab.id);
}
});
использовать . page_action
и browser_action
такие же и обеспечивают такую же функциональность за исключением этого page_action
s можно включить только для определенных страниц. Если вы не хотите browser_action
действовать как кнопка, чем ничего не делать.