Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Detect if the browser is running in Private mode
// uncomment if you are transpiling with Babel + Webpack
// const { window, document } = global;
/**
* Lightweight script to detect whether the browser is running in Private mode.
*
* You should use a polyfill for Promise.
* @see https://ourcodeworld.com/articles/read/316/top-5-best-javascript-promises-polyfills
*
* @returns {Promise}
*/
function isPrivateMode() {
return new Promise((resolve) => {
const yes = () => resolve(true); // is in private mode
const not = () => resolve(false); // not in private mode
const testLocalStorage = () => {
try {
if (localStorage.length) not();
else {
localStorage.x = 1;
localStorage.removeItem('x');
not();
}
} catch (e) {
// Safari only enables cookie in private mode
// if cookie is disabled, then all client side storage is disabled
// if all client side storage is disabled, then there is no point
// in using private mode
navigator.cookieEnabled ? yes() : not();
}
};
// Chrome & Opera
if (window.webkitRequestFileSystem) {
return void window.webkitRequestFileSystem(0, 0, not, yes);
}
// Firefox
if ('MozAppearance' in document.documentElement.style) {
if (indexedDB === null) return yes();
const db = indexedDB.open('test');
db.onerror = yes;
db.onsuccess = not;
return void 0;
}
// Safari
const isSafari = navigator.userAgent.match(/Version\/([0-9\._]+).*Safari/);
if (isSafari) {
const version = parseInt(isSafari[1], 10);
if (version < 11) return testLocalStorage();
try {
window.openDatabase(null, null, null, null);
return not();
} catch (_) {
return yes();
};
}
// IE10+ & Edge InPrivate
if (!window.indexedDB && (window.PointerEvent || window.MSPointerEvent)) {
return yes();
}
// default navigation mode
return not();
});
}
isPrivateMode().then((isPrivate) => {
console.log('browsing in private mode? ', isPrivate);
});
@jherax

This comment has been minimized.

Copy link
Owner Author

commented Dec 1, 2016

This script can be found in the following stackoverflow: Detecting if a browser is using Private Browsing mode

@jmboiton

This comment has been minimized.

Copy link

commented Jun 29, 2017

I would like to highlight this comment from the same stackoverflow question :

Promises aren't natively supported in IE10 or 11. I'd assume you used a polyfill here

@lukasotocerny

This comment has been minimized.

Copy link

commented Dec 27, 2017

It fails to detect Private mode in Safari Version 11.0.2

@subversivo58

This comment has been minimized.

Copy link

commented Jan 24, 2018

Suggest: fix Chrome and Opera handler... using RequestFileSystem third param is targed to success and last for error, like:

return void window.webkitRequestFileSystem(0, 0, on, off);
@Maykonn

This comment has been minimized.

Copy link

commented Jul 27, 2018

@gaurav150493

This comment has been minimized.

Copy link

commented Sep 24, 2018

It fails to detect Private mode in Safari Version 11.0.2

try {
  window.openDatabase(null, null, null, null);
} catch (_) {
  isPrivate = true;
};

Use this code for iOS > 11

@Elastic1

This comment has been minimized.

Copy link

commented Nov 20, 2018

for safari

    const isSafari = navigator.userAgent.match(/Version\/([0-9\._]+).*Safari/);
    if (isSafari) {
      const version = parseInt(isSafari[1], 10);
      if (version >= 11) {
         try {
           window.openDatabase(null, null, null, null);
           return off();
         } catch (_) {
           return on();
         };
      } else if (version < 11) {
        return testLocalStorage();
      }
   }
@jherax

This comment has been minimized.

Copy link
Owner Author

commented Feb 6, 2019

for safari

const isSafari = ...

Thanks for the improvement @Elastic1

Added to the snippet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.