-
Notifications
You must be signed in to change notification settings - Fork 143
Provide fallback JPEG images in frontend when WebP is not supported by the browser #360
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
36cd431
11197de
8262fca
e06409b
6637709
5cb1283
7044a6d
45a5fde
0d91c53
6ffde35
829390a
9b280a6
5365f64
d97c430
4fbb95e
49fca5e
e44a8a2
4db66ba
74fe886
f205815
ea38eae
a1fb857
a9bf111
6871972
9429f1b
696ade3
7e70d49
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,79 @@ | ||
| window.wpPerfLab = window.wpPerfLab || {}; | ||
|
|
||
| ( function( document ) { | ||
| window.wpPerfLab.webpUploadsFallbackWebpImages = function( media ) { | ||
| for ( var i = 0; i < media.length; i++ ) { | ||
| try { | ||
| if ( ! media[i].media_details.sources || ! media[i].media_details.sources['image/jpeg'] ) { | ||
| continue; | ||
| } | ||
|
|
||
| var ext = media[i].media_details.sources['image/jpeg'].file.match( /\.\w+$/i ); | ||
| if ( ! ext || ! ext[0] ) { | ||
| continue; | ||
| } | ||
|
|
||
| var images = document.querySelectorAll( 'img.wp-image-' + media[i].id ); | ||
| for ( var j = 0; j < images.length; j++ ) { | ||
| images[j].src = images[j].src.replace( /\.webp$/i, ext[0] ); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Will the file name always match? The thought behind the question: Someone uploads the image 🔢 The same question applies for
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is actually a good point but I think it is out of scope for this issue. The problem is bigger that just properly replacing webp files here. I tried to replicate your edge case and it looks like in this case webp images for the second image will override webp images for the first image 🤔. I uploaded This doesn't look right although this is a very unlikely edge case. I think it is worth creating a separate issue for it 🤔.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This was previously discussed and should have been fixed in the plugin - see #358 - not sure why you still see this happening. I'm not sure this fix is great though, it skips the duplicate generation; instead behavior should be like or use For core I am working on including this in the core patch as well, I tried one approach in 93542af (#2393) - that isn't quite finished - note there can actually be three variations - cat.jpe, cat.jpeg, and cat.jpg - yes ".jpe" is also valid! Another option would be to incorporate the fix into
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Thanks for testing this. I'm happy if y'all decide it is out of scope for this ticket. It seems like a much bigger problem than I thought when asking the question :)
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The problem of avoiding the override was indeed fixed in #358 - however that shouldn't have affected the PR here anyway, since realistically the problem is only on the JPEG (jpeg/jpg/jpe) side. Now that #358 is in place, no conflicting WebP image would be created so we should be good for now. With that said, I agree this is a valid point, and I think a much more stable implementation for the replacement would be to replace the full file name for the |
||
| var srcset = images[j].getAttribute( 'srcset' ); | ||
| if ( srcset ) { | ||
| images[j].setAttribute( 'srcset', srcset.replace( /\.webp(\s)/ig, ext[0] + '$1' ) ); | ||
| } | ||
| } | ||
| } catch ( e ) { | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| var restApi = document.getElementById( 'webpUploadsFallbackWebpImages' ).getAttribute( 'data-rest-api' ); | ||
|
|
||
| var loadMediaDetails = function( nodes ) { | ||
| var ids = []; | ||
| for ( var i = 0; i < nodes.length; i++ ) { | ||
| var node = nodes[i]; | ||
| var srcset = node.getAttribute( 'srcset' ) || ''; | ||
|
|
||
| if ( | ||
| node.nodeName !== "IMG" || | ||
| ( ! node.src.match( /\.webp$/i ) && ! srcset.match( /\.webp\s+/ ) ) | ||
| ) { | ||
| continue; | ||
| } | ||
|
|
||
| var attachment = node.className.match( /wp-image-(\d+)/i ); | ||
| if ( attachment && attachment[1] && ids.indexOf( attachment[1] ) === -1 ) { | ||
| ids.push( attachment[1] ); | ||
| } | ||
| } | ||
|
|
||
| for ( var page = 0, pages = Math.ceil( ids.length / 100 ); page < pages; page++ ) { | ||
| var pageIds = []; | ||
| for ( var i = 0; i < 100 && i + page * 100 < ids.length; i++ ) { | ||
| pageIds.push( ids[ i + page * 100 ] ); | ||
| } | ||
|
|
||
| var jsonp = document.createElement( 'script' ); | ||
| jsonp.src = restApi + 'wp/v2/media/?_fields=id,media_details&_jsonp=wpPerfLab.webpUploadsFallbackWebpImages&per_page=100&include=' + pageIds.join( ',' ); | ||
| document.body.appendChild( jsonp ); | ||
| } | ||
| }; | ||
|
|
||
| try { | ||
| // Loop through already available images. | ||
| loadMediaDetails( document.querySelectorAll( 'img' ) ); | ||
|
|
||
| // Start the mutation observer to update images added dynamically. | ||
| var observer = new MutationObserver( function( mutationList ) { | ||
| for ( var i = 0; i < mutationList.length; i++ ) { | ||
| loadMediaDetails( mutationList[i].addedNodes ); | ||
| } | ||
| } ); | ||
|
|
||
| observer.observe( document.body, { | ||
| subtree: true, | ||
| childList: true, | ||
| } ); | ||
| } catch ( e ) { | ||
| } | ||
| } )( document ); | ||
Uh oh!
There was an error while loading. Please reload this page.