Moai+Easter 上級マニュアル
ご案内 Moaiエンジン CustomBoyエンジン HowToコンパイル Moai CGI Developers Raraku言語
Overview and Tutorial Cookie Hints PostVars Hints Fingerprint Hints Snippet Hints Futaba Note
はじめに
ここではCustomBoyが取り扱うSnippetコードの真偽値に関する情報を列挙します。 この真偽値はブラウザの種類やそのバージョンを推定するのに利用できます。 またCustomBoyエンジンでもこれらの情報を用いて処理を行っています。
とはいえ一般ユーザがこの記事に記載されたパターンの詳細を気にする必要は全くありません。
万一CustomBoyのデフォルトのKnowledge-baseでは問題が発生する場合、
究極的にはここにある情報を元にエキスパートユーザが手動でKnowledge-baseのソースコードを修正し、
CustomBoyの挙動を再構築することもできます。
Ver2.3よりこのようなことをするのにCコンパイラは不要となりました。 Ver2.3よりCustomBoyのKnowledge-baseのソースコードはすべてRaraku言語で記述されており、 またMoai自体にRarakuコンパイラが付属しているためです。
Ver2.3よりこのようなことをするのにCコンパイラは不要となりました。 Ver2.3よりCustomBoyのKnowledge-baseのソースコードはすべてRaraku言語で記述されており、 またMoai自体にRarakuコンパイラが付属しているためです。
この記事はMDNを主要な一次情報源としていますが、
その他様々なサイトの情報や筆者による実験も鑑みた上で総合的にこの記事を作成しています。
従って、その内容がMDNの記載とは一致しない項目もあります。
また世にあるすべてのブラウザを実際にインストールして結果を確認することは勿論できませんので、
内容に多少の誤差が含まれる可能性はご了承ください。
尚、MDNの記事は日々新しくなっており、古いブラウザの情報が削除されてしまっている場合があります(例えばIEなど)。 その場合、Unified XUL Platform MDN Backupを参考にするとよいでしょう。
尚、MDNの記事は日々新しくなっており、古いブラウザの情報が削除されてしまっている場合があります(例えばIEなど)。 その場合、Unified XUL Platform MDN Backupを参考にするとよいでしょう。
目次
- Snp_LtIE6
- Snp_LtIE7
- Snp_LtIE8
- Snp_IE9
- Snp_IE10
- Snp_IE11
- Snp_Trident
- Snp_Edge
- Snp_Gecko
- Snp_MozillaSidebar
- Snp_NavigatorOnline
- Snp_SessionStorage
- Snp_FunctionX5
- Snp_DocCurrentScript
- Snp_EventSource
- Snp_Crypto
- Snp_PerformanceNow
- Snp_AudioContext
- Snp_IndexedDB
- Snp_SendBeacon
- Snp_GetGamepads
- Snp_NavLanguages
- Snp_NavMediaDevices
- Snp_WinCaches
- Snp_CreateImageBitmap
- Snp_Onstorage
- Snp_NavGetBattery
- Snp_Presto
- Snp_LtChrome14
- Snp_Touch
- Snp_FacileMobile
- Snp_Webkit
- SnpAdd_ChromiumInFutaba
- SnpAdd_WindowStyles
Snp_LtIE6
以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined'
&& typeof document.documentElement.style.maxHeight == 'undefined'
目次に戻る
Snp_LtIE7
以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined'
&& typeof document.querySelectorAll == 'undefined'
目次に戻る
Snp_LtIE8
以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined'
&& typeof document.getElementsByClassName == 'undefined'
目次に戻る
Snp_IE9
以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==9
目次に戻る
Snp_IE10
以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==10
目次に戻る
Snp_IE11
以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==11
目次に戻る
Snp_Trident
以下のJavascriptコードを実行した結果である.
!!document.uniqueID
目次に戻る
Snp_Edge
以下のJavascriptコードを実行した結果である.
'-ms-scroll-limit' in document.documentElement.style
&& '-ms-ime-align' in document.documentElement.style
&& !window.navigator.msPointerEnabled
目次に戻る
Snp_Gecko
以下のJavascriptコードを実行した結果である.
'MozAppearance' in document.documentElement.style
目次に戻る
Snp_MozillaSidebar
以下のJavascriptコードを実行した結果です。!!window.sidebar
Mozilla Sidebarが存在する場合はtrueとなります。 名前から分かる通り、これはFirefox固有のpropertyです。 PC版のFirefoxにはこれが存在するためtrueとなります。 ただしAndroid版やiPhone版のFirefoxではこれは存在しないためfalseとなります (Android版やiPhone版では替わりにSnp_TouchやSnp_FacileMobileなどがtrueとなります)。
目次に戻る
Snp_NavigatorOnline
以下のJavascriptコードを実行した結果である.
typeof window.navigator.onLine != 'undefined'
目次に戻る
Snp_SessionStorage
以下のJavascriptコードを実行した結果である.
!!window.sessionStorage
- Chrome: 5以上
- Firefox(Gecko): 2以上
- IE: 8以上
- Opera: 10.50以上
- Safari(Webkit): 4以上
- Android: 2.1以上
- Opera Mobile: 11以上
- Safari Mobile: iOS 3.2以上
目次に戻る
Snp_FunctionX5
以下のJavascriptコードを実行した結果である.
(function x(){})[-5] == 'x'
目次に戻る
Snp_DocCurrentScript
以下のJavascriptコードを実行した結果である.
typeof document.currentScript != 'undefined'
- Chrome: 29以上
- Firefox(Gecko): 4以上
- Opera: 16以上
目次に戻る
Snp_EventSource
以下のJavascriptコードを実行した結果である.
typeof(EventSource) != 'undefined'
- Chrome: 9以上
- Firefox(Gecko): 6以上
- Opera: 11以上
目次に戻る
Snp_Crypto
以下のJavascriptコードを実行した結果である.
!!window.crypto && !!window.crypto.getRandomValues
- Chrome: 11以上
- Firefox(Gecko): 21以上
- IE: 11以上
- Opera: 15以上
- Safari: 3.1以上
目次に戻る
Snp_PerformanceNow
以下のJavascriptコードを実行した結果である.
!!window.performance && !!window.performance.now
- Chrome: 20以上
- Firefox(Gecko): 15以上
- IE: 10以上
- Opera: 15以上
- Safari: 8以上
目次に戻る
Snp_AudioContext
以下のJavascriptコードを実行した結果である.
!!window.AudioContext
- Chrome: 10以上
- Firefox(Gecko): 25以上
- Opera: 15以上
- Safari: 6以上
目次に戻る
Snp_IndexedDB
以下のJavascriptコードを実行した結果である.
!!window.indexedDB
- Chrome: 23以上
- Firefox(Gecko): 10以上
- IE: 10以上
- Opera: 15以上
- Safari(Webkit): 7.1以上
- Edge: OK
- Android: 4.4以上
- Firefox Mobile: 22以上
- Firefox OS: 1.0.1以上
- Opera Mobile: 22以上
- Safari Mobile: 8以上
目次に戻る
Snp_SendBeacon
以下のJavascriptコードを実行した結果である.
!!window.navigator.sendBeacon
- Chrome: 39以上
- Firefox(Gecko): 31以上
- Opera: 26以上
目次に戻る
Snp_GetGamepads
以下のJavascriptコードを実行した結果である.
!!navigator.getGamepads
- Chrome: 21以上
- Firefox(Gecko): 29以上
- Opera: 15以上
目次に戻る
Snp_NavLanguages
以下のJavascriptコードを実行した結果である.
!!window.navigator.languages
- Chrome: 32以上
- Firefox(Gecko): 32以上
目次に戻る
Snp_NavMediaDevices
以下のJavascriptコードを実行した結果である.
!!window.navigator.mediaDevices
- Chrome: 51以上
- Firefox(Gecko): 36以上
目次に戻る
Snp_WinCaches
以下のJavascriptコードを実行した結果である.
!!window.caches
- Chrome: 43以上
- Firefox(Gecko): 39以上
目次に戻る
Snp_CreateImageBitmap
以下のJavascriptコードを実行した結果である.
!!window.createImageBitmap
- Chrome: 50以上
- Firefox(Gecko): 42以上
目次に戻る
Snp_Onstorage
以下のJavascriptコードを実行した結果である.
typeof window.onstorage!='undefined'
- Firefox(Gecko): 45以上
目次に戻る
Snp_NavGetBattery
以下のJavascriptコードを実行した結果です。!!window.navigator.getBattery
MDN によれば、このコードはシステムのバッテリーに関する情報を提供するものです。 このように言われるとモバイル環境を想像しますが、PC版のブラウザでもこの値がtrueになるケースもあります。 またsafariではこれはサポートされていないことも特徴です。
以下の環境においてtrueです。
- Chrome: Version39以上
- Firefox: Version43以上51以下(Version52以降では廃止され、falseとなります)
- Opera: Version25以上
- Edge: Version79以上
目次に戻る
Snp_Presto
以下のJavascriptコードを実行した結果である.
!!window.opera
目次に戻る
Snp_LtChrome14
以下のJavascriptコードを実行した結果です。
!!window.chrome && typeof window.chrome.webstore!='undefined'
前半の!!window.chromeはChromium系か否かを判定する。
後半のtypeof window.chrome.webstore!='undefined'は、OperaやEdgeの可能性を廃するために付加したものであろう。
Chrome Ver14以上Ver70以下のみtrue
目次に戻る
Snp_Touch
以下のJavascriptコードを実行した結果です。typeof document.ontouchstart != 'undefined'
この環境のブラウザにおいてTouch Padが有効か否かを示します。 従って、例えばWindowsやLinuxなどのPC環境のFirefoxではこれはfalseになりますが、 AndroidやiPhone環境のFirefoxではこれがtrueになります。
目次に戻る
Snp_FacileMobile
以下のJavascriptコードを実行した結果です。typeof window.orientation != 'undefined'
ブラウザにおいてwindow.orientationが存在するか否かを示します。 window.orientationとは端末画面が縦長(portrait)と横長(landscape)のどちらであるかに関する情報であり、 これはモバイル環境である否かの簡易判定に使うことができます。 従って、例えばWindowsやLinuxなどのPC環境のFirefoxではこれはfalseになりますが、 AndroidやiPhone環境のFirefoxではこれがtrueになります。
MDN
の互換性の記載では、例えばPC環境のFirefoxでもtrueになるかのように読めるかもしれませんが、
実際はモバイル環境のFirefoxでのみtrueになることに注意しましょう。
目次に戻る
Snp_Webkit
以下のJavascriptコードを実行した結果です。!window.chrome && 'WebkitAppearance' in document.documentElement.style
これはChromium系以外のWebkitが使われているブラウザでtrueとなります。 特にこの値とSnp_Geckoの値と組み合わせることでSafariを検出する目的で一般によく使用されている定石的なコードです。
前半の!window.chromeで、Chromium系以外であることを前提とした上で、
後半によりWebkitが使われているVersionのみが検出されます。
これは様々なサイトで広く見られるコードで、例えばSafariなどを検出できます。
このSnippet自体はFirefoxでもtrueとなりますが、さらにSnp_Geckoの値を組み合わせることでSafariであることを推定できます。
あるいはAndroid標準のブラウザでもこのコードがtrueとなる場合があります(この場合もSnp_Geckoの値は通常falseとなります)。
しかもややこしいことに、このようなブラウザのUA文字列はChromeの書式とよく似ている場合があります。 例えば筆者の確認したAndroid機の標準ブラウザではUA文字列の後半は以下のようになっていました。
ただし純粋なChromeのUA文字列では「Version/4.0」という部分はありませんから、この部分だけ通常のChromeとは違うということになります。 また、このSnippetがtrueになるということは、window.chrome の値はfalseとなっているはずですから、 SnippetコードのレベルでもChromium系とは見なされないことになります。
あるいはAndroid標準のブラウザでもこのコードがtrueとなる場合があります(この場合もSnp_Geckoの値は通常falseとなります)。
これは筆者の手元にある比較的古いAndroid機(Ver5.1.1)の標準ブラウザで確認しました。
しかもややこしいことに、このようなブラウザのUA文字列はChromeの書式とよく似ている場合があります。 例えば筆者の確認したAndroid機の標準ブラウザではUA文字列の後半は以下のようになっていました。
AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36
ただし純粋なChromeのUA文字列では「Version/4.0」という部分はありませんから、この部分だけ通常のChromeとは違うということになります。 また、このSnippetがtrueになるということは、window.chrome の値はfalseとなっているはずですから、 SnippetコードのレベルでもChromium系とは見なされないことになります。
これは Google Chromeの古いバージョンに相当するものなのでしょうか?
UA文字列では「Chrome/55.0」となっており、普通に考えるとこれはChromeのVersion55を示唆します。
ChromeのVersion55といえば、既にレンダリングエンジンとしてBlinkを採用しており、
通常window.chromeの値はtrueとなることが期待されますが、このブラウザではそうはなりません。
その意味ではやはり(Chromeの亜種ではあるが)純粋なChromium系ではない特別なブラウザと見るべきなのでしょう。
目次に戻る
SnpAdd_ChromiumInFutaba
以下のJavascriptコードを実行した結果です。!!window.chrome && 'WebkitAppearance' in document.documentElement.style
このSnippetはふたばちゃんねるにおいて独自に設定されているものです (少なくとも他のサイトでは、私はこのようなコードを見たことがありません)。 実質 Chromium系であるか否かを示しています(ただしコードの後半は無意味なものです)。
以下の環境においてtrue.
- Chrome: 全Version
- Opera: 14以上
解説
まず参考のため、ブラウザ解析においてよく登場する以下のコードを掲載しておきます (上記のコードとよく似ていますが、一番最初の「!」の部分の個数が異なります)。
このコードはこの記事でもSnp_Webkitという項目として取り挙げたものです。
これに対し、本項目のSnpAdd_ChromiumInFutabaのコードでは、前半部分が!!window.chromeとなっており、 Chromium系であることを前提とした上で後半のコードを評価します。
もしかするとChromium系かつWebkitが使われているVersionのみを検出しようと試みたのかもしれませんが、 Chromium系では'WebkitAppearance' in document.documentElement.style でWebkit版であるか否かを判定することはできません (だからこそ、定石のSnp_Webkitでは先頭にまず!window.chromeという前提条件を置きます)。
Chromium系の場合、どのVersionでもこの'WebkitAppearance' というパターンを必ず含みます。 この場合、たとえWebkitが使われていないVersionでも、このコードの後半は必ずtrueになってしまいます。 よって後半は無意味になるわけです。
この後半のコードがtrueとなるのは、Chromeの場合は全Version、Operaの場合はVersion14以上のときです。 ChromeはVersion28以降Webkitは廃止されBlinkへと移行し、Operaの場合も同様にVersion15以降はBlinkとなっています。 念のため、Blinkへ移行したバージョンのChromeでこの値を確認してみると、 (Blinkであるため、もはやWebkitを使用していませんがそれにも関わらず)後半のコードはやはりtrueとなることが確認できます。
まず参考のため、ブラウザ解析においてよく登場する以下のコードを掲載しておきます (上記のコードとよく似ていますが、一番最初の「!」の部分の個数が異なります)。
!window.chrome && 'WebkitAppearance' in document.documentElement.style
このコードはこの記事でもSnp_Webkitという項目として取り挙げたものです。
これに対し、本項目のSnpAdd_ChromiumInFutabaのコードでは、前半部分が!!window.chromeとなっており、 Chromium系であることを前提とした上で後半のコードを評価します。
もしかするとChromium系かつWebkitが使われているVersionのみを検出しようと試みたのかもしれませんが、 Chromium系では'WebkitAppearance' in document.documentElement.style でWebkit版であるか否かを判定することはできません (だからこそ、定石のSnp_Webkitでは先頭にまず!window.chromeという前提条件を置きます)。
Chromium系の場合、どのVersionでもこの'WebkitAppearance' というパターンを必ず含みます。 この場合、たとえWebkitが使われていないVersionでも、このコードの後半は必ずtrueになってしまいます。 よって後半は無意味になるわけです。
この後半のコードがtrueとなるのは、Chromeの場合は全Version、Operaの場合はVersion14以上のときです。 ChromeはVersion28以降Webkitは廃止されBlinkへと移行し、Operaの場合も同様にVersion15以降はBlinkとなっています。 念のため、Blinkへ移行したバージョンのChromeでこの値を確認してみると、 (Blinkであるため、もはやWebkitを使用していませんがそれにも関わらず)後半のコードはやはりtrueとなることが確認できます。
目次に戻る
SnpAdd_WindowStyles
以下のJavascriptコードを実行した結果です。!!window.styles
このSnippetはふたばちゃんねるにおいて独自に設定されているものです。 (少なくとも他のサイトでは、私はこのようなコードを見たことがありません)。 そしてMDNなどのよく知られたどのドキュメントを参照しても、window object の中にstylesというメンバは存在しません。
果たしてこのコードが true となるブラウザが世界に存在するのでしょうか? これまで私が試したすべてのブラウザで、このコードがtrueとなるものは発見されませんでした。
ちなみにwindow objectの中のstatusというpropertyならば、Gecko 1.9.1以降ならば存在します。
とりあえずこのコードは常にfalseとなると考えてよいでしょう (もしかすると偽装を検出するため、敢えて常時falseになるコードを忍ばせたのかもしれません)。
目次に戻る
This article was written by:
K.Yakisoba.H
@znk project