Better way to detect CORS support

The old technique doesn't work in Firefox and
doesn't always work in Chrome depending on
when you call it.

https://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/

Also fixes some tests that weren't overloading
the right function and were hitting the real
feature detection check

Change-Id: I0a9d6b5654efb169860ddf7e5e0551efb825920c
This commit is contained in:
Gilles Dubuc 2014-02-24 15:34:46 +01:00 committed by Gergő Tisza
parent 79d72d391d
commit 75dbc72e6c
2 changed files with 15 additions and 14 deletions

View file

@ -100,11 +100,18 @@
/** /**
* Checks whether the current browser supports AJAX preloading of images. * Checks whether the current browser supports AJAX preloading of images.
* This means that:
* - the browser supports CORS requests (large wiki farms usually host images on a
* separate domain) and
* - either AJAX and normal image loading uses the same cache (when an image is used by a CORS
* request, and then normally by setting img.src, it is only loaded once)
* - or (as is the case with Firefox) they are cached separately, but that can be changed by
* setting the crossOrigin attribute
* @return {boolean} * @return {boolean}
*/ */
Image.prototype.imagePreloadingSupported = function () { Image.prototype.imagePreloadingSupported = function () {
// FIXME this is a *very* rough guess, but it'll work as the first estimation. // This checks if the browser supports CORS requests in XHRs
return 'crossOrigin' in new Image(); return 'withCredentials' in new XMLHttpRequest();
}; };
mw.mmv.provider.Image = Image; mw.mmv.provider.Image = Image;

View file

@ -30,10 +30,8 @@
+ '8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC', + '8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
imageProvider = new mw.mmv.provider.Image(); imageProvider = new mw.mmv.provider.Image();
imageProvider.performance = { imageProvider.imagePreloadingSupported = function () { return false; };
imagePreloadingSupported: function () { return false; }, imageProvider.performance.recordEntry = $.noop;
recordEntry: $.noop
};
QUnit.stop(); QUnit.stop();
imageProvider.get( url ).then( function( image ) { imageProvider.get( url ).then( function( image ) {
@ -52,10 +50,8 @@
result, result,
imageProvider = new mw.mmv.provider.Image(); imageProvider = new mw.mmv.provider.Image();
imageProvider.performance = { imageProvider.imagePreloadingSupported = function () { return false; };
imagePreloadingSupported: function () { return false; }, imageProvider.performance.recordEntry = $.noop;
recordEntry: $.noop
};
QUnit.stop(); QUnit.stop();
imageProvider.get( url ).then( function( image ) { imageProvider.get( url ).then( function( image ) {
@ -85,10 +81,8 @@
QUnit.asyncTest( 'Image load fail test', 1, function ( assert ) { QUnit.asyncTest( 'Image load fail test', 1, function ( assert ) {
var imageProvider = new mw.mmv.provider.Image(); var imageProvider = new mw.mmv.provider.Image();
imageProvider.performance = { imageProvider.imagePreloadingSupported = function () { return false; };
imagePreloadingSupported: function () { return false; }, imageProvider.performance.recordEntry = $.noop;
recordEntry: $.noop
};
imageProvider.get( 'doesntexist.png' ).fail( function() { imageProvider.get( 'doesntexist.png' ).fail( function() {
assert.ok( true, 'fail handler was called' ); assert.ok( true, 'fail handler was called' );