diff --git a/src/openseadragon.js b/src/openseadragon.js index fa12a2f2..8d12d897 100644 --- a/src/openseadragon.js +++ b/src/openseadragon.js @@ -843,7 +843,7 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ /** - * Determines the page current scroll position. + * Determines the page's current scroll position. * @function * @name OpenSeadragon.getPageScroll * @returns {Point} @@ -893,9 +893,9 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ window.scrollTo( scroll.x, scroll.y ); }; } else { - var currentScroll = $.getPageScroll(); - if ( currentScroll.x === scroll.x && - currentScroll.y === scroll.y ) { + var originalScroll = $.getPageScroll(); + if ( originalScroll.x === scroll.x && + originalScroll.y === scroll.y ) { // We are already correctly positioned and there // is no way to detect the correct method. return; @@ -903,9 +903,9 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ document.body.scrollLeft = scroll.x; document.body.scrollTop = scroll.y; - currentScroll = $.getPageScroll(); - if ( currentScroll.x === scroll.x && - currentScroll.y === scroll.y ) { + var currentScroll = $.getPageScroll(); + if ( currentScroll.x !== originalScroll.x && + currentScroll.y !== originalScroll.y ) { $.setPageScroll = function( scroll ) { document.body.scrollLeft = scroll.x; document.body.scrollTop = scroll.y; @@ -916,8 +916,8 @@ window.OpenSeadragon = window.OpenSeadragon || function( options ){ document.documentElement.scrollLeft = scroll.x; document.documentElement.scrollTop = scroll.y; currentScroll = $.getPageScroll(); - if ( currentScroll.x === scroll.x && - currentScroll.y === scroll.y ) { + if ( currentScroll.x !== originalScroll.x && + currentScroll.y !== originalScroll.y ) { $.setPageScroll = function( scroll ) { document.documentElement.scrollLeft = scroll.x; document.documentElement.scrollTop = scroll.y; diff --git a/src/viewer.js b/src/viewer.js index 784675ca..54977599 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -656,7 +656,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, return; } - var recenterAfterFullPage = function() { + var registerRecenterAfterFullPageChange = function() { if ( _this.viewport ) { var oldBounds = _this.viewport.getBounds(); var oldCenter = _this.viewport.getCenter(); @@ -696,7 +696,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, var exitFullPage = function() { _this.raiseEvent( 'pre-full-page', { fullPage: false } ); - recenterAfterFullPage(); + registerRecenterAfterFullPageChange(); bodyStyle.margin = _this.bodyMargin; docStyle.margin = _this.docMargin; @@ -753,7 +753,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, if ( fullPage ) { this.raiseEvent( 'pre-full-page', { fullPage: true } ); - recenterAfterFullPage(); + registerRecenterAfterFullPageChange(); this.pageScroll = $.getPageScroll(); diff --git a/test/basic.js b/test/basic.js index 3ab694f1..6bffd5d9 100644 --- a/test/basic.js +++ b/test/basic.js @@ -180,16 +180,46 @@ ok(!$(viewer.element).hasClass('fullpage'), 'No fullpage class on div'); - viewer.setFullPage(true); - ok(viewer.isFullPage(), 'Enabled fullpage'); - ok($(viewer.element).hasClass('fullpage'), - 'Fullpage class added to div'); + var checkEnteringPreFullPage = function(event) { + viewer.removeHandler('pre-full-page', checkEnteringPreFullPage); + ok(event.fullPage, 'Switching to fullpage'); + ok(!viewer.isFullPage(), 'Not yet fullpage'); + }; - viewer.setFullPage(false); - ok(!viewer.isFullPage(), 'Disabled fullpage'); - ok(!$(viewer.element).hasClass('fullpage'), - 'Fullpage class removed from div'); - start(); + var checkEnteringFullPage = function(event) { + viewer.removeHandler('full-page', checkEnteringFullPage); + ok(event.fullPage, 'Switched to fullpage'); + ok(viewer.isFullPage(), 'Enabled fullpage'); + ok($(viewer.element).hasClass('fullpage'), + 'Fullpage class added to div'); + + var checkExitingPreFullPage = function(event) { + viewer.removeHandler('pre-full-page', checkExitingPreFullPage); + ok(!event.fullPage, 'Exiting fullpage'); + ok(viewer.isFullPage(), 'Still fullpage'); + }; + + var checkExitingFullPage = function(event) { + viewer.removeHandler('full-page', checkExitingFullPage); + ok(!event.fullPage, 'Exiting fullpage'); + ok(!viewer.isFullPage(), 'Disabled fullpage'); + ok(!$(viewer.element).hasClass('fullpage'), + 'Fullpage class removed from div'); + start(); + }; + + viewer.addHandler("pre-full-page", checkExitingPreFullPage); + viewer.addHandler("full-page", checkExitingFullPage); + + // Workaround: for some reason inside tests, the fullscreen + // mode is never activated, so disable it so that we can + // continue the tests. + OpenSeadragon.supportsFullScreen = false; + viewer.setFullPage(false); + }; + viewer.addHandler("pre-full-page", checkEnteringPreFullPage); + viewer.addHandler("full-page", checkEnteringFullPage); + viewer.setFullPage(true); }); viewer.open('/test/data/testpattern.dzi'); diff --git a/test/polyfills.js b/test/polyfills.js new file mode 100644 index 00000000..6811d19a --- /dev/null +++ b/test/polyfills.js @@ -0,0 +1,130 @@ +/* global module, asyncTest, $, ok, equal, notEqual, start, test, Util, testLog */ + +( function() { + + var origWidth, origHeight; + + module( 'Polyfills', { + setup: function() { + + origWidth = $( "body" ).width(); + origHeight = $( "body" ).height(); + $( "body" ).width( origWidth + 10000 ); + $( "body" ).height( origHeight + 10000 ); + + $( document ).scrollLeft( 0 ); + $( document ).scrollTop( 0 ); + testLog.reset(); + }, + teardown: function() { + $( "body" ).width( origWidth ); + $( "body" ).height( origHeight ); + $( document ).scrollLeft( 0 ); + $( document ).scrollTop( 0 ); + } + } ); + + // ---------- + test( 'pageScroll', function() { + + // Test get + var originalGetPageScroll = OpenSeadragon.getPageScroll; + + var scroll = OpenSeadragon.getPageScroll(); + equal( scroll.x, 0, "Scroll should be 0 at beginning." ); + equal( scroll.y, 0, "Scroll should be 0 at beginning." ); + + // If window.pageXOffset is not supported, the getPageScroll method should + // not have been redefined + if ( typeof ( window.pageXOffset ) != "number" ) { + equal( originalGetPageScroll, OpenSeadragon.getPageScroll, + "OpenSeadragon.getPageScroll must not be redefined when on 0,0" + + " and window API is not supported." ); + } else { + notEqual( originalGetPageScroll, OpenSeadragon.getPageScroll, + "OpenSeadragon.getPageScroll must be redefined when window API " + + "is supported." ); + } + + $( document ).scrollLeft( 200 ); + $( document ).scrollTop( 100 ); + scroll = originalGetPageScroll(); + equal( scroll.x, 200, "First call to getScroll." ); + equal( scroll.y, 100, "First call to getScroll." ); + + $( document ).scrollLeft( 500 ); + $( document ).scrollTop( 600 ); + scroll = OpenSeadragon.getPageScroll(); + equal( scroll.x, 500, "Second call to getScroll." ); + equal( scroll.y, 600, "Second call to getScroll." ); + + + + // Test set, must be imperatively be done after tests for get to not + // break them. + var originalSetPageScroll = OpenSeadragon.setPageScroll; + + $( document ).scrollLeft( 0 ); + $( document ).scrollTop( 0 ); + var scroll = new OpenSeadragon.Point( 0, 0 ); + OpenSeadragon.setPageScroll( scroll ); + equal( $( document ).scrollLeft(), 0, "First call to 0,0 while already on 0,0." ); + equal( $( document ).scrollTop(), 0, "First call to 0,0 while already on 0,0." ); + + // If window.pageXOffset is not supported, the getPageScroll method should + // not have been redefined + if ( typeof ( window.scrollTo ) === "undefined" ) { + equal( originalSetPageScroll, OpenSeadragon.setPageScroll, + "OpenSeadragon.setPageScroll must not be redefined when not moving." ); + } else { + notEqual( originalSetPageScroll, OpenSeadragon.setPageScroll, + "OpenSeadragon.setPageScroll must be redefined when window API is supported." ); + } + + + OpenSeadragon.setPageScroll = originalSetPageScroll; + $( document ).scrollLeft( 100 ); + $( document ).scrollTop( 200 ); + var scroll = new OpenSeadragon.Point( 100, 200 ); + OpenSeadragon.setPageScroll( scroll ); + equal( $( document ).scrollLeft(), 100, "First call to 100,200 while already on 100,200." ); + equal( $( document ).scrollTop(), 200, "First call to 100,200 while already on 100,200." ); + + // If window.pageXOffset is not supported, the getPageScroll method should + // not have been redefined + if ( typeof ( window.scrollTo ) === "undefined" ) { + equal( originalSetPageScroll, OpenSeadragon.setPageScroll, + "OpenSeadragon.setPageScroll must not be redefined when not moving." ); + } else { + notEqual( originalSetPageScroll, OpenSeadragon.setPageScroll, + "OpenSeadragon.setPageScroll must be redefined when window API is supported." ); + } + + + OpenSeadragon.setPageScroll = originalSetPageScroll; + $( document ).scrollLeft( 20000 ); + $( document ).scrollTop( 20000 ); + var actualScrollLeft = $( document ).scrollLeft(); + var actualScrollTop = $( document ).scrollTop(); + $( document ).scrollLeft( 0 ); + $( document ).scrollTop( 0 ); + var scroll = new OpenSeadragon.Point( 20000, 20000 ); + OpenSeadragon.setPageScroll( scroll ); + equal( $( document ).scrollLeft(), actualScrollLeft, "First call to position above limits." ); + equal( $( document ).scrollTop(), actualScrollTop, "First call to position above limits." ); + notEqual( originalSetPageScroll, OpenSeadragon.setPageScroll, + "Even if outside scroll limits, OpenSeadragon.setPageScroll can be " + + "reassigned on first call." ); + + + var currentSetPageScroll = OpenSeadragon.setPageScroll; + var scroll = new OpenSeadragon.Point( 200, 200 ); + OpenSeadragon.setPageScroll( scroll ); + equal( $( document ).scrollLeft(), 200, "Second call." ); + equal( $( document ).scrollTop(), 200, "Second call." ); + equal( currentSetPageScroll, OpenSeadragon.setPageScroll, + "OpenSeadragon.setPageScroll must not be reassigned after first call." ); + + } ); + +} )(); diff --git a/test/test.html b/test/test.html index 3bd6f919..0f46fa30 100644 --- a/test/test.html +++ b/test/test.html @@ -16,6 +16,10 @@ + + +