2023-05-20 08:30:52 +00:00
const { MultimediaViewerBootstrap } = require ( 'mmv.bootstrap' ) ;
const { asyncMethod , waitForAsync , getMultimediaViewer } = require ( './mmv.testhelpers.js' ) ;
2018-11-12 16:33:24 +00:00
( function ( ) {
2014-04-15 21:59:39 +00:00
QUnit . module ( 'mmv.bootstrap' , QUnit . newMwEnvironment ( {
2023-07-28 09:04:12 +00:00
// mw.Title relies on these three config vars
// Restore them after each test run
config : {
wgFormattedNamespaces : {
'-2' : 'Media' ,
'-1' : 'Special' ,
0 : '' ,
1 : 'Talk' ,
2 : 'User' ,
3 : 'User talk' ,
4 : 'Wikipedia' ,
5 : 'Wikipedia talk' ,
6 : 'File' ,
7 : 'File talk' ,
8 : 'MediaWiki' ,
9 : 'MediaWiki talk' ,
10 : 'Template' ,
11 : 'Template talk' ,
12 : 'Help' ,
13 : 'Help talk' ,
14 : 'Category' ,
15 : 'Category talk' ,
// testing custom / localized namespace
100 : 'Penguins'
} ,
wgNamespaceIds : {
/* eslint-disable camelcase */
media : - 2 ,
special : - 1 ,
'' : 0 ,
talk : 1 ,
user : 2 ,
user _talk : 3 ,
wikipedia : 4 ,
wikipedia _talk : 5 ,
file : 6 ,
file _talk : 7 ,
mediawiki : 8 ,
mediawiki _talk : 9 ,
template : 10 ,
template _talk : 11 ,
help : 12 ,
help _talk : 13 ,
category : 14 ,
category _talk : 15 ,
image : 6 ,
image _talk : 7 ,
project : 4 ,
project _talk : 5 ,
// Testing custom namespaces and aliases
penguins : 100 ,
antarctic _waterfowl : 100
/* eslint-enable camelcase */
} ,
wgCaseSensitiveNamespaces : [ ]
} ,
2022-05-13 20:41:15 +00:00
beforeEach : function ( ) {
2014-06-10 23:29:50 +00:00
mw . config . set ( 'wgMediaViewer' , true ) ;
2014-04-15 21:59:39 +00:00
mw . config . set ( 'wgMediaViewerOnClick' , true ) ;
2015-01-23 12:48:27 +00:00
this . sandbox . stub ( mw . user , 'isAnon' ) . returns ( false ) ;
2014-06-10 23:29:50 +00:00
}
} ) ) ;
2014-02-17 15:09:23 +00:00
2014-04-25 23:16:48 +00:00
function createGallery ( imageSrc , caption ) {
2016-07-18 13:49:27 +00:00
var $div = $ ( '<div>' ) . addClass ( 'gallery' ) . appendTo ( '#qunit-fixture' ) ,
$galleryBox = $ ( '<div>' ) . addClass ( 'gallerybox' ) . appendTo ( $div ) ,
$thumbwrap = $ ( '<div>' ) . addClass ( 'thumb' ) . appendTo ( $galleryBox ) ,
$link = $ ( '<a>' ) . addClass ( 'image' ) . appendTo ( $thumbwrap ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 13:49:27 +00:00
$ ( '<img>' ) . attr ( 'src' , ( imageSrc || 'thumb.jpg' ) ) . appendTo ( $link ) ;
$ ( '<div>' ) . addClass ( 'gallerytext' ) . text ( caption || 'Foobar' ) . appendTo ( $galleryBox ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 13:49:27 +00:00
return $div ;
2014-02-17 15:09:23 +00:00
}
2014-12-30 05:10:27 +00:00
function createThumb ( imageSrc , caption , alt ) {
2016-07-18 13:49:27 +00:00
var $div = $ ( '<div>' ) . addClass ( 'thumb' ) . appendTo ( '#qunit-fixture' ) ,
$link = $ ( '<a>' ) . addClass ( 'image' ) . appendTo ( $div ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 13:49:27 +00:00
$ ( '<div>' ) . addClass ( 'thumbcaption' ) . appendTo ( $div ) . text ( caption ) ;
$ ( '<img>' ) . attr ( 'src' , ( imageSrc || 'thumb.jpg' ) ) . attr ( 'alt' , alt ) . appendTo ( $link ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 13:49:27 +00:00
return $div ;
2014-02-17 15:09:23 +00:00
}
2014-04-25 23:16:48 +00:00
function createNormal ( imageSrc , caption ) {
2016-07-18 13:49:27 +00:00
var $link = $ ( '<a>' ) . prop ( 'title' , caption ) . addClass ( 'image' ) . appendTo ( '#qunit-fixture' ) ;
$ ( '<img>' ) . prop ( 'src' , ( imageSrc || 'thumb.jpg' ) ) . appendTo ( $link ) ;
return $link ;
2014-04-25 23:16:48 +00:00
}
2014-12-30 01:26:17 +00:00
function createMultipleImage ( images ) {
2016-07-18 13:49:27 +00:00
var i , $div , $thumbimage , $link ,
$contain = $ ( '<div>' ) . addClass ( 'thumb' ) ,
$thumbinner = $ ( '<div>' ) . addClass ( 'thumbinner' ) . appendTo ( $contain ) ;
for ( i = 0 ; i < images . length ; ++ i ) {
$div = $ ( '<div>' ) . appendTo ( $thumbinner ) ;
$thumbimage = $ ( '<div>' ) . addClass ( 'thumbimage' ) . appendTo ( $div ) ;
$link = $ ( '<a>' ) . addClass ( 'image' ) . appendTo ( $thumbimage ) ;
$ ( '<img>' ) . prop ( 'src' , images [ i ] [ 0 ] ) . appendTo ( $link ) ;
$ ( '<div>' ) . addClass ( 'thumbcaption' ) . text ( images [ i ] [ 1 ] ) . appendTo ( $div ) ;
2014-12-30 01:26:17 +00:00
}
2016-07-18 13:49:27 +00:00
return $contain ;
2014-12-30 01:26:17 +00:00
}
2014-03-04 11:53:53 +00:00
function createBootstrap ( viewer ) {
2023-05-20 08:30:52 +00:00
var bootstrap = new MultimediaViewerBootstrap ( ) ;
2014-09-12 17:13:42 +00:00
2016-07-18 10:00:46 +00:00
bootstrap . processThumbs ( $ ( '#qunit-fixture' ) ) ;
2014-09-12 17:13:42 +00:00
// MultimediaViewerBootstrap.ensureEventHandlersAreSetUp() is a weird workaround for gadget bugs.
// MediaViewer should work without it, and so should the tests.
2019-02-05 23:59:52 +00:00
bootstrap . ensureEventHandlersAreSetUp = function ( ) { } ;
2014-09-12 17:13:42 +00:00
2016-12-14 13:09:10 +00:00
bootstrap . getViewer = function ( ) {
2023-04-25 08:49:10 +00:00
return viewer || {
2023-04-28 21:49:00 +00:00
loadImageByTitle : function ( ) { } ,
2023-04-25 08:49:10 +00:00
initWithThumbs : function ( ) { } ,
hash : function ( ) { } ,
router : { checkRoute : function ( ) { } }
} ;
2016-12-14 13:09:10 +00:00
} ;
2014-03-04 11:53:53 +00:00
return bootstrap ;
}
2015-02-25 14:55:37 +00:00
function hashTest ( prefix , bootstrap , assert ) {
2017-05-05 15:53:28 +00:00
var hash = prefix + '/foo' ,
callCount = 0 ;
2014-04-11 09:31:38 +00:00
bootstrap . loadViewer = function ( ) {
2017-05-05 15:53:28 +00:00
callCount ++ ;
2014-04-11 09:31:38 +00:00
return $ . Deferred ( ) . reject ( ) ;
} ;
2017-05-05 15:53:28 +00:00
// Hijack loadViewer, which will return a promise that we'll have to
// wait for if we want to see these tests through
2023-05-20 08:30:52 +00:00
asyncMethod ( bootstrap , 'loadViewer' ) ;
2017-05-05 15:53:28 +00:00
// invalid hash, should not trigger MMV load
2019-06-10 10:39:24 +00:00
location . hash = 'Foo' ;
2014-04-11 09:31:38 +00:00
2017-05-05 15:53:28 +00:00
// actual hash we want to test for, should trigger MMV load
// use setTimeout to add new hash change to end of the call stack,
// ensuring that event handlers for our previous change can execute
// without us interfering with another immediate change
setTimeout ( function ( ) {
2019-06-10 10:39:24 +00:00
location . hash = hash ;
2017-05-05 15:53:28 +00:00
} ) ;
2023-05-20 08:30:52 +00:00
return waitForAsync ( ) . then ( function ( ) {
2018-06-06 18:23:25 +00:00
assert . strictEqual ( callCount , 1 , 'Viewer should be loaded once' ) ;
2014-04-11 09:31:38 +00:00
bootstrap . cleanupEventHandlers ( ) ;
2019-06-10 10:39:24 +00:00
location . hash = '' ;
2017-05-05 15:53:28 +00:00
} ) ;
2014-04-11 09:31:38 +00:00
}
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Promise does not hang on ResourceLoader errors' , function ( assert ) {
2014-04-29 01:35:07 +00:00
var bootstrap ,
2017-05-05 15:53:28 +00:00
errorMessage = 'loading failed' ,
done = assert . async ( ) ;
2014-02-14 00:36:10 +00:00
2014-08-15 13:46:43 +00:00
this . sandbox . stub ( mw . loader , 'using' )
2016-07-18 13:49:27 +00:00
. callsArgWith ( 2 , new Error ( errorMessage , [ 'mmv' ] ) )
2014-08-15 13:46:43 +00:00
. withArgs ( 'mediawiki.notification' ) . returns ( $ . Deferred ( ) . reject ( ) ) ; // needed for mw.notify
2014-03-04 11:53:53 +00:00
bootstrap = createBootstrap ( ) ;
2017-05-05 15:53:28 +00:00
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
this . sandbox . stub ( bootstrap , 'cleanupOverlay' ) ;
2014-02-14 00:36:10 +00:00
2015-12-03 21:35:30 +00:00
bootstrap . loadViewer ( true ) . fail ( function ( message ) {
2018-06-06 18:23:25 +00:00
assert . strictEqual ( bootstrap . setupOverlay . called , true , 'Overlay was set up' ) ;
assert . strictEqual ( bootstrap . cleanupOverlay . called , true , 'Overlay was cleaned up' ) ;
2014-02-14 00:36:10 +00:00
assert . strictEqual ( message , errorMessage , 'promise is rejected with the error message when loading fails' ) ;
2017-05-05 15:53:28 +00:00
done ( ) ;
2014-02-14 00:36:10 +00:00
} ) ;
} ) ;
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Clicks are not captured once the loading fails' , function ( assert ) {
2014-04-29 01:35:07 +00:00
var event , returnValue ,
2023-05-20 08:30:52 +00:00
bootstrap = new MultimediaViewerBootstrap ( ) ,
2017-05-05 15:53:28 +00:00
clock = this . sandbox . useFakeTimers ( ) ;
2014-04-29 01:35:07 +00:00
2014-08-15 13:46:43 +00:00
this . sandbox . stub ( mw . loader , 'using' )
2016-07-18 13:49:27 +00:00
. callsArgWith ( 2 , new Error ( 'loading failed' , [ 'mmv' ] ) )
2014-08-15 13:46:43 +00:00
. withArgs ( 'mediawiki.notification' ) . returns ( $ . Deferred ( ) . reject ( ) ) ; // needed for mw.notify
2019-02-05 23:59:52 +00:00
bootstrap . ensureEventHandlersAreSetUp = function ( ) { } ;
2014-04-29 01:35:07 +00:00
2017-05-05 15:53:28 +00:00
// trigger first click, which will cause MMV to be loaded (which we've
// set up to fail)
2014-04-29 01:35:07 +00:00
event = new $ . Event ( 'click' , { button : 0 , which : 1 } ) ;
2023-04-28 21:49:00 +00:00
returnValue = bootstrap . click ( event , mw . Title . newFromText ( 'Foo' ) ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2022-05-20 00:18:43 +00:00
assert . true ( event . isDefaultPrevented ( ) , 'First click is caught' ) ;
2014-04-29 01:35:07 +00:00
assert . strictEqual ( returnValue , false , 'First click is caught' ) ;
2017-05-05 15:53:28 +00:00
clock . restore ( ) ;
2014-04-29 01:35:07 +00:00
} ) ;
2018-06-06 17:23:16 +00:00
// FIXME: Tests suspended as they do not pass in QUnit 2.x+ – T192932
QUnit . skip ( 'Check viewer invoked when clicking on valid image links' , function ( assert ) {
2014-02-17 15:09:23 +00:00
// TODO: Is <div class="gallery"><span class="image"><img/></span></div> valid ???
2020-01-08 19:27:58 +00:00
var div , $link , $link2 , $link3 , $link4 , $link5 , bootstrap ,
2019-02-05 23:59:52 +00:00
viewer = { initWithThumbs : function ( ) { } , loadImageByTitle : this . sandbox . stub ( ) } ,
2017-05-05 15:53:28 +00:00
clock = this . sandbox . useFakeTimers ( ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 10:39:29 +00:00
// Create gallery with valid link image
2014-02-17 15:09:23 +00:00
div = createGallery ( ) ;
2020-01-08 19:27:58 +00:00
$link = div . find ( 'a.image' ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 10:39:29 +00:00
// Valid isolated thumbnail
2020-01-08 19:27:58 +00:00
$link2 = $ ( '<a>' ) . addClass ( 'image' ) . appendTo ( '#qunit-fixture' ) ;
$ ( '<img>' ) . attr ( 'src' , 'thumb2.jpg' ) . appendTo ( $link2 ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 10:39:29 +00:00
// Non-valid fragment
2020-01-08 19:27:58 +00:00
$link3 = $ ( '<a>' ) . addClass ( 'noImage' ) . appendTo ( div ) ;
$ ( '<img>' ) . attr ( 'src' , 'thumb3.jpg' ) . appendTo ( $link3 ) ;
2014-02-17 15:09:23 +00:00
2016-06-10 09:30:37 +00:00
mw . config . set ( 'wgTitle' , 'Thumb4.jpg' ) ;
mw . config . set ( 'wgNamespaceNumber' , 6 ) ;
2014-04-08 21:01:07 +00:00
$ ( '<div>' ) . addClass ( 'fullMedia' ) . appendTo ( div ) ;
$ ( '<img>' ) . attr ( 'src' , 'thumb4.jpg' ) . appendTo (
$ ( '<a>' )
. appendTo (
$ ( '<div>' )
. attr ( 'id' , 'file' )
. appendTo ( '#qunit-fixture' )
)
) ;
2014-02-17 15:09:23 +00:00
// Create a new bootstrap object to trigger the DOM scan, etc.
2014-03-04 11:53:53 +00:00
bootstrap = createBootstrap ( viewer ) ;
2017-05-05 15:53:28 +00:00
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
2014-02-17 15:09:23 +00:00
2020-01-08 19:27:58 +00:00
$link4 = $ ( '.fullMedia .mw-mmv-view-expanded' ) ;
assert . ok ( $link4 . length , 'Link for viewing expanded file was set up.' ) ;
2014-04-08 21:01:07 +00:00
2020-01-08 19:27:58 +00:00
$link5 = $ ( '.fullMedia .mw-mmv-view-config' ) ;
assert . ok ( $link5 . length , 'Link for opening enable/disable configuration was set up.' ) ;
2014-10-03 09:15:28 +00:00
2016-07-18 10:39:29 +00:00
// Click on valid link
2020-01-08 19:27:58 +00:00
$link . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
// FIXME: Actual bootstrap.setupOverlay.callCount: 2
assert . equal ( bootstrap . setupOverlay . callCount , 1 , 'setupOverlay called (1st click)' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 1 , 'loadImageByTitle called (1st click)' ) ;
this . sandbox . reset ( ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 10:39:29 +00:00
// Click on valid link
2020-01-08 19:27:58 +00:00
$link2 . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 1 , 'setupOverlay called (2nd click)' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 1 , 'loadImageByTitle called (2nd click)' ) ;
this . sandbox . reset ( ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 10:39:29 +00:00
// Click on valid link
2020-01-08 19:27:58 +00:00
$link4 . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 1 , 'setupOverlay called (3rd click)' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 1 , 'loadImageByTitle called (3rd click)' ) ;
this . sandbox . reset ( ) ;
2014-04-08 21:01:07 +00:00
2016-07-18 10:39:29 +00:00
// Click on valid link even when preference says not to
2014-04-15 21:59:39 +00:00
mw . config . set ( 'wgMediaViewerOnClick' , false ) ;
2020-01-08 19:27:58 +00:00
$link4 . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2014-04-15 21:59:39 +00:00
mw . config . set ( 'wgMediaViewerOnClick' , true ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 1 , 'setupOverlay called on-click with pref off' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 1 , 'loadImageByTitle called on-click with pref off' ) ;
this . sandbox . reset ( ) ;
2014-04-15 21:59:39 +00:00
2017-05-05 15:53:28 +00:00
// @todo comment that above clicks should result in call, below clicks should not
2014-02-21 11:16:30 +00:00
2016-07-18 10:39:29 +00:00
// Click on non-valid link
2020-01-08 19:27:58 +00:00
$link3 . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 0 , 'setupOverlay not called on non-valid link click' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 0 , 'loadImageByTitle not called on non-valid link click' ) ;
this . sandbox . reset ( ) ;
2014-04-15 21:59:39 +00:00
2016-07-18 10:39:29 +00:00
// Click on valid links with preference off
2014-04-15 21:59:39 +00:00
mw . config . set ( 'wgMediaViewerOnClick' , false ) ;
2020-01-08 19:27:58 +00:00
$link . trigger ( { type : 'click' , which : 1 } ) ;
$link2 . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 0 , 'setupOverlay not called on non-valid link click with pref off' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 0 , 'loadImageByTitle not called on non-valid link click with pref off' ) ;
2017-05-05 15:53:28 +00:00
clock . restore ( ) ;
2014-02-17 15:09:23 +00:00
} ) ;
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Skip images with invalid extensions' , function ( assert ) {
2016-12-14 13:09:10 +00:00
var div , link ,
2019-02-05 23:59:52 +00:00
viewer = { initWithThumbs : function ( ) { } , loadImageByTitle : this . sandbox . stub ( ) } ,
2017-05-05 15:53:28 +00:00
clock = this . sandbox . useFakeTimers ( ) ;
2014-02-17 15:09:23 +00:00
// Create gallery with image that has invalid name extension
div = createGallery ( 'thumb.badext' ) ;
link = div . find ( 'a.image' ) ;
// Create a new bootstrap object to trigger the DOM scan, etc.
2016-12-14 13:09:10 +00:00
createBootstrap ( viewer ) ;
2014-02-17 15:09:23 +00:00
2016-07-18 10:39:29 +00:00
// Click on valid link with wrong image extension
2015-01-23 12:48:27 +00:00
link . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-06-06 18:23:25 +00:00
assert . strictEqual ( viewer . loadImageByTitle . called , false , 'Image should not be loaded' ) ;
2017-05-05 15:53:28 +00:00
clock . restore ( ) ;
2014-02-17 15:09:23 +00:00
} ) ;
2018-06-06 17:23:16 +00:00
// FIXME: Tests suspended as they do not pass in QUnit 2.x+ – T192932
QUnit . skip ( 'Accept only left clicks without modifier keys, skip the rest' , function ( assert ) {
2014-02-21 11:16:30 +00:00
var $div , $link , bootstrap ,
2019-02-05 23:59:52 +00:00
viewer = { initWithThumbs : function ( ) { } , loadImageByTitle : this . sandbox . stub ( ) } ,
2017-05-05 15:53:28 +00:00
clock = this . sandbox . useFakeTimers ( ) ;
2014-02-17 15:09:23 +00:00
2014-04-24 13:47:59 +00:00
// Create gallery with image that has valid name extension
2014-02-17 15:09:23 +00:00
$div = createGallery ( ) ;
// Create a new bootstrap object to trigger the DOM scan, etc.
2014-03-04 11:53:53 +00:00
bootstrap = createBootstrap ( viewer ) ;
2017-05-05 15:53:28 +00:00
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
2014-02-17 15:09:23 +00:00
$link = $div . find ( 'a.image' ) ;
// Handle valid left click, it should try to load the image
2015-01-23 12:48:27 +00:00
$link . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
// FIXME: Actual bootstrap.setupOverlay.callCount: 2
assert . equal ( bootstrap . setupOverlay . callCount , 1 , 'Left-click: Set up overlay' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 1 , 'Left-click: Load image' ) ;
this . sandbox . reset ( ) ;
2014-02-21 11:16:30 +00:00
2014-02-17 15:09:23 +00:00
// Skip Ctrl-left-click, no image is loaded
2015-01-23 12:48:27 +00:00
$link . trigger ( { type : 'click' , which : 1 , ctrlKey : true } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 0 , 'Ctrl-left-click: No overlay' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 0 , 'Ctrl-left-click: No image load' ) ;
this . sandbox . reset ( ) ;
2014-02-17 15:09:23 +00:00
// Skip invalid right click, no image is loaded
2015-01-23 12:48:27 +00:00
$link . trigger ( { type : 'click' , which : 2 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 0 , 'Right-click: No overlay' ) ;
assert . equal ( viewer . loadImageByTitle . callCount , 0 , 'Right-click: Image was not loaded' ) ;
2017-05-05 15:53:28 +00:00
clock . restore ( ) ;
2014-02-17 15:09:23 +00:00
} ) ;
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Ensure that the correct title is loaded when clicking' , function ( assert ) {
2014-02-21 11:16:30 +00:00
var bootstrap ,
2019-02-05 23:59:52 +00:00
viewer = { initWithThumbs : function ( ) { } , loadImageByTitle : this . sandbox . stub ( ) } ,
2017-05-05 15:53:28 +00:00
clock = this . sandbox . useFakeTimers ( ) ;
2014-02-17 15:09:23 +00:00
2014-02-21 11:16:30 +00:00
// Create a new bootstrap object to trigger the DOM scan, etc.
2014-03-04 11:53:53 +00:00
bootstrap = createBootstrap ( viewer ) ;
2017-05-05 15:53:28 +00:00
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
2014-03-28 08:06:53 +00:00
2023-04-28 21:49:00 +00:00
bootstrap . route ( 'File:Foo.jpg' ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2022-05-20 00:18:43 +00:00
assert . true ( bootstrap . setupOverlay . called , 'Overlay was set up' ) ;
2023-07-28 09:04:12 +00:00
assert . strictEqual ( viewer . loadImageByTitle . firstCall . args [ 0 ] . getPrefixedDb ( ) , 'File:Foo.jpg' , 'Titles are identical' ) ;
2017-05-05 15:53:28 +00:00
2023-04-28 21:49:00 +00:00
clock . tick ( 10 ) ;
2017-05-05 15:53:28 +00:00
clock . restore ( ) ;
2014-02-17 15:09:23 +00:00
} ) ;
2018-06-06 17:23:16 +00:00
// FIXME: Tests suspended as they do not pass in QUnit 2.x+ – T192932
2021-12-10 00:43:28 +00:00
QUnit . skip ( 'Validate new LightboxImage object has sensible constructor parameters' , function ( assert ) {
2014-02-21 11:16:30 +00:00
var bootstrap ,
$div ,
$link ,
2023-05-20 08:30:52 +00:00
viewer = getMultimediaViewer ( ) ,
2014-02-21 11:16:30 +00:00
fname = 'valid' ,
imgSrc = '/' + fname + '.jpg/300px-' + fname + '.jpg' ,
2017-05-05 15:53:28 +00:00
imgRegex = new RegExp ( imgSrc + '$' ) ,
clock = this . sandbox . useFakeTimers ( ) ;
2014-02-21 11:16:30 +00:00
2015-01-23 12:48:27 +00:00
$div = createThumb ( imgSrc , 'Blah blah' , 'meow' ) ;
2014-02-21 11:16:30 +00:00
$link = $div . find ( 'a.image' ) ;
2014-02-17 15:09:23 +00:00
2017-05-05 15:53:28 +00:00
// Create a new bootstrap object to trigger the DOM scan, etc.
bootstrap = createBootstrap ( viewer ) ;
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
this . sandbox . stub ( viewer , 'createNewImage' ) ;
2019-02-05 23:59:52 +00:00
viewer . loadImage = function ( ) { } ;
2014-12-30 05:10:27 +00:00
viewer . createNewImage = function ( fileLink , filePageLink , fileTitle , index , thumb , caption , alt ) {
2015-05-20 10:22:25 +00:00
var html = thumb . outerHTML ;
2018-05-03 18:59:00 +00:00
// FIXME: fileLink doesn't match imgRegex (null)
2014-02-21 11:16:30 +00:00
assert . ok ( fileLink . match ( imgRegex ) , 'Thumbnail URL used in creating new image object' ) ;
2021-12-10 00:43:28 +00:00
assert . strictEqual ( filePageLink , '' , 'File page link is sensible when creating new image object' ) ;
2014-02-21 11:16:30 +00:00
assert . strictEqual ( fileTitle . title , fname , 'Filename is correct when passed into new image constructor' ) ;
assert . strictEqual ( index , 0 , 'The only image we created in the gallery is set at index 0 in the images array' ) ;
2015-05-20 10:22:25 +00:00
assert . ok ( html . indexOf ( ' src="' + imgSrc + '"' ) > 0 , 'The image element passed in contains the src=... we want.' ) ;
assert . ok ( html . indexOf ( ' alt="meow"' ) > 0 , 'The image element passed in contains the alt=... we want.' ) ;
2014-02-21 11:16:30 +00:00
assert . strictEqual ( caption , 'Blah blah' , 'The caption passed in is correct' ) ;
2014-12-30 05:10:27 +00:00
assert . strictEqual ( alt , 'meow' , 'The alt text passed in is correct' ) ;
2014-02-21 11:16:30 +00:00
} ;
2014-02-17 15:09:23 +00:00
2015-01-23 12:48:27 +00:00
$link . trigger ( { type : 'click' , which : 1 } ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( 10 ) ;
2018-05-03 18:59:00 +00:00
assert . equal ( bootstrap . setupOverlay . callCount , 1 , 'Overlay was set up' ) ;
2017-05-05 15:53:28 +00:00
clock . reset ( ) ;
2014-02-21 11:16:30 +00:00
} ) ;
2014-02-17 15:09:23 +00:00
2023-05-02 13:50:53 +00:00
QUnit . test ( 'Only load the viewer on a valid hash' , function ( assert ) {
2014-02-21 11:16:30 +00:00
var bootstrap ;
2014-02-17 15:09:23 +00:00
2019-06-10 10:39:24 +00:00
location . hash = '' ;
2014-02-17 15:09:23 +00:00
2014-03-04 11:53:53 +00:00
bootstrap = createBootstrap ( ) ;
2014-02-17 15:09:23 +00:00
2017-05-05 15:53:28 +00:00
return hashTest ( '/media' , bootstrap , assert ) ;
2014-04-11 09:31:38 +00:00
} ) ;
2014-02-17 15:09:23 +00:00
2023-05-02 13:50:53 +00:00
QUnit . test ( 'Load the viewer on a legacy hash' , function ( assert ) {
2014-04-11 09:31:38 +00:00
var bootstrap ;
2014-02-17 15:09:23 +00:00
2019-06-10 10:39:24 +00:00
location . hash = '' ;
2014-02-17 15:09:23 +00:00
2014-04-11 09:31:38 +00:00
bootstrap = createBootstrap ( ) ;
2015-02-25 14:55:37 +00:00
2017-05-05 15:53:28 +00:00
return hashTest ( 'mediaviewer' , bootstrap , assert ) ;
2015-02-25 14:55:37 +00:00
} ) ;
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Overlay is set up on hash change' , function ( assert ) {
2015-12-03 21:35:30 +00:00
var bootstrap ;
2019-06-10 10:39:24 +00:00
location . hash = '#/media/foo' ;
2015-12-03 21:35:30 +00:00
bootstrap = createBootstrap ( ) ;
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
bootstrap . hash ( ) ;
2022-05-20 00:18:43 +00:00
assert . true ( bootstrap . setupOverlay . called , 'Overlay is set up' ) ;
2015-12-03 21:35:30 +00:00
} ) ;
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Overlay is not set up on an irrelevant hash change' , function ( assert ) {
2015-12-03 21:35:30 +00:00
var bootstrap ;
2019-06-10 10:39:24 +00:00
location . hash = '#foo' ;
2015-12-03 21:35:30 +00:00
bootstrap = createBootstrap ( ) ;
this . sandbox . stub ( bootstrap , 'setupOverlay' ) ;
bootstrap . loadViewer ( ) ;
bootstrap . setupOverlay . reset ( ) ;
bootstrap . hash ( ) ;
2018-06-06 18:23:25 +00:00
assert . strictEqual ( bootstrap . setupOverlay . called , false , 'Overlay is not set up' ) ;
2015-12-03 21:35:30 +00:00
} ) ;
2015-02-25 14:55:37 +00:00
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Restoring article scroll position' , function ( assert ) {
2017-09-13 18:04:22 +00:00
var stubbedScrollTop ,
bootstrap = createBootstrap ( ) ,
$window = $ ( window ) ,
done = assert . async ( ) ;
this . sandbox . stub ( $ . fn , 'scrollTop' , function ( scrollTop ) {
if ( scrollTop !== undefined ) {
stubbedScrollTop = scrollTop ;
return this ;
2014-04-11 09:31:38 +00:00
} else {
2017-09-13 18:04:22 +00:00
return stubbedScrollTop ;
2014-04-11 09:31:38 +00:00
}
} ) ;
2017-09-13 18:04:22 +00:00
$window . scrollTop ( 50 ) ;
2014-04-11 09:31:38 +00:00
bootstrap . setupOverlay ( ) ;
// Calling this a second time because it can happen in history navigation context
bootstrap . setupOverlay ( ) ;
2017-09-13 18:04:22 +00:00
// Clear scrollTop to check it is restored
$window . scrollTop ( 0 ) ;
2014-04-11 09:31:38 +00:00
bootstrap . cleanupOverlay ( ) ;
2017-09-13 18:04:22 +00:00
// Scroll restoration is on a setTimeout
setTimeout ( function ( ) {
assert . strictEqual ( $ ( window ) . scrollTop ( ) , 50 , 'Scroll is correctly reset to original top position' ) ;
done ( ) ;
} ) ;
2014-04-11 09:31:38 +00:00
} ) ;
2014-04-24 13:47:59 +00:00
2017-07-25 23:38:21 +00:00
QUnit . test ( 'Preload JS/CSS dependencies on thumb hover' , function ( assert ) {
2014-04-24 13:47:59 +00:00
var $div , bootstrap ,
2017-05-05 15:53:28 +00:00
clock = this . sandbox . useFakeTimers ( ) ,
2019-02-05 23:59:52 +00:00
viewer = { initWithThumbs : function ( ) { } } ;
2014-04-24 13:47:59 +00:00
// Create gallery with image that has valid name extension
$div = createThumb ( ) ;
// Create a new bootstrap object to trigger the DOM scan, etc.
bootstrap = createBootstrap ( viewer ) ;
this . sandbox . stub ( mw . loader , 'load' ) ;
2018-04-24 14:47:41 +00:00
$div . trigger ( 'mouseenter' ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( bootstrap . hoverWaitDuration - 50 ) ;
2018-04-24 14:47:41 +00:00
$div . trigger ( 'mouseleave' ) ;
2014-04-24 13:47:59 +00:00
2018-06-06 18:23:25 +00:00
assert . strictEqual ( mw . loader . load . called , false , 'Dependencies should not be preloaded if the thumb is not hovered long enough' ) ;
2014-04-24 13:47:59 +00:00
2018-04-24 14:47:41 +00:00
$div . trigger ( 'mouseenter' ) ;
2017-05-05 15:53:28 +00:00
clock . tick ( bootstrap . hoverWaitDuration + 50 ) ;
2018-04-24 14:47:41 +00:00
$div . trigger ( 'mouseleave' ) ;
2014-04-24 13:47:59 +00:00
2018-06-06 18:23:25 +00:00
assert . strictEqual ( mw . loader . load . called , true , 'Dependencies should be preloaded if the thumb is hovered long enough' ) ;
2017-05-05 15:53:28 +00:00
clock . restore ( ) ;
2014-04-24 13:47:59 +00:00
} ) ;
2014-06-11 18:42:29 +00:00
2017-07-25 23:38:21 +00:00
QUnit . test ( 'isAllowedThumb' , function ( assert ) {
2014-06-11 18:42:29 +00:00
var $container = $ ( '<div>' ) ,
$thumb = $ ( '<img>' ) . appendTo ( $container ) ,
bootstrap = createBootstrap ( ) ;
2018-06-06 18:23:25 +00:00
assert . strictEqual ( bootstrap . isAllowedThumb ( $thumb ) , true , 'Normal image in a div is allowed.' ) ;
2014-06-11 18:42:29 +00:00
$container . addClass ( 'metadata' ) ;
assert . strictEqual ( bootstrap . isAllowedThumb ( $thumb ) , false , 'Image in a metadata container is disallowed.' ) ;
2019-05-18 16:52:00 +00:00
$container . removeClass ( ) . addClass ( 'noviewer' ) ;
2014-06-11 18:42:29 +00:00
assert . strictEqual ( bootstrap . isAllowedThumb ( $thumb ) , false , 'Image in a noviewer container is disallowed.' ) ;
2019-05-18 16:52:00 +00:00
$container . removeClass ( ) . addClass ( 'noarticletext' ) ;
2014-06-11 18:42:29 +00:00
assert . strictEqual ( bootstrap . isAllowedThumb ( $thumb ) , false , 'Image in an empty article is disallowed.' ) ;
2019-05-18 16:52:00 +00:00
$container . removeClass ( ) . addClass ( 'noviewer' ) ;
2014-06-11 18:42:29 +00:00
assert . strictEqual ( bootstrap . isAllowedThumb ( $thumb ) , false , 'Image with a noviewer class is disallowed.' ) ;
} ) ;
2014-04-25 23:16:48 +00:00
2017-07-25 23:38:21 +00:00
QUnit . test ( 'findCaption' , function ( assert ) {
2014-04-25 23:16:48 +00:00
var gallery = createGallery ( 'foo.jpg' , 'Baz' ) ,
thumb = createThumb ( 'foo.jpg' , 'Quuuuux' ) ,
link = createNormal ( 'foo.jpg' , 'Foobar' ) ,
2014-12-30 01:26:17 +00:00
multiple = createMultipleImage ( [ [ 'foo.jpg' , 'Image #1' ] , [ 'bar.jpg' , 'Image #2' ] ,
[ 'foobar.jpg' , 'Image #3' ] ] ) ,
2014-04-25 23:16:48 +00:00
bootstrap = createBootstrap ( ) ;
assert . strictEqual ( bootstrap . findCaption ( gallery . find ( '.thumb' ) , gallery . find ( 'a.image' ) ) , 'Baz' , 'A gallery caption is found.' ) ;
assert . strictEqual ( bootstrap . findCaption ( thumb , thumb . find ( 'a.image' ) ) , 'Quuuuux' , 'A thumbnail caption is found.' ) ;
assert . strictEqual ( bootstrap . findCaption ( $ ( ) , link ) , 'Foobar' , 'The caption is found even if the image is not a thumbnail.' ) ;
2014-12-30 01:26:17 +00:00
assert . strictEqual ( bootstrap . findCaption ( multiple , multiple . find ( 'img[src="bar.jpg"]' ) . closest ( 'a' ) ) , 'Image #2' , 'The caption is found in {{Multiple image}}.' ) ;
2014-04-25 23:16:48 +00:00
} ) ;
2018-11-12 16:33:24 +00:00
} ( ) ) ;