Simplify creation of audio, video, and playlist MCE views by placing them in iframe sandboxes.
Wins: * Eliminates duplication of code between PHP and JS * Views can load JS without messing with TinyMCE and scope * MEjs doesn't break when it loads a file plugin-mode. This allows any file type the MEjs supports to play in MCE views. * YouTube now works as the source for video. * Users can still style the views, editor stylesheets are included in these sandboxes. * Audio and Video URLs and `[embed]`s are no longer broken. * Remove the crazy compat code necessary to determine what file types play in what browser. * Remove unneeded Underscore templates. * Remove the compat code for playlists. See #28905. Built from https://develop.svn.wordpress.org/trunk@29179 git-svn-id: http://core.svn.wordpress.org/trunk@28963 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
parent
043715e8a4
commit
93fdff3581
|
@ -104,6 +104,65 @@ window.wp = window.wp || {};
|
||||||
}
|
}
|
||||||
}, this );
|
}, this );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/* jshint scripturl: true */
|
||||||
|
createIframe: function ( content ) {
|
||||||
|
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
|
||||||
|
iframe, iframeDoc, i, resize,
|
||||||
|
dom = tinymce.DOM;
|
||||||
|
|
||||||
|
if ( content.indexOf( '<script' ) !== -1 ) {
|
||||||
|
iframe = dom.create( 'iframe', {
|
||||||
|
src: tinymce.Env.ie ? 'javascript:""' : '',
|
||||||
|
frameBorder: '0',
|
||||||
|
allowTransparency: 'true',
|
||||||
|
scrolling: 'no',
|
||||||
|
style: {
|
||||||
|
width: '100%',
|
||||||
|
display: 'block'
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
this.setContent( iframe );
|
||||||
|
iframeDoc = iframe.contentWindow.document;
|
||||||
|
|
||||||
|
iframeDoc.open();
|
||||||
|
iframeDoc.write(
|
||||||
|
'<!DOCTYPE html>' +
|
||||||
|
'<html>' +
|
||||||
|
'<head>' +
|
||||||
|
'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' +
|
||||||
|
'</head>' +
|
||||||
|
'<body style="padding: 0; margin: 0;" class="' + dom.doc.body.className + '">' +
|
||||||
|
content +
|
||||||
|
'</body>' +
|
||||||
|
'</html>'
|
||||||
|
);
|
||||||
|
iframeDoc.close();
|
||||||
|
|
||||||
|
resize = function() {
|
||||||
|
$( iframe ).height( $( iframeDoc.body ).height() );
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( MutationObserver ) {
|
||||||
|
new MutationObserver( _.debounce( function() {
|
||||||
|
resize();
|
||||||
|
}, 100 ) )
|
||||||
|
.observe( iframeDoc.body, {
|
||||||
|
attributes: true,
|
||||||
|
childList: true,
|
||||||
|
subtree: true
|
||||||
|
} );
|
||||||
|
} else {
|
||||||
|
for ( i = 1; i < 6; i++ ) {
|
||||||
|
setTimeout( resize, i * 700 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.setContent( content );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
setError: function( message, dashicon ) {
|
setError: function( message, dashicon ) {
|
||||||
this.setContent(
|
this.setContent(
|
||||||
'<div class="wpview-error">' +
|
'<div class="wpview-error">' +
|
||||||
|
@ -421,54 +480,60 @@ window.wp = window.wp || {};
|
||||||
wp.mce.av = {
|
wp.mce.av = {
|
||||||
loaded: false,
|
loaded: false,
|
||||||
|
|
||||||
View: _.extend( {}, wp.media.mixin, {
|
View: {
|
||||||
overlay: true,
|
overlay: true,
|
||||||
|
|
||||||
|
action: 'parse-media-shortcode',
|
||||||
|
|
||||||
initialize: function( options ) {
|
initialize: function( options ) {
|
||||||
this.players = [];
|
|
||||||
this.shortcode = options.shortcode;
|
this.shortcode = options.shortcode;
|
||||||
_.bindAll( this, 'setPlayer', 'pausePlayers' );
|
this.fetching = false;
|
||||||
$( this ).on( 'ready', this.setPlayer );
|
|
||||||
$( this ).on( 'ready', function( event, editor ) {
|
_.bindAll( this, 'createIframe', 'setNode', 'fetch' );
|
||||||
editor.on( 'hide', this.pausePlayers );
|
$( this ).on( 'ready', this.setNode );
|
||||||
} );
|
|
||||||
$( document ).on( 'media:edit', this.pausePlayers );
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
setNode: function () {
|
||||||
* Creates the player instance for the current node
|
if ( this.parsed ) {
|
||||||
*
|
this.createIframe( this.parsed );
|
||||||
* @global MediaElementPlayer
|
} else if ( ! this.fetching ) {
|
||||||
*
|
this.fetch();
|
||||||
* @param {Event} event
|
|
||||||
* @param {Object} editor
|
|
||||||
* @param {HTMLElement} node
|
|
||||||
*/
|
|
||||||
setPlayer: function( event, editor, node ) {
|
|
||||||
var self = this,
|
|
||||||
media;
|
|
||||||
|
|
||||||
media = $( node ).find( '.wp-' + this.shortcode.tag + '-shortcode' );
|
|
||||||
|
|
||||||
if ( ! this.isCompatible( media ) ) {
|
|
||||||
media.closest( '.wpview-wrap' ).addClass( 'wont-play' );
|
|
||||||
media.replaceWith( '<p>' + media.find( 'source' ).eq(0).prop( 'src' ) + '</p>' );
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
media.closest( '.wpview-wrap' ).removeClass( 'wont-play' );
|
|
||||||
if ( this.ua.is( 'ff' ) ) {
|
|
||||||
media.prop( 'preload', 'metadata' );
|
|
||||||
} else {
|
|
||||||
media.prop( 'preload', 'none' );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
media = wp.media.view.MediaDetails.prepareSrc( media.get(0) );
|
fetch: function () {
|
||||||
|
var self = this;
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
setTimeout( function() {
|
wp.ajax.send( this.action, {
|
||||||
wp.mce.av.loaded = true;
|
data: {
|
||||||
self.players.push( new MediaElementPlayer( media, self.mejsSettings ) );
|
post_ID: $( '#post_ID' ).val() || 0,
|
||||||
}, wp.mce.av.loaded ? 10 : 500 );
|
type: this.shortcode.tag,
|
||||||
|
shortcode: this.shortcode.string()
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.always( function() {
|
||||||
|
self.fetching = false;
|
||||||
|
} )
|
||||||
|
.done( function( response ) {
|
||||||
|
if ( response ) {
|
||||||
|
self.parsed = response;
|
||||||
|
self.createIframe( response );
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.fail( function( response ) {
|
||||||
|
if ( response && response.message ) {
|
||||||
|
if ( ( response.type === 'not-embeddable' && self.type === 'embed' ) ||
|
||||||
|
response.type === 'not-ssl' ) {
|
||||||
|
|
||||||
|
self.setError( response.message, 'admin-media' );
|
||||||
|
} else {
|
||||||
|
self.setContent( '<p>' + self.original + '</p>', null, 'replace' );
|
||||||
|
}
|
||||||
|
} else if ( response && response.statusText ) {
|
||||||
|
self.setError( response.statusText, 'admin-media' );
|
||||||
|
}
|
||||||
|
} );
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -477,19 +542,12 @@ window.wp = window.wp || {};
|
||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
getHtml: function() {
|
getHtml: function() {
|
||||||
var attrs = this.shortcode.attrs.named;
|
if ( ! this.parsed ) {
|
||||||
attrs.content = this.shortcode.content;
|
return '';
|
||||||
|
}
|
||||||
return this.template({ model: _.defaults(
|
return this.parsed;
|
||||||
attrs,
|
|
||||||
wp.media[ this.shortcode.tag ].defaults )
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
unbind: function() {
|
|
||||||
this.unsetPlayers();
|
|
||||||
}
|
}
|
||||||
} ),
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a TinyMCE view is clicked for editing.
|
* Called when a TinyMCE view is clicked for editing.
|
||||||
|
@ -537,10 +595,7 @@ window.wp = window.wp || {};
|
||||||
* @mixes wp.mce.av
|
* @mixes wp.mce.av
|
||||||
*/
|
*/
|
||||||
wp.mce.views.register( 'video', _.extend( {}, wp.mce.av, {
|
wp.mce.views.register( 'video', _.extend( {}, wp.mce.av, {
|
||||||
state: 'video-details',
|
state: 'video-details'
|
||||||
View: _.extend( {}, wp.mce.av.View, {
|
|
||||||
template: media.template( 'editor-video' )
|
|
||||||
} )
|
|
||||||
} ) );
|
} ) );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -549,10 +604,7 @@ window.wp = window.wp || {};
|
||||||
* @mixes wp.mce.av
|
* @mixes wp.mce.av
|
||||||
*/
|
*/
|
||||||
wp.mce.views.register( 'audio', _.extend( {}, wp.mce.av, {
|
wp.mce.views.register( 'audio', _.extend( {}, wp.mce.av, {
|
||||||
state: 'audio-details',
|
state: 'audio-details'
|
||||||
View: _.extend( {}, wp.mce.av.View, {
|
|
||||||
template: media.template( 'editor-audio' )
|
|
||||||
} )
|
|
||||||
} ) );
|
} ) );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -561,274 +613,34 @@ window.wp = window.wp || {};
|
||||||
* @mixes wp.mce.av
|
* @mixes wp.mce.av
|
||||||
*/
|
*/
|
||||||
wp.mce.views.register( 'playlist', _.extend( {}, wp.mce.av, {
|
wp.mce.views.register( 'playlist', _.extend( {}, wp.mce.av, {
|
||||||
state: ['playlist-edit', 'video-playlist-edit'],
|
state: [ 'playlist-edit', 'video-playlist-edit' ]
|
||||||
View: _.extend( {}, wp.media.mixin, {
|
|
||||||
template: media.template( 'editor-playlist' ),
|
|
||||||
overlay: true,
|
|
||||||
|
|
||||||
initialize: function( options ) {
|
|
||||||
this.players = [];
|
|
||||||
this.data = {};
|
|
||||||
this.attachments = [];
|
|
||||||
this.shortcode = options.shortcode;
|
|
||||||
|
|
||||||
$( this ).on( 'ready', function( event, editor ) {
|
|
||||||
editor.on( 'hide', this.pausePlayers );
|
|
||||||
} );
|
|
||||||
$( document ).on( 'media:edit', this.pausePlayers );
|
|
||||||
|
|
||||||
this.fetch();
|
|
||||||
|
|
||||||
$( this ).on( 'ready', this.setPlaylist );
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asynchronously fetch the shortcode's attachments
|
|
||||||
*/
|
|
||||||
fetch: function() {
|
|
||||||
this.attachments = wp.media.playlist.attachments( this.shortcode );
|
|
||||||
this.dfd = this.attachments.more().done( _.bind( this.render, this ) );
|
|
||||||
},
|
|
||||||
|
|
||||||
setPlaylist: function( event, editor, element ) {
|
|
||||||
if ( ! this.data.tracks ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.players.push( new WPPlaylistView( {
|
|
||||||
el: $( element ).find( '.wp-playlist' ).get( 0 ),
|
|
||||||
metadata: this.data
|
|
||||||
} ).player );
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the data that will be used to compile the Underscore template,
|
|
||||||
* compile the template, and then return it.
|
|
||||||
*
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
getHtml: function() {
|
|
||||||
var data = this.shortcode.attrs.named,
|
|
||||||
model = wp.media.playlist,
|
|
||||||
options,
|
|
||||||
attachments,
|
|
||||||
tracks = [];
|
|
||||||
|
|
||||||
// Don't render errors while still fetching attachments
|
|
||||||
if ( this.dfd && 'pending' === this.dfd.state() && ! this.attachments.length ) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
_.each( model.defaults, function( value, key ) {
|
|
||||||
data[ key ] = model.coerce( data, key );
|
|
||||||
});
|
|
||||||
|
|
||||||
options = {
|
|
||||||
type: data.type,
|
|
||||||
style: data.style,
|
|
||||||
tracklist: data.tracklist,
|
|
||||||
tracknumbers: data.tracknumbers,
|
|
||||||
images: data.images,
|
|
||||||
artists: data.artists
|
|
||||||
};
|
|
||||||
|
|
||||||
if ( ! this.attachments.length ) {
|
|
||||||
return this.template( options );
|
|
||||||
}
|
|
||||||
|
|
||||||
attachments = this.attachments.toJSON();
|
|
||||||
|
|
||||||
_.each( attachments, function( attachment ) {
|
|
||||||
var size = {}, resize = {}, track = {
|
|
||||||
src : attachment.url,
|
|
||||||
type : attachment.mime,
|
|
||||||
title : attachment.title,
|
|
||||||
caption : attachment.caption,
|
|
||||||
description : attachment.description,
|
|
||||||
meta : attachment.meta
|
|
||||||
};
|
|
||||||
|
|
||||||
if ( 'video' === data.type ) {
|
|
||||||
size.width = attachment.width;
|
|
||||||
size.height = attachment.height;
|
|
||||||
if ( media.view.settings.contentWidth ) {
|
|
||||||
resize.width = media.view.settings.contentWidth - 22;
|
|
||||||
resize.height = Math.ceil( ( size.height * resize.width ) / size.width );
|
|
||||||
if ( ! options.width ) {
|
|
||||||
options.width = resize.width;
|
|
||||||
options.height = resize.height;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ( ! options.width ) {
|
|
||||||
options.width = attachment.width;
|
|
||||||
options.height = attachment.height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
track.dimensions = {
|
|
||||||
original : size,
|
|
||||||
resized : _.isEmpty( resize ) ? size : resize
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
options.width = 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
track.image = attachment.image;
|
|
||||||
track.thumb = attachment.thumb;
|
|
||||||
|
|
||||||
tracks.push( track );
|
|
||||||
} );
|
|
||||||
|
|
||||||
options.tracks = tracks;
|
|
||||||
this.data = options;
|
|
||||||
|
|
||||||
return this.template( options );
|
|
||||||
},
|
|
||||||
|
|
||||||
unbind: function() {
|
|
||||||
this.unsetPlayers();
|
|
||||||
}
|
|
||||||
} )
|
|
||||||
} ) );
|
} ) );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TinyMCE handler for the embed shortcode
|
* TinyMCE handler for the embed shortcode
|
||||||
*/
|
*/
|
||||||
wp.mce.embedView = _.extend( {}, wp.media.mixin, {
|
wp.mce.embedMixin = {
|
||||||
overlay: true,
|
View: _.extend( {}, wp.mce.av.View, {
|
||||||
initialize: function( options ) {
|
overlay: true,
|
||||||
this.players = [];
|
action: 'parse-embed',
|
||||||
this.content = options.content;
|
initialize: function( options ) {
|
||||||
this.fetching = false;
|
this.content = options.content;
|
||||||
this.parsed = false;
|
this.fetching = false;
|
||||||
this.original = options.url || options.shortcode.string();
|
this.parsed = false;
|
||||||
|
this.original = options.url || options.shortcode.string();
|
||||||
|
|
||||||
if ( options.url ) {
|
if ( options.url ) {
|
||||||
this.shortcode = '[embed]' + options.url + '[/embed]';
|
this.shortcode = media.embed.shortcode( {
|
||||||
} else {
|
url: options.url
|
||||||
this.shortcode = options.shortcode.string();
|
|
||||||
}
|
|
||||||
|
|
||||||
_.bindAll( this, 'setHtml', 'setNode', 'fetch' );
|
|
||||||
$( this ).on( 'ready', this.setNode );
|
|
||||||
},
|
|
||||||
unbind: function() {
|
|
||||||
var self = this;
|
|
||||||
_.each( this.players, function ( player ) {
|
|
||||||
player.pause();
|
|
||||||
self.removePlayer( player );
|
|
||||||
} );
|
|
||||||
this.players = [];
|
|
||||||
},
|
|
||||||
setNode: function () {
|
|
||||||
if ( this.parsed ) {
|
|
||||||
this.setHtml( this.parsed );
|
|
||||||
this.parseMediaShortcodes();
|
|
||||||
} else if ( ! this.fetching ) {
|
|
||||||
this.fetch();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fetch: function () {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.fetching = true;
|
|
||||||
|
|
||||||
wp.ajax.send( 'parse-embed', {
|
|
||||||
data: {
|
|
||||||
post_ID: $( '#post_ID' ).val() || 0,
|
|
||||||
shortcode: this.shortcode
|
|
||||||
}
|
|
||||||
} )
|
|
||||||
.always( function() {
|
|
||||||
self.fetching = false;
|
|
||||||
} )
|
|
||||||
.done( function( response ) {
|
|
||||||
if ( response ) {
|
|
||||||
self.parsed = response;
|
|
||||||
self.setHtml( response );
|
|
||||||
}
|
|
||||||
} )
|
|
||||||
.fail( function( response ) {
|
|
||||||
if ( response && response.message ) {
|
|
||||||
if ( ( response.type === 'not-embeddable' && self.type === 'embed' ) ||
|
|
||||||
response.type === 'not-ssl' ) {
|
|
||||||
|
|
||||||
self.setError( response.message, 'admin-media' );
|
|
||||||
} else {
|
|
||||||
self.setContent( '<p>' + self.original + '</p>', null, 'replace' );
|
|
||||||
}
|
|
||||||
} else if ( response && response.statusText ) {
|
|
||||||
self.setError( response.statusText, 'admin-media' );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
},
|
|
||||||
/* jshint scripturl: true */
|
|
||||||
setHtml: function ( content ) {
|
|
||||||
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
|
|
||||||
iframe, iframeDoc, i, resize,
|
|
||||||
dom = tinymce.DOM;
|
|
||||||
|
|
||||||
if ( content.indexOf( '<script' ) !== -1 ) {
|
|
||||||
iframe = dom.create( 'iframe', {
|
|
||||||
src: tinymce.Env.ie ? 'javascript:""' : '',
|
|
||||||
frameBorder: '0',
|
|
||||||
allowTransparency: 'true',
|
|
||||||
style: {
|
|
||||||
width: '100%',
|
|
||||||
display: 'block'
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
this.setContent( iframe );
|
|
||||||
iframeDoc = iframe.contentWindow.document;
|
|
||||||
|
|
||||||
iframeDoc.open();
|
|
||||||
iframeDoc.write(
|
|
||||||
'<!DOCTYPE html>' +
|
|
||||||
'<html>' +
|
|
||||||
'<head>' +
|
|
||||||
'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' +
|
|
||||||
'</head>' +
|
|
||||||
'<body>' +
|
|
||||||
content +
|
|
||||||
'</body>' +
|
|
||||||
'</html>'
|
|
||||||
);
|
|
||||||
iframeDoc.close();
|
|
||||||
|
|
||||||
resize = function() {
|
|
||||||
$( iframe ).height( $( iframeDoc ).height() );
|
|
||||||
};
|
|
||||||
|
|
||||||
if ( MutationObserver ) {
|
|
||||||
new MutationObserver( _.debounce( function() {
|
|
||||||
resize();
|
|
||||||
}, 100 ) )
|
|
||||||
.observe( iframeDoc.body, {
|
|
||||||
attributes: true,
|
|
||||||
childList: true,
|
|
||||||
subtree: true
|
|
||||||
} );
|
} );
|
||||||
} else {
|
} else {
|
||||||
for ( i = 1; i < 6; i++ ) {
|
this.shortcode = options.shortcode;
|
||||||
setTimeout( resize, i * 700 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
this.setContent( content );
|
_.bindAll( this, 'createIframe', 'setNode', 'fetch' );
|
||||||
|
$( this ).on( 'ready', this.setNode );
|
||||||
}
|
}
|
||||||
|
} ),
|
||||||
this.parseMediaShortcodes();
|
|
||||||
},
|
|
||||||
parseMediaShortcodes: function () {
|
|
||||||
var self = this;
|
|
||||||
$( '.wp-audio-shortcode, .wp-video-shortcode', this.node ).each( function ( i, element ) {
|
|
||||||
self.players.push( new MediaElementPlayer( element, self.mejsSettings ) );
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
wp.mce.embedMixin = {
|
|
||||||
View: wp.mce.embedView,
|
|
||||||
edit: function( node ) {
|
edit: function( node ) {
|
||||||
var embed = media.embed,
|
var embed = media.embed,
|
||||||
self = this,
|
self = this,
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -46,103 +46,6 @@
|
||||||
} );
|
} );
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* Utility to identify the user's browser
|
|
||||||
*/
|
|
||||||
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 = /MSIE /.test( ua ) || ( /Trident\//.test( ua ) && /rv:\d/.test( ua ) ); // IE11
|
|
||||||
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) !== null && ua.match(/chrome/gi) !== null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return passes;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specify compatibility for native playback by browser
|
|
||||||
*/
|
|
||||||
compat :{
|
|
||||||
'opera' : {
|
|
||||||
audio: ['ogg', 'wav'],
|
|
||||||
video: ['ogg', 'webm']
|
|
||||||
},
|
|
||||||
'chrome' : {
|
|
||||||
audio: ['ogg', 'mpeg'],
|
|
||||||
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']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determine if the passed media contains a <source> that provides
|
|
||||||
* native playback in the user's browser
|
|
||||||
*
|
|
||||||
* @param {jQuery} media
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
isCompatible: function( media ) {
|
|
||||||
if ( ! media.find( 'source' ).length ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ua = this.ua, test = false, found = false, sources;
|
|
||||||
|
|
||||||
if ( ua.is( 'oldIE' ) ) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
sources = media.find( 'source' );
|
|
||||||
|
|
||||||
_.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' );
|
|
||||||
|
|
||||||
if ( elem.type.match( video ) !== null || elem.type.match( audio ) !== null ) {
|
|
||||||
test = true;
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
return test || found;
|
|
||||||
} );
|
|
||||||
|
|
||||||
return test;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override the MediaElement method for removing a player.
|
* Override the MediaElement method for removing a player.
|
||||||
* MediaElement tries to pull the audio/video tag out of
|
* MediaElement tries to pull the audio/video tag out of
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -111,6 +111,10 @@ video.wp-video-shortcode,
|
||||||
line-height: 1.5;
|
line-height: 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wp-admin .wp-playlist {
|
||||||
|
margin: 0 0 18px;
|
||||||
|
}
|
||||||
|
|
||||||
.wp-playlist video {
|
.wp-playlist video {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
initialize : function (options) {
|
initialize : function (options) {
|
||||||
this.index = 0;
|
this.index = 0;
|
||||||
this.settings = {};
|
this.settings = {};
|
||||||
this.compatMode = $( 'body' ).hasClass( 'wp-admin' ) && $( '#content_ifr' ).length;
|
|
||||||
this.data = options.metadata || $.parseJSON( this.$('script').html() );
|
this.data = options.metadata || $.parseJSON( this.$('script').html() );
|
||||||
this.playerNode = this.$( this.data.type );
|
this.playerNode = this.$( this.data.type );
|
||||||
|
|
||||||
|
@ -27,9 +26,7 @@
|
||||||
this.renderTracks();
|
this.renderTracks();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( this.isCompatibleSrc() ) {
|
this.playerNode.attr( 'src', this.current.get( 'src' ) );
|
||||||
this.playerNode.attr( 'src', this.current.get( 'src' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
_.bindAll( this, 'bindPlayer', 'bindResetPlayer', 'setPlayer', 'ended', 'clickTrack' );
|
_.bindAll( this, 'bindPlayer', 'bindResetPlayer', 'setPlayer', 'ended', 'clickTrack' );
|
||||||
|
|
||||||
|
@ -47,25 +44,7 @@
|
||||||
|
|
||||||
bindResetPlayer : function (mejs) {
|
bindResetPlayer : function (mejs) {
|
||||||
this.bindPlayer( mejs );
|
this.bindPlayer( mejs );
|
||||||
if ( this.isCompatibleSrc() ) {
|
this.playCurrentSrc();
|
||||||
this.playCurrentSrc();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
isCompatibleSrc: function () {
|
|
||||||
var testNode;
|
|
||||||
|
|
||||||
if ( this.compatMode ) {
|
|
||||||
testNode = $( '<span><source type="' + this.current.get( 'type' ) + '" /></span>' );
|
|
||||||
|
|
||||||
if ( ! wp.media.mixin.isCompatible( testNode ) ) {
|
|
||||||
this.playerNode.removeAttr( 'src' );
|
|
||||||
this.playerNode.removeAttr( 'poster' );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setPlayer: function (force) {
|
setPlayer: function (force) {
|
||||||
|
@ -76,9 +55,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (force) {
|
if (force) {
|
||||||
if ( this.isCompatibleSrc() ) {
|
this.playerNode.attr( 'src', this.current.get( 'src' ) );
|
||||||
this.playerNode.attr( 'src', this.current.get( 'src' ) );
|
|
||||||
}
|
|
||||||
this.settings.success = this.bindResetPlayer;
|
this.settings.success = this.bindResetPlayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,11 +165,9 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
if ( ! $( 'body' ).hasClass( 'wp-admin' ) || $( 'body' ).hasClass( 'about-php' ) ) {
|
$('.wp-playlist').each( function() {
|
||||||
$('.wp-playlist').each(function () {
|
return new WPPlaylistView({ el: this });
|
||||||
return new WPPlaylistView({ el: this });
|
} );
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
window.WPPlaylistView = WPPlaylistView;
|
window.WPPlaylistView = WPPlaylistView;
|
||||||
|
|
|
@ -1216,35 +1216,6 @@ function wp_print_media_templates() {
|
||||||
<# } #>
|
<# } #>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" id="tmpl-editor-audio">
|
|
||||||
<?php wp_underscore_audio_template() ?>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/html" id="tmpl-editor-video">
|
|
||||||
<?php wp_underscore_video_template() ?>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<?php wp_underscore_playlist_templates() ?>
|
|
||||||
|
|
||||||
<script type="text/html" id="tmpl-editor-playlist">
|
|
||||||
<# if ( data.tracks ) { #>
|
|
||||||
<div class="wp-playlist wp-{{ data.type }}-playlist wp-playlist-{{ data.style }}">
|
|
||||||
<# if ( 'audio' === data.type ){ #>
|
|
||||||
<div class="wp-playlist-current-item"></div>
|
|
||||||
<# } #>
|
|
||||||
<{{ data.type }} controls="controls" preload="none" <#
|
|
||||||
if ( data.width ) { #> width="{{ data.width }}"<# }
|
|
||||||
#><# if ( data.height ) { #> height="{{ data.height }}"<# } #>></{{ data.type }}>
|
|
||||||
<div class="wp-playlist-next"></div>
|
|
||||||
<div class="wp-playlist-prev"></div>
|
|
||||||
</div>
|
|
||||||
<# } else { #>
|
|
||||||
<div class="wpview-error">
|
|
||||||
<div class="dashicons dashicons-video-alt3"></div><p><?php _e( 'No items found.' ); ?></p>
|
|
||||||
</div>
|
|
||||||
<# } #>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/html" id="tmpl-crop-content">
|
<script type="text/html" id="tmpl-crop-content">
|
||||||
<img class="crop-image" src="{{ data.url }}">
|
<img class="crop-image" src="{{ data.url }}">
|
||||||
<div class="upload-errors"></div>
|
<div class="upload-errors"></div>
|
||||||
|
|
Loading…
Reference in New Issue