From 8b73ea5f8ebe5e6da5d5e5f58363ad55cf2935aa Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 13 Apr 2012 14:54:01 -0700 Subject: [PATCH] (bug 35870) Fix pre-upload preview on IE 10 for Special:Upload When loading thumbnails, we fetch the actual file data so we can find EXIF data in JPEGs and do suitable rotation fixes. This currently uses binary strings via FileReader.readAsBinaryString, but that's not implemented in IE 10. Workaround uses FileReader.readAsArrayBuffer and converts to a binary string in case FileReader.readAsBinaryString is missing but readAsArrayBuffer is there. Patchset 2: fixed bug number, expanded details Patchset 3: cleaned up Patchset 4: summary fix Patchset 5: whitespace clean-up Change-Id: Ia0258f5f400a2a52a484f33fbffed7d848245d22 --- .../mediawiki.special.upload.js | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/resources/mediawiki.special/mediawiki.special.upload.js b/resources/mediawiki.special/mediawiki.special.upload.js index 85b3f3f56b..f7a4b1f76e 100644 --- a/resources/mediawiki.special/mediawiki.special.upload.js +++ b/resources/mediawiki.special/mediawiki.special.upload.js @@ -156,17 +156,33 @@ jQuery( function( $ ) { */ function fetchPreview( file, callback, callbackBinary ) { var reader = new FileReader(); - if ( callbackBinary ) { + if ( callbackBinary && 'readAsBinaryString' in reader ) { // To fetch JPEG metadata we need a binary string; start there. // todo: reader.onload = function() { callbackBinary( reader.result ); // Now run back through the regular code path. - fetchPreview(file, callback ); + fetchPreview( file, callback ); }; reader.readAsBinaryString( file ); - } else if ('URL' in window && 'createObjectURL' in window.URL) { + } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) { + // readAsArrayBuffer replaces readAsBinaryString + // However, our JPEG metadata library wants a string. + // So, this is going to be an ugly conversion. + reader.onload = function() { + var buffer = new Uint8Array( reader.result ), + string = ''; + for ( var i = 0; i < buffer.byteLength; i++ ) { + string += String.fromCharCode( buffer[i] ); + } + callbackBinary( string ); + + // Now run back through the regular code path. + fetchPreview( file, callback ); + }; + reader.readAsArrayBuffer( file ); + } else if ( 'URL' in window && 'createObjectURL' in window.URL ) { // Supported in Firefox 4.0 and above // WebKit has it in a namespace for now but that's ok. ;) // @@ -176,7 +192,7 @@ jQuery( function( $ ) { // // Prefer this over readAsDataURL for Firefox 7 due to bug reading // some SVG files from data URIs - callback(window.URL.createObjectURL(file)); + callback( window.URL.createObjectURL( file ) ); } else { // This ends up decoding the file to base-64 and back again, which // feels horribly inefficient. -- 2.20.1