summaryrefslogtreecommitdiffhomepage
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/reveal.js128
1 files changed, 106 insertions, 22 deletions
diff --git a/js/reveal.js b/js/reveal.js
index 20a967a..4aa50aa 100644
--- a/js/reveal.js
+++ b/js/reveal.js
@@ -1217,6 +1217,8 @@
if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;
if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );
+ if( slide.hasAttribute( 'data-preload' ) ) element.setAttribute( 'data-preload', '' );
+
// Background image options are set on the content wrapper
if( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;
if( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;
@@ -1276,7 +1278,11 @@
// Check if the requested method can be found
if( data.method && typeof Reveal[data.method] === 'function' ) {
- Reveal[data.method].apply( Reveal, data.args );
+ var result = Reveal[data.method].apply( Reveal, data.args );
+
+ // Dispatch a postMessage event with the returned value from
+ // our method invocation for getter functions
+ dispatchPostMessage( 'callback', { method: data.method, result: result } );
}
}
}, false );
@@ -1981,8 +1987,25 @@
// If we're in an iframe, post each reveal.js event to the
// parent window. Used by the notes plugin
+ dispatchPostMessage( type );
+
+ }
+
+ /**
+ * Dispatched a postMessage of the given type from our window.
+ */
+ function dispatchPostMessage( type, data ) {
+
if( config.postMessageEvents && window.parent !== window.self ) {
- window.parent.postMessage( JSON.stringify({ namespace: 'reveal', eventName: type, state: getState() }), '*' );
+ var message = {
+ namespace: 'reveal',
+ eventName: type,
+ state: getState()
+ };
+
+ extend( message, data );
+
+ window.parent.postMessage( JSON.stringify( message ), '*' );
}
}
@@ -3044,11 +3067,11 @@
syncBackground( slide );
syncFragments( slide );
+ loadSlide( slide );
+
updateBackground();
updateNotes();
- loadSlide( slide );
-
}
/**
@@ -3314,7 +3337,7 @@
}
// Flag if there are ANY vertical slides, anywhere in the deck
- if( dom.wrapper.querySelectorAll( '.slides>section>section' ).length ) {
+ if( hasVerticalSlides() ) {
dom.wrapper.classList.add( 'has-vertical-slides' );
}
else {
@@ -3322,7 +3345,7 @@
}
// Flag if there are ANY horizontal slides, anywhere in the deck
- if( dom.wrapper.querySelectorAll( '.slides>section' ).length > 1 ) {
+ if( hasHorizontalSlides() ) {
dom.wrapper.classList.add( 'has-horizontal-slides' );
}
else {
@@ -3604,7 +3627,7 @@
// Stop content inside of previous backgrounds
if( previousBackground ) {
- stopEmbeddedContent( previousBackground );
+ stopEmbeddedContent( previousBackground, { unloadIframes: !shouldPreload( previousBackground ) } );
}
@@ -3783,6 +3806,7 @@
background.style.display = 'block';
var backgroundContent = slide.slideBackgroundContentElement;
+ var backgroundIframe = slide.getAttribute( 'data-background-iframe' );
// If the background contains media, load it
if( background.hasAttribute( 'data-loaded' ) === false ) {
@@ -3791,8 +3815,7 @@
var backgroundImage = slide.getAttribute( 'data-background-image' ),
backgroundVideo = slide.getAttribute( 'data-background-video' ),
backgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),
- backgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' ),
- backgroundIframe = slide.getAttribute( 'data-background-iframe' );
+ backgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );
// Images
if( backgroundImage ) {
@@ -3833,14 +3856,7 @@
iframe.setAttribute( 'mozallowfullscreen', '' );
iframe.setAttribute( 'webkitallowfullscreen', '' );
- // Only load autoplaying content when the slide is shown to
- // avoid having it play in the background
- if( /autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {
- iframe.setAttribute( 'data-src', backgroundIframe );
- }
- else {
- iframe.setAttribute( 'src', backgroundIframe );
- }
+ iframe.setAttribute( 'data-src', backgroundIframe );
iframe.style.width = '100%';
iframe.style.height = '100%';
@@ -3851,6 +3867,19 @@
}
}
+ // Start loading preloadable iframes
+ var backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );
+ if( backgroundIframeElement ) {
+
+ // Check if this iframe is eligible to be preloaded
+ if( shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {
+ if( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {
+ backgroundIframeElement.setAttribute( 'src', backgroundIframe );
+ }
+ }
+
+ }
+
}
}
@@ -3870,6 +3899,11 @@
var background = getSlideBackground( slide );
if( background ) {
background.style.display = 'none';
+
+ // Unload any background iframes
+ toArray( background.querySelectorAll( 'iframe[src]' ) ).forEach( function( element ) {
+ element.removeAttribute( 'src' );
+ } );
}
// Reset lazy-loaded media elements with src attributes
@@ -4434,7 +4468,44 @@
*/
function getSlides() {
- return toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ));
+ return toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ) );
+
+ }
+
+ /**
+ * Returns a list of all horizontal slides in the deck. Each
+ * vertical stack is included as one horizontal slide in the
+ * resulting array.
+ */
+ function getHorizontalSlides() {
+
+ return toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
+
+ }
+
+ /**
+ * Returns all vertical slides that exist within this deck.
+ */
+ function getVerticalSlides() {
+
+ return toArray( dom.wrapper.querySelectorAll( '.slides>section>section' ) );
+
+ }
+
+ /**
+ * Returns true if there are at least two horizontal slides.
+ */
+ function hasHorizontalSlides() {
+
+ return getHorizontalSlides().length > 1;
+ }
+
+ /**
+ * Returns true if there are at least two vertical slides.
+ */
+ function hasVerticalSlides() {
+
+ return getVerticalSlides().length > 1;
}
@@ -5149,6 +5220,10 @@
return false;
}
+ // Use linear navigation if we're configured to OR if
+ // the presentation is one-dimensional
+ var useLinearMode = config.navigationMode === 'linear' || !hasHorizontalSlides() || !hasVerticalSlides();
+
var triggered = false;
// 1. User defined key bindings
@@ -5221,7 +5296,7 @@
if( firstSlideShortcut ) {
slide( 0 );
}
- else if( !isOverview() && config.navigationMode === 'linear' ) {
+ else if( !isOverview() && useLinearMode ) {
navigatePrev();
}
else {
@@ -5233,7 +5308,7 @@
if( lastSlideShortcut ) {
slide( Number.MAX_VALUE );
}
- else if( !isOverview() && config.navigationMode === 'linear' ) {
+ else if( !isOverview() && useLinearMode ) {
navigateNext();
}
else {
@@ -5242,7 +5317,7 @@
}
// K, UP
else if( keyCode === 75 || keyCode === 38 ) {
- if( !isOverview() && config.navigationMode === 'linear' ) {
+ if( !isOverview() && useLinearMode ) {
navigatePrev();
}
else {
@@ -5251,7 +5326,7 @@
}
// J, DOWN
else if( keyCode === 74 || keyCode === 40 ) {
- if( !isOverview() && config.navigationMode === 'linear' ) {
+ if( !isOverview() && useLinearMode ) {
navigateNext();
}
else {
@@ -5910,6 +5985,15 @@
// Returns the speaker notes string for a slide, or null
getSlideNotes: getSlideNotes,
+ // Returns an array with all horizontal/vertical slides in the deck
+ getHorizontalSlides: getHorizontalSlides,
+ getVerticalSlides: getVerticalSlides,
+
+ // Checks if the presentation contains two or more
+ // horizontal/vertical slides
+ hasHorizontalSlides: hasHorizontalSlides,
+ hasVerticalSlides: hasVerticalSlides,
+
// Returns the previous slide element, may be null
getPreviousSlide: function() {
return previousSlide;