From ee22a59129e082a2bb9f5bc0b085191ab6faafc8 Mon Sep 17 00:00:00 2001 From: jaubourg Date: Thu, 3 Feb 2011 06:12:47 +0100 Subject: [PATCH] Stores jQuery.ajaxSettings.isLocal locally at load time so that any change to it won't affect the transport. Fixes the url parsing regexp to deal with empty domains. Adds informative text into test/localfile.html and handles Opera's failure. Revises the way xhr are created by doing all tests at load time and normalizes all the xhr creation functions so that none of them may throw an exception. --- src/ajax.js | 2 +- src/ajax/xhr.js | 53 +++++++++++++++++++++++++-------------------- test/localfile.html | 36 +++++++++++++++++++++--------- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 4b3ab7687..2c61cf276 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -15,7 +15,7 @@ var r20 = /%20/g, rselectTextarea = /^(?:select|textarea)/i, rspacesAjax = /\s+/, rts = /([?&])_=[^&]*/, - rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/, + rurl = /^(\w+:)\/\/([^\/?#:]*)(?::(\d+))?/, // Keep a copy of the old load method _load = jQuery.fn.load, diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index 4adf8eb2a..97db07951 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -1,5 +1,18 @@ (function( jQuery ) { +// Functions to create xhrs +function createStandardXHR() { + try { + return new window.XMLHttpRequest(); + } catch( e ) {} +} + +function createActiveXHR() { + try { + return new window.ActiveXObject("Microsoft.XMLHTTP"); + } catch( e ) {} +} + var // Next active xhr id xhrId = jQuery.now(), @@ -10,7 +23,11 @@ var // Next active xhr id xhrUnloadAbortInstalled, // XHR used to determine supports properties - testXHR; + testXHR, + + // Keep track of isLocal in case it gets removed + // from ajaxSettings later on + protocolIsLocal = jQuery.ajaxSettings.isLocal; // Create the request object // (This is still attached to ajaxSettings for backward compatibility) @@ -21,28 +38,17 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ? * Additionally XMLHttpRequest can be disabled in IE7/IE8 so * we need a fallback. */ - function() { - if ( !jQuery.ajaxSettings.isLocal ) { - try { - return new window.XMLHttpRequest(); - } catch( xhrError ) {} + ( protocolIsLocal ? + createActiveXHR : + function() { + return createStandardXHR() || createActiveXHR(); } - - try { - return new window.ActiveXObject("Microsoft.XMLHTTP"); - } catch( activeError ) {} - } : + ) : // For all other browsers, use the standard XMLHttpRequest object - function() { - return new window.XMLHttpRequest(); - }; + createStandardXHR; // Test if we can create an xhr object -try { - testXHR = jQuery.ajaxSettings.xhr(); -} catch( xhrCreationException ) {} - -//Does this browser support XHR requests? +testXHR = jQuery.ajaxSettings.xhr(); jQuery.support.ajax = !!testXHR; // Does this browser support crossDomain XHR requests @@ -189,13 +195,14 @@ if ( jQuery.support.ajax ) { // for errors, could be anything really (even a real 0) status = 302; } - // All same-domain - #8125, #8152: for local files, 0 is a success - } else if( s.isLocal ) { + // All same-domain: for local files, 0 is a success + } else if( protocolIsLocal ) { status = 200; + // Opera: this notifies success for all requests + // (verified in 11.01). Patch welcome. } // Opera - #6060: sets status as 0 for 304 - // and there doesn't seem to be any way to - // detect this case. Patch VERY welcome. + // Patch welcome. } } } diff --git a/test/localfile.html b/test/localfile.html index 802163133..b354612a5 100644 --- a/test/localfile.html +++ b/test/localfile.html @@ -25,16 +25,32 @@ +

jQuery Local File Test

+ \ No newline at end of file -- 2.39.5