From 00a043f1e16b01564b3113f58c6603af6a81309a Mon Sep 17 00:00:00 2001 From: Gary Katsevman Date: Wed, 26 Jun 2013 15:05:50 -0700 Subject: [PATCH] Close GH-470: Augment userAgent detection. --- src/js/lib.js | 36 +++++++++++++++++++++++++++--------- src/js/media/html5.js | 12 ++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/js/lib.js b/src/js/lib.js index c04558a25e..fde276e1b9 100644 --- a/src/js/lib.js +++ b/src/js/lib.js @@ -304,9 +304,9 @@ vjs.USER_AGENT = navigator.userAgent; * @type {Boolean} * @constant */ -vjs.IS_IPHONE = !!vjs.USER_AGENT.match(/iPhone/i); -vjs.IS_IPAD = !!vjs.USER_AGENT.match(/iPad/i); -vjs.IS_IPOD = !!vjs.USER_AGENT.match(/iPod/i); +vjs.IS_IPHONE = (/iPhone/i).test(vjs.USER_AGENT); +vjs.IS_IPAD = (/iPad/i).test(vjs.USER_AGENT); +vjs.IS_IPOD = (/iPod/i).test(vjs.USER_AGENT); vjs.IS_IOS = vjs.IS_IPHONE || vjs.IS_IPAD || vjs.IS_IPOD; vjs.IOS_VERSION = (function(){ @@ -314,16 +314,34 @@ vjs.IOS_VERSION = (function(){ if (match && match[1]) { return match[1]; } })(); -vjs.IS_ANDROID = !!vjs.USER_AGENT.match(/Android.*AppleWebKit/i); +vjs.IS_ANDROID = (/Android/i).test(vjs.USER_AGENT); vjs.ANDROID_VERSION = (function() { - var match = vjs.USER_AGENT.match(/Android (\d+)\./i); - if (match && match[1]) { - return match[1]; + // This matches Android Major.Minor.Patch versions + // ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned + var match = vjs.USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i), + major, + minor; + + if (!match) { + return null; + } + + major = match[1] && parseFloat(match[1]); + minor = match[2] && parseFloat(match[2]); + + if (major && minor) { + return parseFloat(match[1] + '.' + match[2]); + } else if (major) { + return major; + } else { + return null; } - return null; })(); +// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser +vjs.IS_OLD_ANDROID = vjs.IS_ANDROID && (/webkit/i).test(vjs.USER_AGENT) && vjs.ANDROID_VERSION < 2.3; -vjs.IS_FIREFOX = function(){ return !!vjs.USER_AGENT.match('Firefox'); }; +vjs.IS_FIREFOX = (/Firefox/i).test(vjs.USER_AGENT); +vjs.IS_CHROME = (/Chrome/i).test(vjs.USER_AGENT); /** diff --git a/src/js/media/html5.js b/src/js/media/html5.js index 2f2fb9f137..24ecbbca36 100644 --- a/src/js/media/html5.js +++ b/src/js/media/html5.js @@ -229,13 +229,9 @@ vjs.Html5.Events = 'loadstart,suspend,abort,error,emptied,stalled,loadedmetadata // HTML5 Feature detection and Device Fixes --------------------------------- // -// Android -if (vjs.IS_ANDROID) { - // Override Android 2.2 and less canPlayType method which is broken - if (vjs.ANDROID_VERSION < 3) { - document.createElement('video').constructor.prototype.canPlayType = function(type){ - return (type && type.toLowerCase().indexOf('video/mp4') != -1) ? 'maybe' : ''; - }; - } +if (vjs.IS_OLD_ANDROID) { + document.createElement('video').constructor.prototype.canPlayType = function(type){ + return (type && type.toLowerCase().indexOf('video/mp4') != -1) ? 'maybe' : ''; + }; }