From f2164771a771e94409cbf147c167dcbb5af39d8e Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Fri, 14 Mar 2014 20:25:31 +0000 Subject: [PATCH] In `wp.media.mixin`, add `ua` and a `compat` map to separate and clarify browser detection and support. Leverage Underscore list iterators in `isCompatible()`. See #27389. git-svn-id: https://develop.svn.wordpress.org/trunk@27542 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/js/media-editor.js | 119 +++++++++++++++++------------ 1 file changed, 69 insertions(+), 50 deletions(-) diff --git a/src/wp-includes/js/media-editor.js b/src/wp-includes/js/media-editor.js index 1c82c6f54e..ff657bce54 100644 --- a/src/wp-includes/js/media-editor.js +++ b/src/wp-includes/js/media-editor.js @@ -307,69 +307,88 @@ } }, + ua: { + is : function (browser) { + var passes = false, ua = window.navigator.userAgent; + + switch ( browser ) { + case 'oldie': + passes = ua.match(/MSIE [6-8]/gi) !== null; + break; + case 'ie': + passes = ua.match(/MSIE/gi) !== null; + break; + case 'ff': + passes = ua.match(/firefox/gi) !== null; + break; + case 'opera': + passes = ua.match(/OPR/) !== null; + break; + case 'safari': + passes = ua.match(/safari/gi) !== null && ua.match(/chrome/gi) === null; + break; + case 'chrome': + passes = ua.match(/safari/gi) && ua.match(/chrome/gi) !== null; + break; + } + + return passes; + } + }, + + compat :{ + 'opera' : { + audio: ['ogg', 'wav'], + video: ['ogg', 'webm'] + }, + 'chrome' : { + audio: ['ogg', 'mpeg', 'x-ms-wma'], + video: ['ogg', 'webm', 'mp4', 'm4v', 'mpeg'] + }, + 'ff' : { + audio: ['ogg', 'mpeg'], + video: ['ogg', 'webm'] + }, + 'safari' : { + audio: ['mpeg', 'wav'], + video: ['mp4', 'm4v', 'mpeg', 'x-ms-wmv', 'quicktime'] + }, + 'ie' : { + audio: ['mpeg'], + video: ['mp4', 'm4v', 'mpeg'] + } + }, + isCompatible: function ( media ) { if ( ! media.find( 'source' ).length ) { return false; } - var ua = window.navigator.userAgent.toLowerCase(), - ff, chrome, opera, safari, - isIE = ua.match(/MSIE/gi) !== null, - isOpera = window.navigator.userAgent.match(/OPR/) !== null, - isOldIE = ua.match(/MSIE [6-8]/gi) !== null, - isChrome = ua.match(/safari/gi) && ua.match(/chrome/gi) !== null, - isFirefox = ua.match(/firefox/gi) !== null, - isSafari = ua.match(/safari/gi) !== null && ua.match(/chrome/gi) === null; + var ua = this.ua, test = false, found = false, sources; - if ( isOldIE || isIE ) { + if ( ua.is( 'oldIE' ) ) { return false; } - if ( isOpera ) { - opera = false; - media.find( 'source' ).each(function (i, elem) { - if ( elem.type.match(/video\/(ogv|webm)/gi) !== null || - ( elem.type.match(/audio\/(ogg|wav)/gi) !== null ) ) { - opera = true; - } - }); + sources = media.find( 'source' ); - return opera; - } else if ( isChrome ) { - chrome = false; - media.find( 'source' ).each(function (i, elem) { - if ( elem.type.match(/video\/(mp4|m4v|mpeg|webm|ogg)/gi) !== null || - elem.type.match(/audio\/(ogg|mpeg|x-ms-wma)/gi) !== null ) { - chrome = true; - } - }); + _.find( this.compat, function (supports, browser) { + if ( ua.is( browser ) ) { + found = true; + _.each( sources, function (elem) { + var audio = new RegExp( 'audio\/(' + supports.audio.join('|') + ')', 'gi' ), + video = new RegExp( 'video\/(' + supports.video.join('|') + ')', 'gi' ); - return chrome; + if ( elem.type.match( video ) !== null || elem.type.match( audio ) !== null ) { + test = true; + } + } ); + } - } else if ( isFirefox ) { - ff = false; - media.find( 'source' ).each(function (i, elem) { - if ( elem.type.match(/video\/(ogg|webm)/gi) !== null || - ( elem.type.match(/audio\/(ogg|mpeg)/gi) !== null && -1 === elem.src.indexOf('.m4a') ) ) { - ff = true; - } - }); + return test || found; + } ); - return ff; - - } else if ( isSafari ) { - safari = false; - media.find( 'source' ).each(function (i, elem) { - if ( elem.type.match(/video\/(mp4|m4v|mpeg|x-ms-wmv|quicktime)/gi) !== null || - ( elem.type.match(/audio\/(mpeg|wav)/gi) !== null ) ) { - safari = true; - } - }); - - return safari; - } - - return false; + return test; }, /**