summaryrefslogtreecommitdiffstats
path: root/wp-includes/js/wp-embed-template.js
diff options
context:
space:
mode:
Diffstat (limited to 'wp-includes/js/wp-embed-template.js')
-rw-r--r--wp-includes/js/wp-embed-template.js249
1 files changed, 249 insertions, 0 deletions
diff --git a/wp-includes/js/wp-embed-template.js b/wp-includes/js/wp-embed-template.js
new file mode 100644
index 0000000..ae58e4e
--- /dev/null
+++ b/wp-includes/js/wp-embed-template.js
@@ -0,0 +1,249 @@
+/**
+ * @output wp-includes/js/wp-embed-template.js
+ */
+(function ( window, document ) {
+ 'use strict';
+
+ var supportedBrowser = ( document.querySelector && window.addEventListener ),
+ loaded = false,
+ secret,
+ secretTimeout,
+ resizing;
+
+ function sendEmbedMessage( message, value ) {
+ window.parent.postMessage( {
+ message: message,
+ value: value,
+ secret: secret
+ }, '*' );
+ }
+
+ /**
+ * Send the height message to the parent window.
+ */
+ function sendHeightMessage() {
+ sendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );
+ }
+
+ function onLoad() {
+ if ( loaded ) {
+ return;
+ }
+ loaded = true;
+
+ var share_dialog = document.querySelector( '.wp-embed-share-dialog' ),
+ share_dialog_open = document.querySelector( '.wp-embed-share-dialog-open' ),
+ share_dialog_close = document.querySelector( '.wp-embed-share-dialog-close' ),
+ share_input = document.querySelectorAll( '.wp-embed-share-input' ),
+ share_dialog_tabs = document.querySelectorAll( '.wp-embed-share-tab-button button' ),
+ featured_image = document.querySelector( '.wp-embed-featured-image img' ),
+ i;
+
+ if ( share_input ) {
+ for ( i = 0; i < share_input.length; i++ ) {
+ share_input[ i ].addEventListener( 'click', function ( e ) {
+ e.target.select();
+ } );
+ }
+ }
+
+ function openSharingDialog() {
+ share_dialog.className = share_dialog.className.replace( 'hidden', '' );
+ // Initial focus should go on the currently selected tab in the dialog.
+ document.querySelector( '.wp-embed-share-tab-button [aria-selected="true"]' ).focus();
+ }
+
+ function closeSharingDialog() {
+ share_dialog.className += ' hidden';
+ document.querySelector( '.wp-embed-share-dialog-open' ).focus();
+ }
+
+ if ( share_dialog_open ) {
+ share_dialog_open.addEventListener( 'click', function () {
+ openSharingDialog();
+ } );
+ }
+
+ if ( share_dialog_close ) {
+ share_dialog_close.addEventListener( 'click', function () {
+ closeSharingDialog();
+ } );
+ }
+
+ function shareClickHandler( e ) {
+ var currentTab = document.querySelector( '.wp-embed-share-tab-button [aria-selected="true"]' );
+ currentTab.setAttribute( 'aria-selected', 'false' );
+ document.querySelector( '#' + currentTab.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'true' );
+
+ e.target.setAttribute( 'aria-selected', 'true' );
+ document.querySelector( '#' + e.target.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'false' );
+ }
+
+ function shareKeyHandler( e ) {
+ var target = e.target,
+ previousSibling = target.parentElement.previousElementSibling,
+ nextSibling = target.parentElement.nextElementSibling,
+ newTab, newTabChild;
+
+ if ( 37 === e.keyCode ) {
+ newTab = previousSibling;
+ } else if ( 39 === e.keyCode ) {
+ newTab = nextSibling;
+ } else {
+ return false;
+ }
+
+ if ( 'rtl' === document.documentElement.getAttribute( 'dir' ) ) {
+ newTab = ( newTab === previousSibling ) ? nextSibling : previousSibling;
+ }
+
+ if ( newTab ) {
+ newTabChild = newTab.firstElementChild;
+
+ target.setAttribute( 'tabindex', '-1' );
+ target.setAttribute( 'aria-selected', false );
+ document.querySelector( '#' + target.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'true' );
+
+ newTabChild.setAttribute( 'tabindex', '0' );
+ newTabChild.setAttribute( 'aria-selected', 'true' );
+ newTabChild.focus();
+ document.querySelector( '#' + newTabChild.getAttribute( 'aria-controls' ) ).setAttribute( 'aria-hidden', 'false' );
+ }
+ }
+
+ if ( share_dialog_tabs ) {
+ for ( i = 0; i < share_dialog_tabs.length; i++ ) {
+ share_dialog_tabs[ i ].addEventListener( 'click', shareClickHandler );
+
+ share_dialog_tabs[ i ].addEventListener( 'keydown', shareKeyHandler );
+ }
+ }
+
+ document.addEventListener( 'keydown', function ( e ) {
+ if ( 27 === e.keyCode && -1 === share_dialog.className.indexOf( 'hidden' ) ) {
+ closeSharingDialog();
+ } else if ( 9 === e.keyCode ) {
+ constrainTabbing( e );
+ }
+ }, false );
+
+ function constrainTabbing( e ) {
+ // Need to re-get the selected tab each time.
+ var firstFocusable = document.querySelector( '.wp-embed-share-tab-button [aria-selected="true"]' );
+
+ if ( share_dialog_close === e.target && ! e.shiftKey ) {
+ firstFocusable.focus();
+ e.preventDefault();
+ } else if ( firstFocusable === e.target && e.shiftKey ) {
+ share_dialog_close.focus();
+ e.preventDefault();
+ }
+ }
+
+ if ( window.self === window.top ) {
+ return;
+ }
+
+ // Send this document's height to the parent (embedding) site.
+ sendHeightMessage();
+
+ // Send the document's height again after the featured image has been loaded.
+ if ( featured_image ) {
+ featured_image.addEventListener( 'load', sendHeightMessage );
+ }
+
+ /**
+ * Detect clicks to external (_top) links.
+ */
+ function linkClickHandler( e ) {
+ var target = e.target,
+ href;
+ if ( target.hasAttribute( 'href' ) ) {
+ href = target.getAttribute( 'href' );
+ } else {
+ href = target.parentElement.getAttribute( 'href' );
+ }
+
+ // Only catch clicks from the primary mouse button, without any modifiers.
+ if ( event.altKey || event.ctrlKey || event.metaKey || event.shiftKey ) {
+ return;
+ }
+
+ // Send link target to the parent (embedding) site.
+ if ( href ) {
+ sendEmbedMessage( 'link', href );
+ e.preventDefault();
+ }
+ }
+
+ document.addEventListener( 'click', linkClickHandler );
+ }
+
+ /**
+ * Iframe resize handler.
+ */
+ function onResize() {
+ if ( window.self === window.top ) {
+ return;
+ }
+
+ clearTimeout( resizing );
+
+ resizing = setTimeout( sendHeightMessage, 100 );
+ }
+
+ /**
+ * Message handler.
+ *
+ * @param {MessageEvent} event
+ */
+ function onMessage( event ) {
+ var data = event.data;
+
+ if ( ! data ) {
+ return;
+ }
+
+ if ( event.source !== window.parent ) {
+ return;
+ }
+
+ if ( ! ( data.secret || data.message ) ) {
+ return;
+ }
+
+ if ( data.secret !== secret ) {
+ return;
+ }
+
+ if ( 'ready' === data.message ) {
+ sendHeightMessage();
+ }
+ }
+
+ /**
+ * Re-get the secret when it was added later on.
+ */
+ function getSecret() {
+ if ( window.self === window.top || !!secret ) {
+ return;
+ }
+
+ secret = window.location.hash.replace( /.*secret=([\d\w]{10}).*/, '$1' );
+
+ clearTimeout( secretTimeout );
+
+ secretTimeout = setTimeout( function () {
+ getSecret();
+ }, 100 );
+ }
+
+ if ( supportedBrowser ) {
+ getSecret();
+ document.documentElement.className = document.documentElement.className.replace( /\bno-js\b/, '' ) + ' js';
+ document.addEventListener( 'DOMContentLoaded', onLoad, false );
+ window.addEventListener( 'load', onLoad, false );
+ window.addEventListener( 'resize', onResize, false );
+ window.addEventListener( 'message', onMessage, false );
+ }
+})( window, document );