为特定窗口设置浏览器操作上下文菜单标签

时间:2015-03-21 15:07:08

标签: google-chrome google-chrome-extension tabs

我有一个Chrome扩展程序,可添加浏览器按钮。浏览器按钮有1个自定义上下文菜单项,“禁用DOMAIN ”或“重新启用DOMAIN ”。这是2个变量,具体取决于活动选项卡:启用/禁用及其域名。

我使用chrome.tabs.onUpdated跟踪新标签,chrome.tabs.onActivated跟踪标签切换。当发生任何一种情况时,我会根据这2个变量更新标签。例如。 “重新启用twitter.com ”或“停用google.com ”。

如果您有多个窗口,则会出现问题:

  1. 在窗口1中打开新标签页。标签现在为“禁用foo.com
  2. 在新窗口中打开该选项卡中的链接(2)。 Window 2的标签现在是“禁用bar.com ”。
    • 但是窗口1的标签也改变了!
  3. 切换回窗口1(仍然在foo.com上)(这不会触发任何标签事件)。标签是“禁用bar.com ”< WRONG
  4. 另一种情况是打开devtools,它会在所有窗口的所有标签中将所有DOMAIN更改为devtools

    如何区分窗口?有1个浏览器操作PER窗口,但只有1个要更改的contextmenu标签(将其全部更改)。也无法知道哪个窗口处于活动状态/我正在点击哪个窗口的浏览量。切换窗口没有标签事件,因此我无法更改标签。

    我正在检查AdBlock的代码,但它有同样的错误:如果你打开一个禁用AdBlock的新窗口,它会删除所有窗口上的上下文菜单项,并且在切换标签之前不会将它们放回去({{1 }})。

    选中事件代码,如果有帮助:

    onActivated

    相关的Chromium bug:https://code.google.com/p/chromium/issues/detail?id=469417

2 个答案:

答案 0 :(得分:2)

哦,当然有一个API chrome.windows。笨

这位宝宝修好了它:

chrome.windows.onFocusChanged.addListener(function(windowId) {
    chrome.windows.get(windowId, {"populate": true}, function(window) {
        var e = chrome.runtime.lastError; // Stut up, Chrome
        if ( !window ) return;
        console.log('onFocusChanged', windowId, window);

        for ( var i=window.tabs.length-1; i>=0; i-- ) {
            var tab = window.tabs[i];
            if ( tab.active ) {
                updateLabelStatus(tab);
                break;
            }
        };
    });
});

同样重要的是:updateLabel()我在没有指定chrome.browserAction.setBadgeBackgroundColor的情况下做了一些tabId,但没有它,它会改变所有窗口打开标签的bgcolor。

嗯,调试3小时并不好玩。 (其中2.5我不知道chrome.windows,该死的!)

答案 1 :(得分:0)

更简单的解决方案是在调用tabIdbrowserActionsetBadgeTextsetBadgeBackgroundColor等)时传递setIcon,如documentation

example