2017-12-09 プライベートブラウジングの判定 / ベヨネッタをクリアした
プライベートブラウジングの判定について調べてみた。
プライベートブラウジングにはさまざまな呼び名がある。 Firefox だとプライベートブラウジング。 Chrome だとシークレット モード。 Safari だとプライベートブラウズ。 Internet Explorer (IE) だと InPrivate ブラウズ、 Edge も同じかな……。
プライベートブラウジングは Web ブラウザに履歴や Cookie などを残さずにブラウジングするものだ。
ちなみに、ぼくが愛用している Firefox Focus はこれを前提にしている。 blog.bouzuya.net に書いた気がしていたのだけど、書いていなかったのでメモしておく。ツイートによると 2017-06-26 時点で使っているっぽい。
Firefox Focus が想像の3倍は良い。
— bouzuya (@bouzuya) 2017年6月26日
で、プライベートブラウジングの判定が必要な理由。
Cookie などで情報を保持している場合に、それをプライベートブラウジングによって毎回消されることで問題になることがある。基本は「サーバーサイドで永続化しろ」という話ではあるんだけど、要件的に実現できないこともある。たとえばプライベートブラウジングを意識せず使っているお客さんから「毎回ログインしなきゃいけないんだけど!」みたいな苦情が来ていると思ってほしい。個人的には「いや、あんたプライベートブラウジングしてるやん」とつっこみたいところだけど、客層次第でそんなつっこみは通用しないわけで……。それを「システムとしてうまく誘導してほしい」という要件が降ってきたら、プライベートブラウジングの判定が必要になるわけだ。
標準化されている機能ではないし、セキュリティ上の都合もあるだろうけど、これを判定する推奨される方法は提供されていない (はず) 。いくつか URL を挙げる。
- プライベートブラウジングモードの判定 ... まとまっている。
- https://twitter.com/bulkneets/status/410220936600616961 ... 上記記事の元になるツイートへのリプ。
- https://gist.github.com/cou929/7973956 ... 上記記事の作者による Gist
- Detect if a browser is in Private Browsing mode ... 他の作者による Gist 。 ES2015 前提で今っぽい。判定方法は大差ない。
- Javascript For Cross Browser Detection of Incognito Mode (Private Browsing) - Stack Overflow ... 上記 Gist に言及している Stack Overflow
- Can you determine if Chrome is in incognito mode via a script? - Stack Overflow ... Chrome での判定方法についての Stack Overflow
結論から言うと、ひとつめの記事を見れば良い。プライベートブラウジングは履歴やストレージに記録を残さない。その関連の API の挙動に違いが出やすい。
Safari が localStorage への書き込みで Error を投げるのは、普通に使っていて遭遇するレベルなので良いとして、その他ブラウザが問題だ。
Chrome / Opera ( v15 Blink 以降) は Stack Overflow にもあるように webkitRequestFileSystem で失敗する。
IE は indexedDB が undefined で、 Firefox は indexedDB の open で失敗する。
IE や Opera は試していないが、ほかはこの記事を書いている時点の最新のバージョンでも判定できている。
推奨された方法ではないので将来的に変わる可能性もあり、ためらわれるのだけど、 npm パッケージにしても良いかもしれない。ちなみに is-private-browser というパッケージがあるのだけど、 Safari しか判定できなくて大変アレ。
ベヨネッタをクリアした。難易度ノーマルで 11 時間 30 分かかった。
一番ゲームオーバーになったのはどこだろう……。 CHAPTER X の VERSE 7 かな。触手の橋を抜けた後で石像から出てくる Grace & Glory 。なぜか、ここでたくさんミスした記憶がある。ほかにもいろいろありそうだけど、印象に残った。アルフヘイムはまったくクリアできていないな。何回かやって、諦める感じ。