我正在构建搜索应用,当用户尝试导航到搜索结果的网址时,我想: 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错误 - 我正在寻找的行为是基本上使传入请求”无声地失败“并且只是导航到现有选项卡而根本没有打开新的标签。有没有一个干净的方法来做到这一点?