Gallery slideshow: Improve missing image and error handling
authorEd Sanders <esanders@wikimedia.org>
Fri, 19 Apr 2019 13:08:07 +0000 (14:08 +0100)
committerEsanders <esanders@wikimedia.org>
Tue, 23 Apr 2019 12:43:24 +0000 (12:43 +0000)
Change-Id: I6aae5801178aa66fc40d40b9dec239a34b0ee029

resources/src/mediawiki.page.gallery.slideshow.js

index dd52767..4ea1999 100644 (file)
                        .removeClass( 'slideshow-current' );
                $imageLi.addClass( 'slideshow-current' );
 
-               // 2. Create and show thumbnail
                this.$thumbnail = $imageLi.find( 'img' );
-               this.$img = $( '<img>' ).attr( {
-                       src: this.$thumbnail.attr( 'src' ),
-                       alt: this.$thumbnail.attr( 'alt' )
-               } );
-               // 'image' class required for detection by MultimediaViewer
-               $imgLink = $( '<a>' ).addClass( 'image' )
-                       .attr( 'href', $imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) )
-                       .append( this.$img );
+               if ( this.$thumbnail.length ) {
+                       // 2. Create and show thumbnail
+                       this.$img = $( '<img>' ).attr( {
+                               src: this.$thumbnail.attr( 'src' ),
+                               alt: this.$thumbnail.attr( 'alt' )
+                       } );
+                       // 'image' class required for detection by MultimediaViewer
+                       $imgLink = $( '<a>' ).addClass( 'image' )
+                               .attr( 'href', $imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) )
+                               .append( this.$img );
 
-               this.$imgContainer.empty().append( $imgLink );
+                       this.$imgContainer.empty().append( $imgLink );
+               } else {
+                       // 2b. No image found (e.g. file doesn't exist)
+                       this.$imgContainer.text( $imageLi.find( '.thumb' ).text() );
+               }
 
                // 3. Copy caption
                this.$imgCaption
                        .empty()
                        .append( $caption.clone() );
 
+               if ( !this.$thumbnail.length ) {
+                       return;
+               }
+
                // 4. Stretch thumbnail to correct size
                this.setImageSize();
 
                                // Pre-fetch the next image
                                this.loadImage( this.getNextImage().find( 'img' ) );
                        }
+               }.bind( this ) ).fail( function () {
+                       // Image didn't load
+                       var title = mw.Title.newFromImg( this.$img );
+                       this.$imgContainer.text( title ? title.getMainText() : '' );
                }.bind( this ) );
        };