スクリプトを使用して Google Chrome がシークレット モードかどうかを判断することはできますか?
編集: 私は実際にはユーザースクリプトを介してそれが可能であることを意味していましたが、答えは JavaScript が Web ページで実行されていることを前提としています。ここで、ユーザー スクリプトに関して再質問しました。
スクリプトを使用して Google Chrome がシークレット モードかどうかを判断することはできますか?
編集: 私は実際にはユーザースクリプトを介してそれが可能であることを意味していましたが、答えは JavaScript が Web ページで実行されていることを前提としています。ここで、ユーザー スクリプトに関して再質問しました。
1 つの方法は、一意の URL にアクセスし、その URL へのリンクが CSS によってアクセスされたものとして扱われるかどうかを確認することです。
この例は、"Detecting Incognito" (リンク切れ) で確認できます。
上記の 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 サーバーからのサービスは機能します。
JavaScript で、JHurrah の回答を見ることができます。リンクを強調表示しないことを除いて、すべてのシークレット モードは閲覧履歴と Cookie を保存しません。Googleヘルプ ページから:
- シークレット モードで開いた Web ページやダウンロードしたファイルは、閲覧履歴やダウンロード履歴に記録されません。
- 開いたシークレット ウィンドウをすべて閉じると、新しい Cookie はすべて削除されます。
通常のブラウジングとシークレット モードの違いは、Web ページにアクセスした後に発生することがわかります。したがって、このモードでは、ブラウザがサーバーと通信することはありません。
ここのような多くの HTTP リクエスト アナライザーの 1 つを使用して、ブラウザーがサーバーに送信するものを正確に確認できます。通常のセッションとシークレット セッションのヘッダーを比較すると、違いはわかりません。
拡張機能を開発している場合は、タブ API を使用して、ウィンドウ/タブのシークレットかどうかを判断できます。
詳細については、こちらをご覧ください。
Web ページを操作するだけでは簡単ではありませんが、そのように設計されています。ただし、シークレット モードではデータベース (window.database) を開こうとするとすべて失敗することに気付きました。これは、シークレット モードではユーザーのマシンにデータの痕跡を残すことができないためです。
私はそれをテストしていませんが、localStorage へのすべての呼び出しも失敗すると思われます。