Как добавить значок в адресной строке для расширения 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 ответов


Я вижу две проблемы с вашим кодом.

  1. вы не можете использовать встроенные блоки скриптов на фоновой странице -- JS-код может быть запущен только из связанного скрипта (например:<script type="text/javascript" src="background.js"></script>). Это из-за Политика Безопасности Контента.

  2. как отмечено в ответе Абрахама, поскольку вы хотите, чтобы значок отображался для всех страниц, вы должны использовать 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_actions можно включить только для определенных страниц. Если вы не хотите browser_action действовать как кнопка, чем ничего не делать.