/*
* Copyright (C) 2012-2016 NS Solutions Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* hifive
*/
/* ------ h5.env ------ */
(function() {
// =========================================================================
//
// Constants
//
// =========================================================================
// =============================
// Production
// =============================
// =============================
// Development Only
// =============================
/* del begin */
/* del end */
// =========================================================================
//
// Cache
//
// =========================================================================
// =========================================================================
//
// Privates
//
// =========================================================================
// =============================
// Variables
// =============================
// =============================
// Functions
// =============================
function check(ua) {
/**
* iPhoneであるかどうかを表します。 Chrome For iOS など、標準ブラウザでなくてもiPhoneであれば、trueです。
*
* @name isiPhone
* @type Boolean
* @memberOf h5.env.ua
*/
var isiPhone = !!ua.match(/iPhone/i);
/**
* iPadであるかどうかを表します。 Chrome For iOS など、標準ブラウザでなくてもiPhoneであれば、trueです。
*
* @name isiPad
* @type Boolean
* @memberOf h5.env.ua
*/
var isiPad = !!ua.match(/iPad/i);
/**
* iOSであるかどうかを表します。 isiPhoneまたはisiPadがtrueであればtrueです。
*
* @name isiOS
* @type Boolean
* @memberOf h5.env.ua
*/
var isiOS = isiPhone || isiPad;
/**
* Androidであるかどうかを表します。 Androidであれば標準ブラウザでなくても、trueです。
*
* @name isAndroid
* @type Boolean
* @memberOf h5.env.ua
*/
var isAndroid = !!ua.match(/android/i);
/**
* Windows Phoneであるかどうかを表します。
*
* @name isWindowsPhone
* @type Boolean
* @memberOf h5.env.ua
*/
var isWindowsPhone = !!ua.match(/Windows Phone/i);
/**
* ブラウザがMicrosoft Edgeであるかどうかを表します。
*
* @name isEdge
* @type Boolean
* @memberOf h5.env.ua
*/
var isEdge = !!ua.match(/Edge/);
/**
* ブラウザがInternet Explorerであるかどうかを表します。
*
* @name isIE
* @type Boolean
* @memberOf h5.env.ua
*/
var isIE = !!ua.match(/MSIE/) || !!ua.match(/Trident/);
/**
* ブラウザがFirefoxであるかどうかを表します。 モバイル端末のFirefoxでもtrueです。
*
* @name isFirefox
* @type Boolean
* @memberOf h5.env.ua
*/
var isFirefox = !!ua.match(/Firefox/i);
/**
* ブラウザがGoogle Chromeであるかどうかを表します。 Chromeモバイル、Chrome iOS の場合もtrueです。<br />
* 以下の文字列が含まれる場合にtrueになります。<br />
* <ul>
* <li>Chrome (Chrome for Android / Desktop)</li>
* <li>CrMo (Chrome for Android)</li>
* <li>CriOS (Chrome for iOS)</li>
* </ul>
*
* @name isChrome
* @type Boolean
* @memberOf h5.env.ua
*/
var isChrome = (!isEdge && !!ua.match(/Chrome/i)) || !!ua.match(/CrMo/)
|| !!ua.match(/CriOS/);
/**
* ブラウザがSafariであるかどうかを表します。 iOSのSafariの場合もtrueです。
*
* @name isSafari
* @type Boolean
* @memberOf h5.env.ua
*/
var isSafari = !isEdge && !isAndroid && !isChrome && !!ua.match(/Safari/i);
/**
* レンダリングエンジンがWebkitであるかどうかを表します。
*
* @name isWebkit
* @type Boolean
* @memberOf h5.env.ua
*/
var isWebkit = !isEdge && !!ua.match(/Webkit/i);
/**
* ブラウザがOperaであるかどうかを表します。 モバイル、iOSのOperaの場合もtrueです。
*
* @name isOpera
* @type Boolean
* @memberOf h5.env.ua
*/
var isOpera = !!ua.match(/Opera/i);
/**
* ブラウザがAndroid標準ブラウザであるかどうかを表します。
*
* @name isAndroidDefaultBrowser
* @type Boolean
* @memberOf h5.env.ua
*/
var isAndroidDefaultBrowser = isAndroid && !!ua.match(/Safari/i) && !isChrome;
/**
* スマートフォンであるかどうかを表します。<br />
* isiPhone, isWindowsPhoneがtrueならtrueとなります。<br />
* Androidの場合、判定は以下の場合にtrueとなります。
* <ul>
* <li>Android標準ブラウザ、かつユーザーエージェントに"Mobile"を含む、かつ"SC-01C"を含まない。 </li>
* <li>ユーザーエージェントに"Fennec"を含む。</li>
* <li>ユーザーエージェントに"Opera Mobi"を含む。</li>
* </ul>
*
* @name isSmartPhone
* @type Boolean
* @memberOf h5.env.ua
*/
var isSmartPhone = !!(isiPhone || isWindowsPhone
|| (isAndroidDefaultBrowser && ua.match(/Mobile/) && !ua.match(/SC-01C/))
|| (isAndroid && isChrome && ua.match(/Mobile/)) || ua.match(/Fennec/i) || ua
.match(/Opera Mobi/i));
/**
* タブレットであるかどうかを表します。<br />
* isiPadがtrueならtrueとなります。<br />
* Androidの場合、判定は以下の場合にtrueとなります。
* <ul>
* <li>Android標準ブラウザ、かつユーザーエージェントに"Mobile"を含まない。ただし"SC-01C"を含む場合はtrue。 </li>
* <li>ユーザーエージェントに"Fennec"を含む。</li>
* <li>ユーザーエージェントに"Opera Tablet"を含む。</li>
* </ul>
*
* @name isTablet
* @type Boolean
* @memberOf h5.env.ua
*/
var isTablet = !!(isiPad || (isAndroidDefaultBrowser && !ua.match(/Mobile/))
|| (isAndroid && isChrome && !ua.match(/Mobile/)) || ua.match(/SC-01C/)
|| ua.match(/Fennec/i) || ua.match(/Opera Tablet/i));
/**
* PCであるかどうかを表します。 isSmartPhoneとisTabletがいずれもfalseの場合にtrueです。
*
* @name isDesktop
* @type Boolean
* @memberOf h5.env.ua
*/
var isDesktop = !isSmartPhone && !isTablet;
/**
* OSのバージョンを表します。<br />
* h5.env.ua.isDesktopがtrueである場合、値はnullになります。
*
* @name osVersion
* @type Number
* @memberOf h5.env.ua
*/
var osVersion = null;
/**
* OSのフルバージョンを表します。<br />
* h5.env.ua.isDesktopがtrueである場合、値はnullになります。
*
* @name osVersionFull
* @type String
* @memberOf h5.env.ua
*/
var osVersionFull = null;
var getiOSVersion = function(pre, post) {
return $.trim(ua.substring(ua.indexOf(pre) + pre.length, ua.indexOf(post))).split('_');
};
var getVersion = function(target, end, ignoreCase) {
var r = ignoreCase === false ? new RegExp(target + end) : new RegExp(target + end, 'i');
return $.trim(ua.match(r));
};
function spaceSplit(target, ignoreCase) {
var v = getVersion(target, '[^;)]*', ignoreCase).split(' ');
if (v.length === 1)
return '';
return v[v.length - 1];
}
function slashSplit(target, ignoreCase) {
var v = getVersion(target, '[^;) ]*', ignoreCase).split('/');
if (v.length === 1)
return '';
return v[v.length - 1];
}
function colonSplit(target, ignoreCase) {
var v = getVersion(target, '[^;) ]*', ignoreCase).split(':');
if (v.length === 1)
return '';
return v[v.length - 1];
}
var getMainVersion = function(target) {
return parseInt(target.split('.')[0]);
};
if (isiPhone) {
var s = getiOSVersion('iPhone OS', 'like');
osVersion = parseInt(s[0]);
osVersionFull = s.join('.');
} else if (isiPad) {
var s = getiOSVersion('CPU OS', 'like');
osVersion = parseInt(s[0]);
osVersionFull = s.join('.');
} else if (isAndroid && isFirefox) {
// FennecはAndroidのバージョンを取得することができない。
} else if (isAndroid) {
var s = spaceSplit('Android');
osVersion = getMainVersion(s);
osVersionFull = s;
} else if (isWindowsPhone) {
var s = spaceSplit('Windows Phone OS');
if (!s) {
s = spaceSplit('Windows Phone');
}
osVersion = getMainVersion(s);
osVersionFull = s;
}
// Operaのuaに'MSIE'が入っているとき用に、isIE && isOperaならisIEをfalseにする
if (isIE && isOpera) {
isIE = false;
}
// デスクトップの場合。osVersion, osVersionFullはnull
/**
* ブラウザのバージョンを表します。
*
* @name browserVersion
* @type Number
* @memberOf h5.env.ua
*/
var browserVersion = null;
/**
* ブラウザのフルバージョンを表します。
*
* @name browserVersionFull
* @type String
* @memberOf h5.env.ua
*/
var browserVersionFull = null;
if (isiOS || (isAndroid && isAndroidDefaultBrowser)) {
browserVersion = osVersion;
browserVersionFull = osVersionFull;
} else {
var version = null;
if (isIE) {
version = spaceSplit('MSIE', false) || colonSplit('rv');
} else if (isChrome) {
version = slashSplit('Chrome', false);
if (!version) {
version = slashSplit('CrMo', false);
}
} else if (isSafari) {
version = slashSplit('Version');
} else if (isFirefox) {
version = slashSplit('Firefox');
} else if (isOpera) {
version = slashSplit('Version');
if (!version) {
version = slashSplit('Opera');
}
if (!version) {
version = spaceSplit('Opera');
}
} else if (isEdge) {
version = slashSplit('Edge');
}
if (version) {
browserVersion = getMainVersion(version);
browserVersionFull = version;
}
}
return {
osVersion: osVersion,
osVersionFull: osVersionFull,
browserVersion: browserVersion,
browserVersionFull: browserVersionFull,
isiPhone: isiPhone,
isiPad: isiPad,
isiOS: isiOS,
isAndroid: isAndroid,
isWindowsPhone: isWindowsPhone,
isIE: isIE,
isFirefox: isFirefox,
isChrome: isChrome,
isSafari: isSafari,
isOpera: isOpera,
isEdge: isEdge,
isAndroidDefaultBrowser: isAndroidDefaultBrowser,
isSmartPhone: isSmartPhone,
isTablet: isTablet,
isDesktop: isDesktop,
isWebkit: isWebkit
};
}
// =========================================================================
//
// Body
//
// =========================================================================
// =============================
// Expose to window
// =============================
/**
* @namespace
* @name env
* @memberOf h5
*/
/**
* ユーザーエージェントからOS、ブラウザを判別します。<br />
* 例えば、iPhoneのSafariかどうかを判別したい場合は、<br />
* <br />
* h5.env.ua.isiPhone && h5.env.ua.isSafari<br />
* <br />
* で判別することができます。<br />
* <br />
* 機能の有無を判別したい場合は、基本的にはこれらのプロパティを使わず、機能の有無でチェックしてください。<br />
* 例えば『Geolocationが使えるか』を判別したい場合、h5.api.geo.isSupportedで判別できます。<br />
*
* @namespace
* @name ua
* @memberOf h5.env
*/
h5.u.obj.expose('h5.env', {
ua: check(navigator.userAgent)
});
/* del begin */
// テストのためにグローバルに公開。プリプロセッサで削除される。
h5.u.obj.expose('h5.env', {
__check: check
});
/* del end */
})();