Exclude duplicate srcset urls

Bug: T135550
Change-Id: I956dc155426739d60052a0dc77dafdf0414d5bd7
This commit is contained in:
Matthias Mullie 2016-07-18 14:52:08 +02:00
parent f59fddc35c
commit 8c32946ca1
4 changed files with 42 additions and 4 deletions

View file

@ -1020,9 +1020,21 @@ class Html {
static function srcSet( array $urls ) {
$candidates = [];
foreach ( $urls as $density => $url ) {
// Cast density to float to strip 'x'.
$candidates[] = $url . ' ' . (float)$density . 'x';
// Cast density to float to strip 'x', then back to string to serve
// as array index.
$density = (string)(float)$density;
$candidates[$density] = $url;
}
// Remove duplicates that are the same as a smaller value
ksort( $candidates, SORT_NUMERIC );
$candidates = array_unique( $candidates );
// Append density info to the url
foreach ( $candidates as $density => $url ) {
$candidates[$density] = $url . ' ' . $density . 'x';
}
return implode( ", ", $candidates );
}
}

View file

@ -421,8 +421,10 @@ class ThumbnailImage extends MediaTransformOutput {
}
// Additional densities for responsive images, if specified.
if ( !empty( $this->responsiveUrls ) ) {
$attribs['srcset'] = Html::srcSet( $this->responsiveUrls );
// If any of these urls is the same as src url, it'll be excluded.
$responsiveUrls = array_diff( $this->responsiveUrls, [ $this->url ] );
if ( !empty( $responsiveUrls ) ) {
$attribs['srcset'] = Html::srcSet( $responsiveUrls );
}
Hooks::run( 'ThumbnailBeforeProduceHTML', [ $this, &$attribs, &$linkAttribs ] );

View file

@ -27080,3 +27080,17 @@ Empty LI (T49673)
<li>b</li>
</ul>
!! end
!! test
Thumbnail output
!! wikitext
[[File:Thumb.png|thumb]]
!! html/php+tidy
<div class="thumb tright">
<div class="thumbinner" style="width:137px;"><a href="/wiki/File:Thumb.png" class="image"><img alt="Thumb.png" src="http://example.com/images/e/ea/Thumb.png" width="135" height="135" class="thumbimage" /></a>
<div class="thumbcaption">
<div class="magnify"><a href="/wiki/File:Thumb.png" class="internal" title="Enlarge"></a></div>
</div>
</div>
</div>
!! end

View file

@ -738,6 +738,16 @@ class HtmlTest extends MediaWikiTestCase {
'1x.png 1x, 1_5x.png 1.5x, 2x.png 2x',
'pixel depth keys may omit a trailing "x"'
],
[
[ '1' => 'small.png', '1.5' => 'large.png', '2' => 'large.png' ],
'small.png 1x, large.png 1.5x',
'omit larger duplicates'
],
[
[ '1' => 'small.png', '2' => 'large.png', '1.5' => 'large.png' ],
'small.png 1x, large.png 1.5x',
'omit larger duplicates in irregular order'
],
];
}