* @type {boolean}\r
*/\r
X_UA[ 'iPhone_4s' ] = true;\r
+ \r
+ if( i ){\r
+ /**\r
+ * iPhone3GS以下\r
+ * @alias X.UA.iPhone_3GS\r
+ * @type {boolean}\r
+ */\r
+ X_UA[ 'iPhone_3GS' ] = true;\r
+ }; \r
};\r
- if( v && i ){\r
- /**\r
- * iPhone3GS以下\r
- * @alias X.UA.iPhone_3GS\r
- * @type {boolean}\r
- */\r
- X_UA[ 'iPhone_3GS' ] = true;\r
- };\r
+\r
//alert( 'iPhone ' + ( X_UA[ 'iPhone_3GS' ] ? '3GS以下' : X_UA[ 'iPhone_4s' ] ? '4s以下' : '5以上' ) );\r
};\r
if( sys === 'iPad' ){\r
* @type {boolean}\r
*/\r
X_UA[ 'iPod' ] = true;\r
- if( v && i ){\r
- /**\r
- * iPod3以下\r
- * @alias X.UA.iPod_3\r
- * @type {boolean}\r
- */\r
- X_UA[ 'iPod_3' ] = true;\r
- };\r
+\r
if( v ){\r
/**\r
* iPod4以下\r
* @type {boolean}\r
*/\r
X_UA[ 'iPod_4' ] = true;\r
+ \r
+ if( i ){\r
+ /**\r
+ * iPod3以下\r
+ * @alias X.UA.iPod_3\r
+ * @type {boolean}\r
+ */\r
+ X_UA[ 'iPod_3' ] = true;\r
+ }; \r
};\r
//alert( 'iPod touch ' + ( X_UA[ 'iPod_3' ] ? '3以下' : X_UA[ 'iPod_4' ] ? '4以下' : '5以上' ) );\r
};\r
X_UA[ 'webOS' ] = true; // webOS\r
} else\r
if( sys.indexOf( 'Win' ) + 1 ){\r
- console.log( 'Win' );\r
- /**\r
- * @alias X.UA.Windows\r
- * @type {boolean}\r
- */\r
- X_UA[ 'Windows' ] = true;\r
+\r
switch( sys ){\r
+ case 'WinCE' :\r
+ /**\r
+ * @alias X.UA.WinCE\r
+ * @type {boolean}\r
+ */\r
+ X_UA[ sys ] = true;\r
+ break;\r
case 'Win16' :\r
case 'Win32' :\r
case 'Win64' :\r
- case 'WinCE' :\r
/**\r
* @alias X.UA.Win16\r
* @alias X.UA.Win32\r
* @alias X.UA.Win64\r
- * @alias X.UA.WinCE\r
* @type {boolean}\r
*/\r
X_UA[ sys ] = true;\r
+ \r
+ if( v = dav.split( 'Windows NT 10' )[ 1 ] ){\r
+ switch( v.substr( 0, 2 ) ){\r
+ case '.0' : v = 10; break;\r
+ default : v = '?';\r
+ };\r
+ } else\r
+ if( v = dav.split( 'Windows NT ' )[ 1 ] ){\r
+ switch( v.substr( 0, 3 ) ){\r
+ case '6.3' : v = 8.1; break;\r
+ case '6.2' : v = 8; break;\r
+ case '6.1' : v = 7; break;\r
+ case '6.0' : v = 'Vista'; break;\r
+ case '5.2' : v = '2003|XP64'; break;\r
+ case '5.1' : v = v.indexOf( '5.1; SV1' ) ? 'XP' : 'XPSP2'; break;\r
+ case '5.0' : v = v.indexOf( '5.01' ) ? 2000 : '2kSP1'; break;\r
+ case '4.0' : v = 'NT'; break;\r
+ default : v = '?';\r
+ }; \r
+ } else\r
+ if( v = dav.split( 'Windows ' )[ 1 ] ){\r
+ switch( v.substr( 0, 2 ) ){\r
+ case '98' : v = v.indexOf( '98; Win 9x 4.90' ) ? '98|98SE' : 'ME'; break;\r
+ case '95' : v = 95; break;\r
+ case '3.' : v = parseFloat( v ); break;\r
+ default : v = '?';\r
+ }; \r
+ } else {\r
+ v = '?';\r
+ };\r
+ \r
+ /**\r
+ * 10, 8.1, 8, 7, Vista, 2003|XP64, XPSP2, XP, 2kSP1, 2000, ME, 98|98SE, 95, ?\r
+ * @alias X.UA.Windows\r
+ * @type {number|string}\r
+ */ \r
+ X_UA[ 'Windows' ] = v;\r
+ break;\r
};\r
+\r
// winRT\r
} else\r
if( sys.indexOf( 'Mac' ) + 1 ){\r
*/\r
X_UA[ 'Linux' ] = true;\r
\r
- if( ( i = dua.indexOf( 'Android' ) ) !== -1 ){\r
+ if( dua.indexOf( 'Android ' ) !== -1 ){\r
+ v = dua.split( 'Android ' )[ 1 ].split( '.' );\r
+ /**\r
+ * @alias X.UA.AndroidMajor\r
+ * @type {number}\r
+ */\r
+ X_UA[ 'AndroidMajor' ] = parseFloat( v[ 0 ] ) || 0;\r
+ /**\r
+ * @alias X.UA.AndroidMinor\r
+ * @type {number}\r
+ */\r
+ X_UA[ 'AndroidMinor' ] = parseFloat( v[ 1 ] ) || 0;\r
+ /**\r
+ * @alias X.UA.AndroidPatch\r
+ * @type {number}\r
+ */\r
+ X_UA[ 'AndroidPatch' ] = parseFloat( v[ 2 ] ) || 0;\r
/**\r
* Firefox で Version が取れない!\r
* http://bizmakoto.jp/bizid/articles/1207/31/news004.html\r
* @alias X.UA.Android\r
* @type {number}\r
*/\r
- X_UA[ 'Android' ] = parseFloat( dua.substr( i + 8 ) ) || 0.1;\r
+ X_UA[ 'Android' ] = X_UA[ 'AndroidMajor' ] + X_UA[ 'AndroidMinor' ] / 10;\r
console.log( '>> Android : ' + X_UA[ 'Android' ] );\r
};\r
};\r
* @type {number}\r
*/\r
X_UA[ 'Trident' ] = parseFloat(dav.split('Trident/')[1]) || 0;\r
+ \r
+ tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ];\r
/**\r
- * documentモードを考慮したIEのバージョン\r
- * @alias X.UA.IE\r
+ * IE10 以上の互換モードを使用している場合、そのバージョン\r
+ * @alias X.UA.IEHost\r
* @type {number}\r
*/\r
- X_UA[ 'IE' ] = v = document.documentMode || X_UA[ '_IE' ];\r
- tridentToVer = X_UA[ 'Trident' ] ? ( X_UA[ 'Trident' ] + 4 | 0 ) : X_UA[ '_IE' ];\r
+ if( tridentToVer !== X_UA[ '_IE' ] ) X_UA[ 'IEHost' ] = tridentToVer;\r
/**\r
- * IE10 以上の互換モードを使用している場合、そのバージョン\r
- * @alias X.UA.IECompat\r
+ * documentモードを考慮したIEのバージョン\r
+ * @alias X.UA.IE\r
* @type {number}\r
*/\r
- if( v = tridentToVer !== X_UA[ '_IE' ] && tridentToVer ) X_UA[ 'IECompat' ] = v;\r
+ X_UA[ 'IE' ] = v = document.documentMode || tridentToVer;\r
/**\r
* @alias X.UA.IE4\r
* @type {boolean}\r
*/\r
if( dua.toLowerCase().indexOf( 'windows phone' ) !== -1 || 0 < dav.indexOf( 'ZuneWP' ) ) X_UA[ 'WinPhone' ] = true; // ZuneWP は IEM のデスクトップモードで登場する\r
\r
- console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] );\r
+ console.log( '>> IE : ' + v + ' ActiveX : ' + X_UA[ 'ActiveX' ] + ' IEHost : ' + X_UA[ 'IEHost' ] );\r
// TODO XBox360, XBox1, Modern or Desktop, Standalone\r
return;\r
};\r
console.log( '>> Gecko : ' + X_UA[ 'Gecko' ] );\r
};\r
\r
+ if( ( dua.indexOf( 'Linux; U; Android ' ) !== -1 || dua.indexOf( 'Linux; Android ' ) !== -1 ) &&\r
+ ( dua.indexOf( 'Chrome\/' ) === -1 || dua.indexOf( 'Version\/' ) !== -1 ) ){ // Chrome/ を含まない または Version/ を含む\r
+ \r
+ /* if( window.chrome ){ // Android3.1 のAOSPブラウザで .chrome がいた、、、\r
+ //X_UA[ 'Blink' ] = X_UA[ 'ChromeWK' ] = tv;\r
+ } else */\r
+ if( dua.indexOf( 'Version\/' ) === -1 && ( v = parseFloat( dua.split( 'Chrome\/' )[ 1 ] ) ) ){\r
+ /**\r
+ * Android 標準ブラウザ Chrome Webkit ラップブラウザ\r
+ * @alias X.UA.ChromeWK\r
+ * @type {number}\r
+ */ \r
+ X_UA[ 'ChromeWK' ] = v;\r
+ } else\r
+ // http://uupaa.hatenablog.com/entry/2014/04/15/163346\r
+ // Chrome WebView は Android 4.4 の時点では WebGL や WebAudio など一部の機能が利用できません(can i use)。\r
+ // また UserAgent が書き換え可能なため、旧来のAOSPブラウザの UserAgent を偽装した形で配布されているケースがあります。\r
+ // http://caniuse.com/#compare=chrome+40,android+4.2-4.3,android+4.4,android+4.4.3-4.4.4,and_chr+45\r
+ // CustomElement の有無で判定\r
+ if( document[ 'registerElement' ] ){\r
+ // UA が偽装された ChromeWK\r
+ X_UA[ 'ChromeWK' ] = tv;\r
+ alert( 'UA が偽装された Chrome Webkit' );\r
+ } else {\r
+ /**\r
+ * Android 標準ブラウザ AOSP\r
+ * @alias X.UA.AOSP\r
+ * @type {number}\r
+ */\r
+ X_UA[ 'AOSP' ] = X_UA[ 'Android' ]; \r
+ };\r
+ \r
+ i = parseFloat( dua.split( 'WebKit\/' )[ 1 ] );\r
+ /**\r
+ * @alias X.UA.AndroidWebkit\r
+ * @type {number}\r
+ */\r
+ X_UA[ 'AndroidWebkit' ] = i;\r
+ //alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i );\r
+ \r
+ /*\r
+ * http://www.flexfirm.jp/blog/article/402\r
+ * Sブラウザ\r
+ * SC-04E、SC-01F、SC-02F、 SC-04F、SCL22、SCL23など\r
+ */\r
+ } else\r
+ \r
// TODO Blink\r
if( window.chrome ){\r
/**\r
* @alias X.UA.Blink\r
* @type {number}\r
*/\r
- X_UA[ 'Blink' ] = tv;\r
+ X_UA[ 'Blink' ] = parseFloat( dua.split( 'Chrome/' )[ 1 ] );\r
+ \r
+ if( v = parseFloat( dua.split( 'OPR/' )[ 1 ] ) ){\r
+ /**\r
+ * @alias X.UA.BlinkOpera\r
+ * @type {number}\r
+ */\r
+ X_UA[ 'BlinkOpera' ] = v;\r
+ };\r
console.log( '>>Blink : ' + X_UA[ 'Blink' ] );\r
\r
} else\r
console.log( '>>Khtml : ' + X_UA[ 'Khtml' ] );\r
\r
} else\r
- if( ( i = dua.indexOf( 'Android ' ) ) !== -1 ){\r
- /**\r
- * Android 標準ブラウザ\r
- * @alias X.UA.AndroidBrowser\r
- * @type {number}\r
- */\r
- X_UA[ 'AndroidBrowser' ] = i = parseFloat( dua.substr( i + 8 ) ) || 0.1;\r
- /**\r
- * @alias X.UA.AndroidBrowser1\r
- * @type {boolean}\r
- */\r
- X_UA[ 'AndroidBrowser1' ] = 1 <= i && i < 2;\r
- /**\r
- * @alias X.UA.AndroidBrowser2\r
- * @type {boolean}\r
- */\r
- X_UA[ 'AndroidBrowser2' ] = 2 <= i && i < 3;\r
- /**\r
- * @alias X.UA.AndroidBrowser3\r
- * @type {boolean}\r
- */\r
- X_UA[ 'AndroidBrowser3' ] = 3 <= i && i < 4;\r
- /**\r
- * @alias X.UA.AndroidBrowser4\r
- * @type {boolean}\r
- */\r
- X_UA[ 'AndroidBrowser4' ] = 4 <= i && i < 5;\r
- /**\r
- * @alias X.UA.AndroidBrowser5\r
- * @type {boolean}\r
- */\r
- X_UA[ 'AndroidBrowser5' ] = 5 <= i && i < 6;\r
- console.log( '>> AndroidBrowser : ' + X_UA[ 'Android' ] );\r
- \r
- i = parseFloat(dua.split('WebKit\/')[1]);\r
- /**\r
- * @alias X.UA.AndroidBrowserWebkit\r
- * @type {number}\r
- */\r
- X_UA[ 'AndroidBrowserWebkit' ] = i;\r
- alert( 'AudioSprite調査:Android標準ブラウザ Webkit Version ' + i );\r
- \r
- } else\r
+ \r
if( i = parseFloat(dua.split('WebKit\/')[1]) ){\r
/**\r
* @alias X.UA.WebKit\r
} else {\r
X_UA_EVENT.DOM0 = true;\r
};\r
-} else\r
-if( document.layers ){\r
- \r
-} else {\r
- \r
};\r
\r
if( navigator.msPointerEnabled || navigator.pointerEnabled ) X_UA_HID.POINTER = true;\r
X_UA[ 'ieExeComError' ] = eval( 'var a=1;try{document.execCommand&&document.execCommand("BackgroundImageCache",!1,!0)}catch(e){a=0}!a' );\r
})();\r
\r
- X_UA[ 'ieExeComError' ] && alert( 'document.execCommand error!' );\r
+ //X_UA[ 'ieExeComError' ] && alert( 'document.execCommand error!' );\r
};\r
\r
/*\r