Skip to content

Instantly share code, notes, and snippets.

@jherax
Last active March 19, 2024 18:29
Show Gist options
  • Save jherax/a81c8c132d09cc354a0e2cb911841ff1 to your computer and use it in GitHub Desktop.
Save jherax/a81c8c132d09cc354a0e2cb911841ff1 to your computer and use it in GitHub Desktop.
Detect if the browser is running in Private mode - Promise based (last update: Feb 2020)
/**
* Lightweight script to detect whether the browser is running in Private mode.
* @returns {Promise<boolean>}
*
* Live demo:
* @see https://output.jsbin.com/tazuwif
*
* This snippet uses Promises. If you want to run it in old browsers, polyfill it:
* @see https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js
*
* More Promise Polyfills:
* @see https://ourcodeworld.com/articles/read/316/top-5-best-javascript-promises-polyfills
*
* Disclaimer:
* No longer maintained, last updated: Feb 2020
*/
function isPrivateMode() {
return new Promise(function detect(resolve) {
var yes = function() { resolve(true); }; // is in private mode
var not = function() { resolve(false); }; // not in private mode
function detectChromeOpera() {
// https://developers.google.com/web/updates/2017/08/estimating-available-storage-space
var isChromeOpera = /(?=.*(opera|chrome)).*/i.test(navigator.userAgent) && navigator.storage && navigator.storage.estimate;
if (isChromeOpera) {
navigator.storage.estimate().then(function(data) {
return data.quota < 120000000 ? yes() : not();
});
}
return !!isChromeOpera;
}
function detectFirefox() {
var isMozillaFirefox = 'MozAppearance' in document.documentElement.style;
if (isMozillaFirefox) {
if (indexedDB == null) yes();
else {
var db = indexedDB.open('inPrivate');
db.onsuccess = not;
db.onerror = yes;
}
}
return isMozillaFirefox;
}
function detectSafari() {
var isSafari = navigator.userAgent.match(/Version\/([0-9\._]+).*Safari/);
if (isSafari) {
var testLocalStorage = function() {
try {
if (localStorage.length) not();
else {
localStorage.setItem('inPrivate', '0');
localStorage.removeItem('inPrivate');
not();
}
} catch (_) {
// 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();
}
return true;
};
var version = parseInt(isSafari[1], 10);
if (version < 11) return testLocalStorage();
try {
window.openDatabase(null, null, null, null);
not();
} catch (_) {
yes();
}
}
return !!isSafari;
}
function detectEdgeIE10() {
var isEdgeIE10 = !window.indexedDB && (window.PointerEvent || window.MSPointerEvent);
if (isEdgeIE10) yes();
return !!isEdgeIE10;
}
// when a browser is detected, it runs tests for that browser
// and skips pointless testing for other browsers.
if (detectChromeOpera()) return;
if (detectFirefox()) return;
if (detectSafari()) return;
if (detectEdgeIE10()) return;
// default navigation mode
return not();
});
}
/**
* Lightweight script to detect whether the browser is running in Private mode.
*
* Live demo:
* @see https://output.jsbin.com/tazuwif
*
* This snippet uses Promises. If you want to run it in old browsers, polyfill it:
* @see https://cdn.jsdelivr.net/npm/es6-promise@4/dist/es6-promise.auto.min.js
*
* More Promise Polyfills:
* @see https://ourcodeworld.com/articles/read/316/top-5-best-javascript-promises-polyfills
*
* Disclaimer:
* No longer maintained, last updated: Feb 2020
*/
export function isPrivateMode(): Promise<boolean> {
return new Promise<boolean>(resolve => {
const yes = () => resolve(true); // is in private mode
const not = () => resolve(false); // not in private mode
function detectChromeOpera(): boolean {
// https://developers.google.com/web/updates/2017/08/estimating-available-storage-space
const isChromeOpera = /(?=.*(opera|chrome)).*/i.test(navigator.userAgent) && navigator.storage?.estimate;
if (isChromeOpera) {
navigator.storage.estimate().then(({ quota }) => {
quota < 120000000 ? yes() : not();
});
}
return !!isChromeOpera;
}
function detectFirefox(): boolean {
const isMozillaFirefox = 'MozAppearance' in document.documentElement.style;
if (isMozillaFirefox) {
if (indexedDB == null) yes();
else {
const db = indexedDB.open('inPrivate');
db.onsuccess = not;
db.onerror = yes;
}
}
return isMozillaFirefox;
}
function detectSafari(): boolean {
const isSafari = navigator.userAgent.match(/Version\/([0-9\._]+).*Safari/);
if (isSafari) {
const testLocalStorage = () => {
try {
if (localStorage.length) not();
else {
localStorage.setItem('inPrivate', '0');
localStorage.removeItem('inPrivate');
not();
}
} catch (_) {
// 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();
}
return true;
};
const version = parseInt(isSafari[1], 10);
if (version < 11) return testLocalStorage();
try {
(window as any).openDatabase(null, null, null, null);
not();
} catch (_) {
yes();
}
}
return !!isSafari;
}
function detectEdgeIE10(): boolean {
const isEdgeIE10 = !window.indexedDB && (window.PointerEvent || window.MSPointerEvent);
if (isEdgeIE10) yes();
return !!isEdgeIE10;
}
// when a browser is detected, it runs tests for that browser
// and skips pointless testing for other browsers.
if (detectChromeOpera()) return;
if (detectFirefox()) return;
if (detectSafari()) return;
if (detectEdgeIE10()) return;
// default navigation mode
return not();
});
}
/**
* Live demo:
* @see https://output.jsbin.com/tazuwif
*
* Disclaimer:
* No longer maintained, last updated: Feb 2020
*/
isPrivateMode().then(function (isPrivate) {
console.log('Browsing in private mode? ', isPrivate);
});
@Joe12387
Copy link

Joe12387 commented Jun 9, 2022

If anyone is looking for a solution in 2022, I have a repo available: https://github.com/Joe12387/detectIncognito

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment