スクリプトを使用して、Google Chromeがシークレットモードであるかどうかを確認することはできますか?
編集: 私は実際にはユーザースクリプトを介して可能であることを意味しましたが、答えはJavaScriptがWebページで実行されていることを前提としています。ここで、ユーザースクリプトに関する質問を再確認しました。
スクリプトを使用して、Google Chromeがシークレットモードであるかどうかを確認することはできますか?
編集: 私は実際にはユーザースクリプトを介して可能であることを意味しましたが、答えはJavaScriptがWebページで実行されていることを前提としています。ここで、ユーザースクリプトに関する質問を再確認しました。
回答:
はい。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"));
}
1つの方法は、一意の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」について泣く場合があります。ただし、Webサーバーからのサービスは機能します。
:visited
:hacks.mozilla.org/2010/03/...
Chrome 74以降では、利用可能なファイルシステムのストレージ容量を見積もることでこれを判断できます
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')
}
JavaScriptで、JHurrahの回答をご覧ください。リンクを強調表示しないことを除いて、すべてのシークレットモードは閲覧履歴とCookieを保存しません。グーグルヘルプページから:
- シークレットモードで開いたWebページやダウンロードしたファイルは、閲覧履歴やダウンロード履歴に記録されません。
- 開いたシークレットウィンドウをすべて閉じると、新しいCookieはすべて削除されます。
通常のブラウジングとシークレットモードの違いは、ウェブページにアクセスした後に発生することがわかるので、このモードでは、ブラウザがサーバーと通信することはありません。
このようなこのような多くのHTTPリクエストアナライザーの1つを使用して、ブラウザーがサーバーに送信するものを正確に確認できます。通常のセッションとシークレットモードのヘッダーを比較すると、違いはありません。
拡張機能を開発している場合は、タブAPIを使用して、ウィンドウ/タブがシークレットであるかどうかを判断できます。
詳細については、こちらをご覧ください。
Webページだけで作業している場合は簡単ではなく、そのように設計されています。ただし、データベース(window.database)を開こうとすると、すべての試みが失敗することに気付きました。これは、シークレットモードでは、ユーザーのマシンにデータの痕跡を残すことができないためです。
私はそれをテストしていませんが、localStorageへのすべての呼び出しも失敗すると思います。
これは、Promiseを使用して非同期コードがフラグを設定するのを待機するため、後で同期的に使用できます。
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));
});
その後、私たちはできる
if(isIncognito) alert('in incognito');
else alert('not in incognito');
reject('Check incognito failed')
てresolve(false)
、私がしたい場合は、isIncognito
真か偽かだけのブール値になるには?ありがとう。
Syntax Error: await is a reserved word
、そしてawait
常にasync
関数内にある必要があると思います。したがって、このコードは機能しないと思います。
reject
呼び出された場合に例外が発生し、値が返されないため、isIncognito
常にそうであるtrue
かfalse
、コードの記述方法です。ただし、値を返したい場合は、「解決」を使用することもできます。そしてそれは、環境がどのように処理するかに依存するかもしれませんが、グローバルスコープで待っていますか?グローバルスコープの(async function() { 'everything here' })();
isIncognito
として、結果の代わりにプロミスを保存し、後で非同期関数で実行することlet isIncognito = new Promise( ...etc
もできます。そうすると、どこか他の場所に次のような関数があります(async function() { if( !(await isIncognito) ) {alert('not incognito') } })();
Alokの回答に基づくクイックコピー/貼り付け機能(注:これは非同期です)
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, ()=>{});
}
}
使用法:
ifIncognito(true, ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
ES6構文で記述され、わずかに整理された、推奨される回答を以下に示します。
const isIncognito = () => new Promise((resolve, reject) => {
const fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
reject('Cant determine whether browser is running in incognito mode!');
}
fs(window.TEMPORARY, 100, resolve.bind(null, false), resolve.bind(null, true));
});
// Usage
isIncognito()
.then(console.log)
.catch(console.error)
ここでpromiseを使用したソリューション
const isIncognito = () => {
return new Promise((resolve, reject) => {
if ("storage" in navigator && "estimate" in navigator.storage) {
navigator.storage.estimate().then((res) => {
console.log(`Using ${res.usage} out of ${res.quota} bytes.`);
if (res.quota < 120000000) {
resolve(true);
} else {
reject(false);
}
});
} else {
reject(false);
}
});
};
それを使用する方法:
isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
シークレットモードのドキュメントでは、ウェブサイトの動作が異なることは特にありません。これは答えがノーであることを意味すると私は信じています。
incognito
あなたがそれを簡単に決定できればそれはそれほどではないでしょう:)