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

时间:2016-07-27 17:11:35

标签: google-chrome-extension

作为一项学习练习,我尝试构建一个示例Chrome扩展程序,以确保“灰名单”上的网站。始终在隐身窗口中打开。

这里有多远 - 使用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' }
  ],
});

3 个答案:

答案 0 :(得分:0)

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

chrome.tabs.executeScript(details.tabId, {code: 'window.stop()'});

在manifest.json中添加权限,否则您会在background page console中看到错误:

"permissions": [
  "webNavigation",
  "tabs",
  "<all_urls>"
],

答案 1 :(得分:0)

部分答案来自wOxxOm的输入和进一步的实验和阅读 - 至少记录我发现的内容。

manifest.js:

"permissions": [
  "webNavigation",
  "tabs",
  "<all_urls>"        // Note: Permission
],

...

background.js:

// Note: onCommitted
chrome.webNavigation.onCommitted.addListener(function(details) {
  chrome.tabs.get(details.tabId, function(tab) {
    if(!tab.incognito) {

      // Stop non-incognito tab opening page
      // Note runAt: "document_start"
      chrome.tabs.executeScript(details.tabId, { runAt: "document_start", code: 'window.stop(); '})

      // Open the page in an incognito window
      chrome.windows.create({ url: details.url, incognito: true});
    }
  });
}, {
  url: [
    { hostEquals: 'badsite.com' }
  ],
});

收听chrome.webNavigation.onCommitted个事件而不是onBeforeNavigate允许chrome.tabs.executeScript注入的脚本在从新标签导航到灰色列出的页面并且将网址粘贴到omni时运行框。

这可以防止灰名单页面显示,但页面至少部分加载。未创建历史记录条目,但 Cookie或本地存储项目已创建,因此无法满足原始问题的最终需求。

答案 2 :(得分:0)

两种方式:

  1. 基于@wOxxOm
chrome.webNavigation.onBeforeNavigate.addListener((details) => {    
        chrome.tabs.executeScript(tabid,{code: 'window.stop()'});   
});
  1. 不刷新
window.history.pushState(“object or string”, “Title”, “/new-url”);