Tracking of incognito/privat browsing | Community
Skip to main content
Level 2
December 21, 2016
Solved

Tracking of incognito/privat browsing

  • December 21, 2016
  • 2 replies
  • 9225 views

Hi! 

Any insights or recommendations on how to track if a visitor uses incognito browsing when visiting a website? 

There are several ways to identify if the visitor ID was previously unseen (i.e. Visit Number = 1), but this does not infer the user using incognito browsing mode.

Ideally, an s.prop-value or an Omniture/Adobe Analytics plugin would be able to detect the browser mode, so a distinction between 'standard' and 'incognito'/'in-private' can be made.

Any help would be much appreciated :) 

Martin

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by martin_munkn548

Actually, I've found a workaround that works for most major browsers except IE. I've been running some tests and not seen any misdetection. 

The javascript I'm using is this - but it might have some holes I'm missing? If you're aware of this, please let me know :) 

Script: 

// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';

// Safari 3.0+ "[object HTMLElementConstructor]" 
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);

// Internet Explorer 6-11
var isIE = /*@cc_on!@*/false || !!document.documentMode;

// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;

// Chrome 1+
var isChrome = !!window.chrome && !!window.chrome.webstore;

// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;

if (!isEdge && !isIE) {
    new Promise(function (resolve) {
    var db,
    on = function(){ resolve(true) },
    off = function(){ resolve(false) },
    tryls = function tryls() {
        try {
            localStorage.length ? off() : (localStorage.x = 1, localStorage.removeItem("x"), off());
        } 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 ? on() : off();
        }
    }

    // Blink (chrome & opera)
    window.webkitRequestFileSystem ? webkitRequestFileSystem(0, 0, off, on)
    // FF
    : "MozAppearance" in document.documentElement.style ? (db = indexedDB.open("test"), db.onerror = on, db.onsuccess = off)
    // Safari
    : /constructor/i.test(window.HTMLElement) ? tryls()
    // IE10+ & edge
    : !window.indexedDB && (window.PointerEvent || window.MSPointerEvent) ? on()
    // Rest
    : off();
}).then(function (isPrivateMode) {
    if (isPrivateMode) {
    b.privateBrowsing = "Yes"
    }
});
}

2 replies

EricMatisoff
Adobe Employee
Adobe Employee
January 10, 2017

Hi Martin,

Unfortunately, this is not possible due to the way that browsers completely clear all cache, cookies, and history when accessing Incognito/Privacy Mode. Other than those three items being cleared, there's no other way to identify that a user is running their browser in these modes. Here's some more information on why this is not possible: http://stackoverflow.com/a/22623958

Level 3
November 10, 2020
Hi Eric, any update on this? Running into this issue more often now. Would love to hear if Adobe has a solution now. Thx.
martin_munkn548AuthorAccepted solution
Level 2
January 11, 2017

Actually, I've found a workaround that works for most major browsers except IE. I've been running some tests and not seen any misdetection. 

The javascript I'm using is this - but it might have some holes I'm missing? If you're aware of this, please let me know :) 

Script: 

// Opera 8.0+
var isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;

// Firefox 1.0+
var isFirefox = typeof InstallTrigger !== 'undefined';

// Safari 3.0+ "[object HTMLElementConstructor]" 
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window['safari'] || safari.pushNotification);

// Internet Explorer 6-11
var isIE = /*@cc_on!@*/false || !!document.documentMode;

// Edge 20+
var isEdge = !isIE && !!window.StyleMedia;

// Chrome 1+
var isChrome = !!window.chrome && !!window.chrome.webstore;

// Blink engine detection
var isBlink = (isChrome || isOpera) && !!window.CSS;

if (!isEdge && !isIE) {
    new Promise(function (resolve) {
    var db,
    on = function(){ resolve(true) },
    off = function(){ resolve(false) },
    tryls = function tryls() {
        try {
            localStorage.length ? off() : (localStorage.x = 1, localStorage.removeItem("x"), off());
        } 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 ? on() : off();
        }
    }

    // Blink (chrome & opera)
    window.webkitRequestFileSystem ? webkitRequestFileSystem(0, 0, off, on)
    // FF
    : "MozAppearance" in document.documentElement.style ? (db = indexedDB.open("test"), db.onerror = on, db.onsuccess = off)
    // Safari
    : /constructor/i.test(window.HTMLElement) ? tryls()
    // IE10+ & edge
    : !window.indexedDB && (window.PointerEvent || window.MSPointerEvent) ? on()
    // Rest
    : off();
}).then(function (isPrivateMode) {
    if (isPrivateMode) {
    b.privateBrowsing = "Yes"
    }
});
}