Web標準普及プロジェクト

ブラウザ判別では"Gecko"を調べてください

JavaScriptの互換性検査においてはブラウザ判別とオブジェクト検出にあるように、 オブジェクトの有無によって判定するのが一番確実です。 しかし、CSSの互換性等をJavaScriptで無理矢理切り分ける場合等にはこの手法は使えないので、 その場合はブラウザの種類とバージョンを検査しなくてはいけません。

Mozilla/Netscapeは区別せず、Geckoブラウザ

MozillaやNetscape6/7は共に同じGeckoというレンダリングエンジンを使っていて、 Webページの表示性能は(バージョンの差によるものを除けば)全く同じです(バグも)。 そしてこのことはGeckoエンジンを使用する他のブラウザにも当てはまります。 例えばMozilla Firebird(旧Phoenix)やCamino(旧Chimera)等です。

このようなGeckoエンジンでWebページの表示を行うブラウザをGeckoブラウザと呼びます。 これらGeckoブラウザは上記以外にも存在しますし、今後も増える可能性があります。 ですから、従来のようにブラウザ(のブランド)ごとに処理を切り分けることは困難で合理的ではありません。

しかし、表示に関する問題回避のためにブラウザ判定を行う場合であれば、 わざわざブラウザごとに条件を作らなくても、共通点であるGeckoブラウザであるかどうかを判定すれば良いと言えます。

そうすれば、Geckoブラウザであるか否かを判定することによって、あなたの知らない未知のWebブラウザにも対応することができます。 これはWindowsにおける様々なIEコンポーネントブラウザに対していちいちブラウザ判定を行わなくてもWindows版IEに対応できていれば良いのと同じことです。

Geckoブラウザの出力するユーザーエージェント名

次の例にあるようにGeckoブラウザはユーザーエージェント名にGeckoという名前を刻んでいます。 つまりGeckoという文字列が含まれるか否かによってGeckoエンジンを使用したGeckoブラウザかどうかを判定できます。

Mozilla Nightly Build(2002年12月22日)

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3b) Gecko/20021222

Phoenix 0.5(現Mozilla Firebird)

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3a) Gecko/20021207 Phoenix/0.5

Chimera(現Camino)

Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.0.1) Gecko/20021220 Chimera/0.6+

Mozilla 1.0

Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.0) Gecko/20020530

Netscape7.01

Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP; rv:1.0.2) Gecko/20021120 Netscape/7.01

Netscape6.2.2

Mozilla/5.0 (Windows; U; Windows NT 5.0; ja-JP; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2

Geckoブラウザの判定関数

Geckoブラウザか否かを判定するJavascript関数とそのサンプルです。 IsGecko関数はユーザーエージェント名にGeckoが含まれていればtrueを返します。 なお、これらのコードは自由に使用・改変・再配布していただいてかまいません。

Mac用のブラウザである"safari"(Konqueror)がGeckoブラウザと誤認されるように偽装していることが、 先日公開されたベータ版から判明しました。

対応策として調べる文字列を"Gecko"から"Gecko/"に変更しています。 詳細は次のバグをご覧ください。 [Bug 2917]

function IsGecko(){
    if(navigator){
        if(navigator.userAgent){
            if(navigator.userAgent.indexOf("Gecko/") != -1){
                return true;
            }
        }
    }
    return false;
}

次のサンプルは1.0より古い開発中のGeckoブラウザか、1.0以降のGeckoブラウザかの判定は次の関数を使えば判定できます。

function IsGeckoOne(){
    if(IsGecko()){
        if(navigator.userAgent.indexOf("rv:1.") != -1){
            return true;
        }
    }
    return false;
}

次のサンプルは1.0branchビルドかtrunkビルドかを見分けるものです。 Mozilla1.0以降は開発版の1.xと、安定版の1.0.xとに分かれます。 Netscapeは後者、Mozilla Firebirdは前者、一般的にMozillaそのものを使っている人も前者のようです。

function IsGeckoTrunk(){
    if(IsGecko()){
        if(navigator.userAgent.indexOf("rv:1.") != -1 
            && navigator.userAgent.indexOf("rv:1.0") == -1){
            return true;
        }
    }
    return false;
}

使い方

これら3つの関数は次のように使えば良いでしょう。

if(IsGecko()){
    //Geckoブラウザ
    if(IsGeckoOne()){
        //Mozilla1.0.0rc1以降のGeckoブラウザ
        if(IsGeckoTrunk()){
            //Mozilla1.x
        }else{
            //Mozilla1.0.x
        }
    }else{
        //M16以降、Mozilla0.9.9までのGeckoブラウザ
    }
}else{
    //Gecko以外のブラウザ(M15以前のGeckoブラウザ含む)
}

IsGeckoOne関数とIsGeckoTrunk関数の使う順番に注意してください。

これらのロジックはCGI等にも応用できます

これらの判別手法はCGI等のサーバサイドのプログラムでも環境変数のユーザーエージェント名を同様に扱うことで利用できますので是非利用してください。

補足1

この記事を書いている2002年12月現在ではMozilla/5.0という文字でもGeckoブラウザであると判別できますが、 過去の経緯から考えると、将来の他のブラウザもMozilla/5.0と名乗る可能性が高いのでGeckoを使うべきでしょう。

補足2

M15以前のかなり古いビルドではGeckoという文字はユーザーエージェント名に含まれていません。 そのためにIsGecko関数はfalseを返します。 しかし、このような不安定な(実用レベルには至っていない)ビルドが現在使用されている確率は極めて低いので問題はありません。 M16以降ならGecko、ビルド日付共に入っています。

おそらく、現在使われている可能がある最も古いビルドはNetscape6.0のベースであるMozilla0.6でしょう。 これはM18の次に出たバージョンですが、これもゼロに近い使用率と思われます。

ちなみに現在の形式のユーザーエージェント名を持つ最古のGeckoエンジンは次のものです。

Mozilla M16

Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; m16) Gecko/20000613