Google chrome extension 如何阻止选项卡在webNavigation.onBeforeNavigate事件上打开页面?

Google chrome extension 如何阻止选项卡在webNavigation.onBeforeNavigate事件上打开页面?,google-chrome-extension,Google Chrome Extension,作为一个学习练习,我试图构建一个Chrome扩展示例,确保“greylist”上的站点总是在一个匿名窗口中打开 下面是我取得的进展-使用webNavigation.onBeforeNavigate事件,当灰色列表页面即将被导航到时,我将在匿名窗口中打开一个新选项卡,但现在需要阻止原始选项卡打开该页面 manifest.js: "permissions": [ "webNavigation", "tabs" ], "background": { "scripts": [ "b

作为一个学习练习,我试图构建一个Chrome扩展示例,确保“greylist”上的站点总是在一个匿名窗口中打开

下面是我取得的进展-使用webNavigation.onBeforeNavigate事件,当灰色列表页面即将被导航到时,我将在匿名窗口中打开一个新选项卡,但现在需要阻止原始选项卡打开该页面

manifest.js:

"permissions": [
  "webNavigation",
  "tabs"
],

"background": {
  "scripts": [
    "background.js"
  ],
  "persistent": false
},
background.js:

chrome.webNavigation.onBeforeNavigate.addListener(function(details) {
  chrome.tabs.get(details.tabId, function(tab) {
    if(!tab.incognito) {

      // Open the page in an incognito window
      chrome.windows.create({ url: details.url, incognito: true});

      // TODO stop non-incognito tab opening page!
    }
  });
}, {
  url: [
    { hostEquals: 'badsite.com' }
  ],
});

要停止导航,请通过在选项卡中插入内容脚本,使用
window.stop()

chrome.tabs.executeScript(details.tabId, {code: 'window.stop()'});
在manifest.json中添加权限,否则您将在中看到错误:

“权限”:[
“网络导航”,
“标签”,
""
],

部分答案来自wOxxOm的输入、进一步的实验和阅读——至少记录下我的发现

manifest.js:

"permissions": [
  "webNavigation",
  "tabs"
],

"background": {
  "scripts": [
    "background.js"
  ],
  "persistent": false
},
“权限”:[
“网络导航”,
“标签”,
“”//注意:权限
],
...
background.js:

chrome.webNavigation.onBeforeNavigate.addListener(function(details) {
  chrome.tabs.get(details.tabId, function(tab) {
    if(!tab.incognito) {

      // Open the page in an incognito window
      chrome.windows.create({ url: details.url, incognito: true});

      // TODO stop non-incognito tab opening page!
    }
  });
}, {
  url: [
    { hostEquals: 'badsite.com' }
  ],
});
//注意:未提交
chrome.webNavigation.onCommitted.addListener(函数(细节){
chrome.tabs.get(details.tabId,函数(tab){
如果(!tab.匿名){
//停止非匿名选项卡打开页面
//注释runAt:“文档开始”
executeScript(details.tabId,{runAt:“document_start”,代码:'window.stop();'})
//在匿名窗口中打开页面
create({url:details.url,incognito:true});
}
});
}, {
网址:[
{hostEquals:'badsite.com'}
],
});
侦听
chrome.webNavigation.onCommitted
事件而不是
onbeforeavigate
允许
chrome.tabs.executeScript
在从新选项卡导航到灰色列表页面并将url粘贴到omni框中时运行脚本

这将阻止显示灰色列表页面,但页面至少已部分加载。未创建历史记录条目,但创建了cookies或本地存储项,因此它不能满足我最初问题的最终需要。

两种方法:

  • 基于@wOxxOm
  • chrome.webNavigation.onBeforeNavigate.addListener((详细信息)=>{
    executeScript(tabid,{code:'window.stop()');
    });
    
  • 不刷新
  • window.history.pushState(“对象或字符串”、“标题”、“新url”);
    
    实际上,我想知道是否有办法操纵选项卡来取消导航。另外,我不想阻止请求,而是更改它显示的选项卡,因此WebRequestAPI不符合我的需要。不,不起作用。这不起作用。此外,我发现chrome.tabs.executeScript并不总是执行脚本。如果我创建一个新选项卡并导航到一个伟大的列表页面,它不会启动,如果我刷新页面,它会启动。我没有收到任何权限错误,是的,我正在检查onBeforeNavigate事件是否正在触发,以及是否调用了我的回调。我通过单击页面上的链接测试了此代码,它正常工作。仅仅说
    不起作用
    对诊断问题没有帮助,最好告诉确切的STR(复制步骤)。好吧,只是说,但是“它对我起作用”是等效的。但是:我在“//TODO…”注释中插入了您的代码行,添加了权限,重新加载了扩展名。导航到“非匿名”选项卡中的灰色列表页面,该页面将加载到“匿名”选项卡中,并且仍将加载到“原始”选项卡中。选项卡控制台或后台页面控制台中没有错误消息。阅读后,我确信该方法不适合我的需要,因为必须加载页面才能执行脚本,这太晚了-创建历史记录并设置cookie。我真的在寻找一种方法来命令选项卡立即放弃导航,这样就永远不会发送HTTP请求。如果这不可能,那很好,这对我来说是一个学习练习。最好在你的问题中包含详细的STR。至少我是这样做的(“[…]点击页面上的链接,它就工作了”)。对于executeScript,请尝试
    runAt:'document_start'
    参数,以便立即执行它。使用
    chrome.webRequest.onBeforeRequest
    截取请求并将其重定向到。这将导致请求实际上什么也不做(甚至不会刷新页面)。然后让你的代码以匿名方式打开请求的url。