使Chrome扩展程序使现有标签处于活动状态,并使用chrome.webRequest.onBeforeRequest监听器

时间:2018-04-14 01:19:54

标签: google-chrome google-chrome-extension

我正在构建搜索应用,当用户尝试导航到搜索结果的网址时,我想: A)如果尚未在现有选项卡中打开该URL,则打开包含该URL的新选项卡,或者 B)如果他们已经有一个打开该URL的标签,请激活现有标签,并避免打开另一个具有相同网址的新标签。

与下面的代码分开,我有一个currentTabs dict,它跟踪每个打开的标签的tabId和URL,以便我可以将传入的URL与已经打开的URL进行比较。

我正在尝试在

上添加一个监听器
chrome.webRequest.onBeforeRequest 

实现这一目标。我正在使用类似?from_my_app = true的查询字符串,因此我只在我的应用程序的链接上实现此行为,而不是在有人尝试导航到他们已经打开的URL时。我的代码如下所示:

  chrome.webRequest.onBeforeRequest.addListener(
    function(details) {
        if (details.url.match(/?from_my_app=true/)) {
            var strippedUrl = (details.url.split('?from_my_app=true')[0];
            var matchedUrl;

            if (currentTabs.tabs) {
                // get the first pre-existing tab that has this url 
                matchedUrl = currentTabs.tabs.filter(x => x[1] == strippedUrl)[0];
            }

            if (matchedUrl) {
                // make the pre-existing tab with this url active
                // and cancel the opening of a new tab opening this url

                chrome.tabs.update(matchedUrl[0], { active: true });
                return { cancel: true }
            } else {
                // if this URL isn't already open in a tab, remove the
                // ?from_my_app=true query string and open it in a new 
                // tab

                return { redirectUrl: strippedUrl };
            }
        }
    }, 
    { urls: ["<all_urls>"] },
    ["blocking"]
);

我遇到的问题是

return { cancel: true } 
当URL已在另一个选项卡中打开时执行

导致选项卡根本不加载并说“已被阻止。 对服务器的请求已被扩展程序阻止。“显然我正在使用API​​错误 - 我正在寻找的行为是基本上使传入请求”无声地失败“并且只是导航到现有选项卡而根本没有打开新的标签。有没有一个干净的方法来做到这一点?

0 个答案:

没有答案