javascript - ventana - ¿Puedes determinar si Chrome está en modo incógnito a través de un script?
nav privada (7)
¿Es posible determinar si Google Chrome está en modo incógnito a través de un script?
Editar: en realidad quise decir que es posible a través de script de usuario, pero las respuestas asumen que JavaScript se está ejecutando en una página web. He vuelto a hacer la pregunta here en lo que respecta a las secuencias de comandos del usuario.
Esto utiliza la promesa de esperar a que el código asíncrono establezca un indicador, por lo que podemos usarlo de forma síncrona posteriormente.
let isIncognito = await new Promise((resolve, reject)=>{
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) reject(''Check incognito failed'');
else fs(window.TEMPORARY, 100, ()=>resolve(false), ()=>resolve(true));
});
entonces podemos hacer
if(isIncognito) alert(''in incognito'');
else alert(''not in incognito'');
Función rápida de copiar y pegar basada en Alok''s Answer (nota: esto es asincrónico)
function ifIncognito(incog,func){
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) console.log("checking incognito failed");
else {
if(incog) fs(window.TEMPORARY, 100, ()=>{}, func);
else fs(window.TEMPORARY, 100, func, ()=>{});
}
}
uso:
ifIncognito(true, ()=>{ alert(''in incognito'') });
// or
ifIncognito(false, ()=>{ alert(''not in incognito'') });
La documentación para el modo de incógnito dice específicamente que los sitios web no se comportarán de manera diferente. Creo que esto significa que la respuesta es no.
Puedes, en JavaScript, ver la answer de JHurrah. Excepto por no resaltar enlaces, todo el modo de incógnito no guarda el historial de navegación y las cookies. De la página de ayuda de google:
- Las páginas web que abre y los archivos descargados mientras está de incógnito no se registran en sus historiales de navegación y descarga.
- Todas las cookies nuevas se eliminan después de cerrar todas las ventanas de incógnito que haya abierto.
Como puede ver, las diferencias entre navegación normal e incógnito ocurren después de visitar la página web, por lo tanto, no hay nada que el navegador comunique al servidor cuando está en este modo.
Puede ver exactamente qué envía su navegador al servidor usando uno de muchos analizadores de solicitudes HTTP, como este aquí . Compara los encabezados entre sesión normal e incógnito y no verás diferencia.
Sí. La API de FileSystem está deshabilitada en modo de incógnito. Consulte http://jsfiddle.net/w49x9f1a/ cuando esté y no esté en modo incógnito.
Código de muestra:
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
console.log("check failed?");
} else {
fs(window.TEMPORARY,
100,
console.log.bind(console, "not in incognito mode"),
console.log.bind(console, "incognito mode"));
}
Si está desarrollando una extensión, puede usar la API de pestañas para determinar si una ventana / pestaña de incógnito.
Más información se puede encontrar here .
Si solo está trabajando con una página web, no es fácil, y está diseñado para ser de esa manera. Sin embargo, he notado que todos los intentos de abrir una base de datos (window.database) fallan cuando en incongnito, esto se debe a que cuando en incógnito no se deja ningún rastro de datos en la máquina de los usuarios.
No lo he probado, pero sospecho que todas las llamadas a localStorage también fallan.
Una forma es visitar una URL única y luego verificar si un enlace a esa URL se trata como visitado por CSS.
Puede ver un ejemplo de esto en "Detección de incógnito" (Enlace muerto) .
Documento de investigación del mismo autor para reemplazar el enlace Detección de incógnito anterior
En main.html
agrega un iframe,
<iframe id=''testFrame'' name=''testFrame'' onload=''setUniqueSource(this)'' src='''' style="width:0; height:0; visibility:hidden;"></iframe>
y algunos códigos JavaScript:
function checkResult() {
var a = frames[0].document.getElementById(''test'');
if (!a) return;
var color;
if (a.currentStyle) {
color = a.currentStyle.color;
} else {
color = frames[0].getComputedStyle(a, '''').color;
}
var visited = (color == ''rgb(51, 102, 160)'' || color == ''#3366a0'');
alert(''mode is '' + (visited ? ''NOT Private'' : ''Private''));
}
function setUniqueSource(frame) {
frame.src = "test.html?" + Math.random();
frame.onload = '''';
}
Luego, en test.html
que se cargan en el iFrame:
<style>
a:link { color: #336699; }
a:visited { color: #3366A0; }
</style>
<script>
setTimeout(function() {
var a = document.createElement(''a'');
a.href = location;
a.id = ''test'';
document.body.appendChild(a);
parent.checkResult();
}, 100);
</script>
NOTA: intentar esto desde el sistema de archivos puede hacer que Chrome llore por "Javascript no seguro". Sin embargo, funcionará sirviendo desde un servidor web.