' ).appendTo( $qf ), localStorage );
this.sandbox.stub( $.fn, 'scrollTop', () => 10 );
scroller.scroll();
assert.strictEqual( scroller.hasOpenedMetadata, true, 'We store hasOpenedMetadata flag for the session' );
} );
QUnit.test( 'localStorage is full', function ( assert ) {
const $qf = $( '#qunit-fixture' );
const localStorage = createLocalStorage( {
getItem: this.sandbox.stub().returns( null ),
setItem: this.sandbox.stub().throwsException( 'I am full' ),
removeItem: this.sandbox.stub()
} );
const scroller = new MetadataPanelScroller( $qf, $( '
' ).appendTo( $qf ), localStorage );
this.sandbox.stub( $.fn, 'scrollTop', () => 10 );
scroller.attach();
scroller.scroll();
assert.strictEqual( scroller.hasOpenedMetadata, true, 'We store hasOpenedMetadata flag for the session' );
scroller.scroll();
assert.true( localStorage.store.setItem.calledOnce, 'localStorage only written once' );
scroller.unattach();
} );
/**
* We need to set up a proxy on the jQuery scrollTop function and the jQuery.scrollTo plugin,
* that will let us pretend that the document really scrolled and that will return values
* as if the scroll happened.
*
* @param {sinon.sandbox} sandbox
* @param {MetadataPanelScroller} scroller
*/
function stubScrollFunctions( sandbox, scroller ) {
let memorizedScrollTop = 0;
sandbox.stub( $.fn, 'scrollTop', function ( scrollTop ) {
if ( scrollTop !== undefined ) {
memorizedScrollTop = scrollTop;
scroller.scroll();
return this;
} else {
return memorizedScrollTop;
}
} );
sandbox.stub( $.fn, 'animate', function ( props ) {
if ( 'scrollTop' in props ) {
memorizedScrollTop = props.scrollTop;
scroller.scroll();
}
return this;
} );
}
QUnit.test( 'Metadata scrolling', function ( assert ) {
const $window = $( window );
const $qf = $( '#qunit-fixture' );
const $container = $( '
' ).css( 'height', 100 ).appendTo( $qf );
const $aboveFold = $( '
' ).css( 'height', 50 ).appendTo( $container );
const fakeLocalStorage = createLocalStorage( {
getItem: this.sandbox.stub().returns( null ),
setItem: function () {},
removeItem: function () {}
} );
const scroller = new MetadataPanelScroller( $container, $aboveFold, fakeLocalStorage );
const keydown = $.Event( 'keydown' );
stubScrollFunctions( this.sandbox, scroller );
this.sandbox.stub( fakeLocalStorage.store, 'setItem' );
// First phase of the test: up and down arrows
scroller.hasAnimatedMetadata = false;
scroller.attach();
assert.strictEqual( $window.scrollTop(), 0, 'scrollTop should be set to 0' );
assert.strictEqual( fakeLocalStorage.store.setItem.called, false, 'The metadata hasn\'t been open yet, no entry in localStorage' );
keydown.which = 38; // Up arrow
scroller.keydown( keydown );
assert.strictEqual( fakeLocalStorage.store.setItem.calledWithExactly( 'mmv.hasOpenedMetadata', '1' ), true, 'localStorage knows that the metadata has been open' );
keydown.which = 40; // Down arrow
scroller.keydown( keydown );
assert.strictEqual( $window.scrollTop(), 0,
'scrollTop should be set to 0 after pressing down arrow' );
// Unattach lightbox from document
scroller.unattach();
// Second phase of the test: scroll memory
scroller.attach();
// To make sure that the details are out of view, the lightbox is supposed to scroll to the top when open
assert.strictEqual( $window.scrollTop(), 0, 'Page scrollTop should be set to 0' );
// Scroll down to check that the scrollTop memory doesn't affect prev/next (bug 59861)
$window.scrollTop( 20 );
this.clock.tick( 100 );
// This extra attach() call simulates the effect of prev/next seen in bug 59861
scroller.attach();
// The lightbox was already open at this point, the scrollTop should be left untouched
assert.strictEqual( $window.scrollTop(), 20, 'Page scrollTop should be set to 20' );
scroller.unattach();
} );
}() );