首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为特定窗口设置浏览器操作contextmenu标签

为特定窗口设置浏览器操作contextmenu标签
EN

Stack Overflow用户
提问于 2015-03-21 15:07:07
回答 2查看 273关注 0票数 0

我有一个Chrome扩展,增加了一个浏览器按钮。浏览器按钮有一个自定义的Conext菜单项,要么“禁用域”,要么“重新启用域”。这是两个变量,取决于活动选项卡:已启用/禁用及其域名。

我使用chrome.tabs.onUpdated跟踪新选项卡,使用chrome.tabs.onActivated跟踪选项卡开关。无论发生哪种情况,我都会根据这两个变量更新标签。例如。“为twitter.com重新启用”或“为google.com禁用”。

当您有超过一个窗口时,问题就会发生:

  1. 打开窗口1中的新选项卡。标签现在是“禁用foo.com”
  2. 打开新窗口(2)中该选项卡中的链接。窗口2的标签现在是“禁用bar.com”。
    • 但是window 1的标签也变了!

  1. 切换回窗口1(仍在foo.com上)(这不会触发任何选项卡事件)。标签是“禁用bar.com”<错误

另一个场景是打开devtools,它将所有窗口中所有标签中的所有DOMAIN更改为devtools

如何区分窗口?每个窗口有一个浏览器操作,但只有一个contextmenu标签需要更改(这会改变所有窗口)。不可能知道哪个窗口是活动的/哪个窗口是我单击的浏览器。没有切换窗口的选项卡事件,所以我不能更改标签。

我正在签出AdBlock的代码,但它有相同的错误:如果您打开一个禁用AdBlock的新窗口,它将删除所有窗口上的contextmenu项,直到您切换制表符(onActivated)时才会将它们放回。

选项卡事件代码,如果有帮助的话:

代码语言:javascript
运行
复制
chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
    console.log('onUpdated', tabId, info, tab);
    if ( info.status && tab.active ) {
        updateLabelStatus(tab);
    }
});

chrome.tabs.onActivated.addListener(function(info) {
    console.log('onActivated', info);
    chrome.tabs.get(info.tabId, function(tab) {
        updateLabelStatus(tab);
    });
});

function updateLabelStatus(tab) {
    var host = rweb.host(tab.url);

    chrome.storage.local.get('disabled', function(items) {
        var disabled = items.disabled || {};
        updateLabel(host in disabled, host, tab.id);
    });
}

function updateLabel(disabled, host, tabId) {
    // Update label
    var newLabel = labels[ Number(disabled) ].replace('DOMAIN', host);

    // >> THIS IS WHERE I MIGHT WANT TO SPECIFY A WINDOW <<
    chrome.contextMenus.update(browserActionMenuItemId, {"title": newLabel});
}

相关铬缺陷:https://code.google.com/p/chromium/issues/detail?id=469417

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-21 15:38:24

哦,,当然有chrome.windows的API。太愚蠢了。

这孩子修好了:

代码语言:javascript
运行
复制
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()中,我做了一些没有指定tabIdchrome.browserAction.setBadgeBackgroundColor,但是没有它,它将更改所有窗口打开的选项卡的bgcolor。

嗯,这三个小时的调试可不好玩。(其中我不知道chrome.windows,该死!)

票数 2
EN

Stack Overflow用户

发布于 2017-07-20 12:45:45

一个更简单的解决方案可以是在调用tabId s (setBadgeTextsetBadgeBackgroundColorsetIcon等)时传递一个文档,就像文档建议的那样。

示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29184242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档