Moai+Easter 上級マニュアル

Moai Manual Advanced Manual Annoucement FAQ
ご案内 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コンパイラが付属しているためです。

この記事はMDNを主要な一次情報源としていますが、 その他様々なサイトの情報や筆者による実験も鑑みた上で総合的にこの記事を作成しています。 従って、その内容がMDNの記載とは一致しない項目もあります。 また世にあるすべてのブラウザを実際にインストールして結果を確認することは勿論できませんので、 内容に多少の誤差が含まれる可能性はご了承ください。

尚、MDNの記事は日々新しくなっており、古いブラウザの情報が削除されてしまっている場合があります(例えばIEなど)。 その場合、Unified XUL Platform MDN Backupを参考にするとよいでしょう。


目次



Snp_LtIE6

以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined' && typeof document.documentElement.style.maxHeight == 'undefined'
IE6以前のみtrue
目次に戻る

Snp_LtIE7

以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined' && typeof document.querySelectorAll == 'undefined'
IE7以前のみtrue
目次に戻る

Snp_LtIE8

以下のJavascriptコードを実行した結果である.
typeof window.addEventListener == 'undefined' && typeof document.getElementsByClassName == 'undefined'
IE8以前のみtrue
目次に戻る

Snp_IE9

以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==9
IE9のみtrue
目次に戻る

Snp_IE10

以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==10
IE10のみtrue
目次に戻る

Snp_IE11

以下のJavascriptコードを実行した結果である.
!!document.uniqueID && document.documentMode==11
IE11のみtrue
目次に戻る

Snp_Trident

以下のJavascriptコードを実行した結果である.
!!document.uniqueID
Trident Rendering Engineを使っている場合はtrue. IEはこれを使っているためtrue.
目次に戻る

Snp_Edge

以下のJavascriptコードを実行した結果である.
'-ms-scroll-limit' in document.documentElement.style    && '-ms-ime-align' in document.documentElement.style    && !window.navigator.msPointerEnabled
色々並べてあるが上二つはすべてMS製ブラウザに存在する特性であり、最後にIEのみに存在する特性を除外していることから、Edgeか否かを判定する. Edgeの場合はtrue.
目次に戻る

Snp_Gecko

以下のJavascriptコードを実行した結果である.
'MozAppearance' in document.documentElement.style
Gecko Rendering Engineを使っている場合はtrue Firefoxはこれを使っているためtrue.
目次に戻る

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
ブラウザにsessionStorage機構が存在するか否かを示す. ブラウザの対応状況は以下が目安である(MDNによる).
  • 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'
このFunctionX5テストとは、Firefox Ver3.xにのみ存在するコード特性を検査するというもの. 'function x(){}' を文字列として見た場合、その -5 番目の文字(最後から5番目)は 'x' となっている. Firefox Ver3.x ではこのような暗黙の文字列変換が行われるようで、その特性が存在するかを検証するコードである. Firefox Ver3.xのみtrue.
目次に戻る

Snp_DocCurrentScript

以下のJavascriptコードを実行した結果である.
typeof document.currentScript != 'undefined'
以下の環境においてtrue.
  • Chrome: 29以上
  • Firefox(Gecko): 4以上
  • Opera: 16以上

目次に戻る

Snp_EventSource

以下のJavascriptコードを実行した結果である.
typeof(EventSource) != 'undefined'
以下の環境においてtrue.
  • Chrome: 9以上
  • Firefox(Gecko): 6以上
  • Opera: 11以上

目次に戻る

Snp_Crypto

以下のJavascriptコードを実行した結果である.
!!window.crypto && !!window.crypto.getRandomValues
以下の環境においてtrue.
  • Chrome: 11以上
  • Firefox(Gecko): 21以上
  • IE: 11以上
  • Opera: 15以上
  • Safari: 3.1以上

目次に戻る

Snp_PerformanceNow

以下のJavascriptコードを実行した結果である.
!!window.performance && !!window.performance.now
以下の環境においてtrue.
  • Chrome: 20以上
  • Firefox(Gecko): 15以上
  • IE: 10以上
  • Opera: 15以上
  • Safari: 8以上

目次に戻る

Snp_AudioContext

以下のJavascriptコードを実行した結果である.
!!window.AudioContext
以下の環境においてtrue.
  • Chrome: 10以上
  • Firefox(Gecko): 25以上
  • Opera: 15以上
  • Safari: 6以上

目次に戻る

Snp_IndexedDB

以下のJavascriptコードを実行した結果である.
!!window.indexedDB
これはブラウザにindexedDB機構が存在するか否かを示す. ブラウザの対応状況は以下が目安である(MDNによる).
  • 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
以下の環境においてtrue.
  • Chrome: 39以上
  • Firefox(Gecko): 31以上
  • Opera: 26以上

目次に戻る

Snp_GetGamepads

以下のJavascriptコードを実行した結果である.
!!navigator.getGamepads
以下の環境においてtrue.
  • Chrome: 21以上
  • Firefox(Gecko): 29以上
  • Opera: 15以上

目次に戻る

Snp_NavLanguages

以下のJavascriptコードを実行した結果である.
!!window.navigator.languages
以下の環境においてtrue.
  • Chrome: 32以上
  • Firefox(Gecko): 32以上

目次に戻る

Snp_NavMediaDevices

以下のJavascriptコードを実行した結果である.
!!window.navigator.mediaDevices
以下の環境においてtrue.
  • Chrome: 51以上
  • Firefox(Gecko): 36以上

目次に戻る

Snp_WinCaches

以下のJavascriptコードを実行した結果である.
!!window.caches
以下の環境においてtrue.
  • Chrome: 43以上
  • Firefox(Gecko): 39以上

目次に戻る

Snp_CreateImageBitmap

以下のJavascriptコードを実行した結果である.
!!window.createImageBitmap
以下の環境においてtrue.
  • Chrome: 50以上
  • Firefox(Gecko): 42以上

目次に戻る

Snp_Onstorage

以下のJavascriptコードを実行した結果である.
typeof window.onstorage!='undefined'
以下の環境においてtrue.
  • 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
Operaの古いVersionではそのRendering EngineはPrestoと呼ばれていた. Opera12.16以前ではこれがtrueとなる.
目次に戻る

Snp_LtChrome14

以下のJavascriptコードを実行した結果です。
!!window.chrome && typeof window.chrome.webstore!='undefined'
かつてはChromeであるか否かを示す定石コードでした。 ただしChrome Version14以降からVersion70までが対象です。 Chrome Version71以降は window.chrome.webstore のサポートが廃止されたため、この値は全体としてfalseになります。
前半の!!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となります)。

これは筆者の手元にある比較的古い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以上

解説

まず参考のため、ブラウザ解析においてよく登場する以下のコードを掲載しておきます (上記のコードとよく似ていますが、一番最初の「!」の部分の個数が異なります)。

!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:
none image

K.Yakisoba.H

@znk project