Как сделать page_action для определенных страниц?

Я играл с некоторыми расширениями chrome, и я нашел этот пример: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/pageAction/pageaction_by_url/

Все работает отлично, но я хочу создать собственное расширение, и я хочу увидеть значок page_action на определенном сайте, а не те, в которых есть "g". Поэтому я попробовал просто изменить script следующим образом:

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Called when the url of a tab changes.
function checkForValidUrl(tabId, changeInfo, tab) {
// If the letter 'g' is found in the tab URL...
if (tab.url.indexOf('g') > -1) {
// ... show the page action.
chrome.pageAction.show(tabId);
}
};

// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);

В это:

chrome.pageAction.show(tabId);

Но теперь это не работает... Я не понимаю. Очевидно, я могу использовать обходной путь, но это не главное... Прежде всего, нужно ли создать справочную страницу для этого? Я думаю, да, но я не понимаю, почему и почему метод .show работает не один? Я попытался выполнить поиск в документации и материалах Google, но я не смог найти ничего полезного. Я не эксперт, и это был мой первый день, проведенный на расширении Google, но как мне узнать, что "chrome.page.show( tabId)" должен идти на фоновом режиме, если он не написан нигде? Нет намерения критиковать, но как, черт возьми, вы, ребята, узнали? Все хромовые методы должны идти на фоновой странице? Ну, определенно гораздо больше вопросов, чем это законно. Надеюсь, вы можете дать мне хотя бы один ответ!

Ответ 1

http://code.google.com/chrome/extensions/pageAction.html
... говорит...

По умолчанию действие страницы скрыто. Когда вы показываете его, вы указываете вкладку, в которой должен появиться значок. Значок остается видимым до тех пор, пока вкладка закрыта или начинает отображать другой URL-адрес (поскольку пользователь нажимает ссылку, например).

Таким образом, даже если ваш tabid действителен, он будет исчезать довольно быстро, так как ваш единственный запуск chrome.pageAction.show(tabId); один раз, когда первая страница будет запущена.
Вам нужно постоянно проверять изменения вкладок в фоновом режиме, потому что у страниц не есть совпадений /exclude _matches в манифесте, как это делают скрипты контента (жалость). Поэтому вы должны проверить себя и отреагировать на изменения.
Если вы хотите, чтобы он работал на конкретном сайте, просто измените его на что-то вроде...

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Called when the url of a tab changes.
function checkForValidUrl(tabId, changeInfo, tab) {
// If the tabs url starts with "http://specificsite.com"...
if (tab.url.indexOf('http://specificsite.com') == 0) {
// ... show the page action.
chrome.pageAction.show(tabId);
}
};

// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);

Ответ 2

Для тех, кто ищет способ обработки субдоменов, если у вас есть сайт с субдоменом, например blog.specificsite.com, или вам нужно использовать подстановочные знаки, вы также можете использовать регулярное выражение в этом формате

function checkForValidUrl(tabId, changeInfo, tab) 
{
    if(typeof tab != "undefined" && typeof tab != "null" )
    {
        // If the tabs URL contains "specificsite.com"...
        //This would work in the same way as *specificsite.com*, with 0 or more characters surrounding the URL.
        if (/specificsite[.]com/.test(tab.url)) 
        {
            // ... show the page action.
            chrome.pageAction.show(tabId);
        }
    }
};

// Listen for any changes to the URL of any tab.
chrome.tabs.onUpdated.addListener(checkForValidUrl);

чтобы соответствовать подстроке в URL. Это также помогает при вычислении выполнить проверку null/ undefined, чтобы избежать дополнительной обработки исключений.