mirror of
https://github.com/WordPress/WordPress.git
synced 2024-12-30 13:08:26 +01:00
a2349a2377
This moves the last of the iframe message code from PHP to JavaScript, so it can be included in any site, without needing to rely on any of WordPress' internal behaviour. Props swissspidy. Fixes #34451. Built from https://develop.svn.wordpress.org/trunk@35577 git-svn-id: http://core.svn.wordpress.org/trunk@35541 1a063a9b-81f0-0310-95a4-ce76da25c4cd
102 lines
2.8 KiB
JavaScript
102 lines
2.8 KiB
JavaScript
(function ( window, document ) {
|
|
'use strict';
|
|
|
|
var supportedBrowser = ( document.querySelector && window.addEventListener ),
|
|
loaded = false;
|
|
|
|
window.wp = window.wp || {};
|
|
|
|
if ( !! window.wp.receiveEmbedMessage ) {
|
|
return;
|
|
}
|
|
|
|
window.wp.receiveEmbedMessage = function( e ) {
|
|
var data = e.data;
|
|
if ( ! ( data.secret || data.message || data.value ) ) {
|
|
return;
|
|
}
|
|
|
|
var iframes = document.querySelectorAll( 'iframe[data-secret="' + data.secret + '"]' ),
|
|
blockquotes = document.querySelectorAll( 'blockquote[data-secret="' + data.secret + '"]' ),
|
|
i, source, height, sourceURL, targetURL;
|
|
|
|
for ( i = 0; i < blockquotes.length; i++ ) {
|
|
blockquotes[ i ].style.display = 'none';
|
|
}
|
|
|
|
for ( i = 0; i < iframes.length; i++ ) {
|
|
source = iframes[ i ];
|
|
|
|
source.style.display = '';
|
|
|
|
/* Resize the iframe on request. */
|
|
if ( 'height' === data.message ) {
|
|
height = parseInt( data.value, 10 );
|
|
if ( height > 1000 ) {
|
|
height = 1000;
|
|
} else if ( ~~height < 200 ) {
|
|
height = 200;
|
|
}
|
|
|
|
source.height = height;
|
|
}
|
|
|
|
/* Link to a specific URL on request. */
|
|
if ( 'link' === data.message ) {
|
|
sourceURL = document.createElement( 'a' );
|
|
targetURL = document.createElement( 'a' );
|
|
|
|
sourceURL.href = source.getAttribute( 'src' );
|
|
targetURL.href = data.value;
|
|
|
|
/* Only continue if link hostname matches iframe's hostname. */
|
|
if ( targetURL.host === sourceURL.host && document.activeElement === source ) {
|
|
window.top.location.href = data.value;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
function onLoad() {
|
|
if ( loaded ) {
|
|
return;
|
|
}
|
|
loaded = true;
|
|
|
|
var isIE10 = -1 !== navigator.appVersion.indexOf( 'MSIE 10' ),
|
|
isIE11 = !!navigator.userAgent.match( /Trident.*rv:11\./ ),
|
|
iframes = document.querySelectorAll( 'iframe.wp-embedded-content' ),
|
|
blockquotes = document.querySelectorAll( 'blockquote.wp-embedded-content' ),
|
|
iframeClone, i, source, secret;
|
|
|
|
for ( i = 0; i < blockquotes.length; i++ ) {
|
|
blockquotes[ i ].style.display = 'none';
|
|
}
|
|
|
|
for ( i = 0; i < iframes.length; i++ ) {
|
|
source = iframes[ i ];
|
|
source.style.display = '';
|
|
|
|
if ( !source.getAttribute( 'data-secret' ) ) {
|
|
/* Add secret to iframe */
|
|
secret = Math.random().toString( 36 ).substr( 2, 10 );
|
|
source.src += '#?secret=' + secret;
|
|
source.setAttribute( 'data-secret', secret );
|
|
}
|
|
|
|
/* Remove security attribute from iframes in IE10 and IE11. */
|
|
if ( ( isIE10 || isIE11 ) && !!source.getAttribute( 'security' ) ) {
|
|
iframeClone = source.cloneNode( true );
|
|
iframeClone.removeAttribute( 'security' );
|
|
source.parentNode.replaceChild( iframeClone, source );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( supportedBrowser ) {
|
|
window.addEventListener( 'message', window.wp.receiveEmbedMessage, false );
|
|
document.addEventListener( 'DOMContentLoaded', onLoad, false );
|
|
window.addEventListener( 'load', onLoad, false );
|
|
}
|
|
})( window, document );
|