是否可以通过脚本确定 Google Chrome 是否处于隐身模式?
编辑: 我的意思实际上是通过用户脚本可以实现,但答案假设 JavaScript 正在网页上运行。我在这里重新询问了有关用户脚本的问题。
是否可以通过脚本确定 Google Chrome 是否处于隐身模式?
编辑: 我的意思实际上是通过用户脚本可以实现,但答案假设 JavaScript 正在网页上运行。我在这里重新询问了有关用户脚本的问题。
此答案的功能取决于 Chrome 版本。最近的评论是这个作品在v90
是的。FileSystem API 在隐身模式下被禁用。当您处于和未处于隐身模式时,请查看https://jsfiddle.net/w49x9f1a/。
示例代码:
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"));
}
在 Chrome 74 到 84.0.4147.135 中,您可以通过估计可用的文件系统存储空间来确定这一点
查看jsfiddle
if ('storage' in navigator && 'estimate' in navigator.storage) {
const {usage, quota} = await navigator.storage.estimate();
console.log(`Using ${usage} out of ${quota} bytes.`);
if(quota < 120000000){
console.log('Incognito')
} else {
console.log('Not Incognito')
}
} else {
console.log('Can not detect')
}
一种方法是访问一个唯一的 URL,然后检查该 URL 的链接是否被 CSS 视为访问过。
你可以在“Detecting Incognito” (死链接)中看到一个例子。
在main.html
新增的iframe,
<iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
,以及一些 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 = '';
}
然后test.html
加载到 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>
注意:从文件系统尝试这个会让 Chrome 抱怨“不安全的 Javascript”。但是,它将从网络服务器提供服务。
如果您正在开发扩展,那么您可以使用选项卡 API 来确定窗口/选项卡是否隐身。
可以在此处找到更多信息。
如果你只是在处理一个网页,这并不容易,而且它就是这样设计的。但是,我注意到在隐身模式下打开数据库(window.database)的所有尝试都失败了,这是因为在隐身模式下,不允许在用户计算机上留下任何数据痕迹。
我还没有测试过,但我怀疑所有对 localStorage 的调用也失败了。