Argenti Apparatus
Argenti Apparatus

Reputation: 4013

How to block a tab from opening a page on webNavigation.onBeforeNavigate event?

As a learning exercise I'm attempting to build an example Chrome extension that ensures sites on a 'greylist' are always opened in an incognito window.

Here's how far I have got - using the webNavigation.onBeforeNavigate event fired when a grey listed page is about to be navigated to I open a new tab in an incognito window, but now need to prevent the original tab from opening the page.

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' }
  ],
});

Upvotes: 3

Views: 1757

Answers (3)

defend orca
defend orca

Reputation: 743

two ways:

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

Upvotes: 1

Argenti Apparatus
Argenti Apparatus

Reputation: 4013

Partial answer arrived at from wOxxOm's input and further experiments and reading - to at least document what I found out.

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' }
  ],
});

Listening for chrome.webNavigation.onCommitted events instead of onBeforeNavigate allows the script injected by chrome.tabs.executeScript to run when a grey listed page is navigated to from a new tab and a url is pasted into the omni box.

This prevents the grey listed page from being displayed, but the page is at least partially loaded. A history entry is not created but cookies or local storage items are created, so it does not meet the ultimate need of my original question.

Upvotes: 2

woxxom
woxxom

Reputation: 73616

To stop the navigation use window.stop() by injecting a content script in the tab:

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

Add a permission in manifest.json, otherwise you'll see an error in the background page console:

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

Upvotes: 2

Related Questions