Commit ee22a591 authored by jaubourg's avatar jaubourg

Stores jQuery.ajaxSettings.isLocal locally at load time so that any change to...

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.
parent 50e950a9
...@@ -15,7 +15,7 @@ var r20 = /%20/g, ...@@ -15,7 +15,7 @@ var r20 = /%20/g,
rselectTextarea = /^(?:select|textarea)/i, rselectTextarea = /^(?:select|textarea)/i,
rspacesAjax = /\s+/, rspacesAjax = /\s+/,
rts = /([?&])_=[^&]*/, rts = /([?&])_=[^&]*/,
rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/, rurl = /^(\w+:)\/\/([^\/?#:]*)(?::(\d+))?/,
// Keep a copy of the old load method // Keep a copy of the old load method
_load = jQuery.fn.load, _load = jQuery.fn.load,
......
(function( jQuery ) { (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 var // Next active xhr id
xhrId = jQuery.now(), xhrId = jQuery.now(),
...@@ -10,7 +23,11 @@ var // Next active xhr id ...@@ -10,7 +23,11 @@ var // Next active xhr id
xhrUnloadAbortInstalled, xhrUnloadAbortInstalled,
// XHR used to determine supports properties // 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 // Create the request object
// (This is still attached to ajaxSettings for backward compatibility) // (This is still attached to ajaxSettings for backward compatibility)
...@@ -21,28 +38,17 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ? ...@@ -21,28 +38,17 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject ?
* Additionally XMLHttpRequest can be disabled in IE7/IE8 so * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
* we need a fallback. * we need a fallback.
*/ */
( protocolIsLocal ?
createActiveXHR :
function() { function() {
if ( !jQuery.ajaxSettings.isLocal ) { return createStandardXHR() || createActiveXHR();
try {
return new window.XMLHttpRequest();
} catch( xhrError ) {}
} }
) :
try {
return new window.ActiveXObject("Microsoft.XMLHTTP");
} catch( activeError ) {}
} :
// For all other browsers, use the standard XMLHttpRequest object // For all other browsers, use the standard XMLHttpRequest object
function() { createStandardXHR;
return new window.XMLHttpRequest();
};
// Test if we can create an xhr object // Test if we can create an xhr object
try { testXHR = jQuery.ajaxSettings.xhr();
testXHR = jQuery.ajaxSettings.xhr();
} catch( xhrCreationException ) {}
//Does this browser support XHR requests?
jQuery.support.ajax = !!testXHR; jQuery.support.ajax = !!testXHR;
// Does this browser support crossDomain XHR requests // Does this browser support crossDomain XHR requests
...@@ -189,13 +195,14 @@ if ( jQuery.support.ajax ) { ...@@ -189,13 +195,14 @@ if ( jQuery.support.ajax ) {
// for errors, could be anything really (even a real 0) // for errors, could be anything really (even a real 0)
status = 302; status = 302;
} }
// All same-domain - #8125, #8152: for local files, 0 is a success // All same-domain: for local files, 0 is a success
} else if( s.isLocal ) { } else if( protocolIsLocal ) {
status = 200; status = 200;
// Opera: this notifies success for all requests
// (verified in 11.01). Patch welcome.
} }
// Opera - #6060: sets status as 0 for 304 // Opera - #6060: sets status as 0 for 304
// and there doesn't seem to be any way to // Patch welcome.
// detect this case. Patch VERY welcome.
} }
} }
} }
......
...@@ -25,16 +25,32 @@ ...@@ -25,16 +25,32 @@
</head> </head>
<body> <body>
<h1>jQuery Local File Test</h1>
<ul>
<li>
Access this file using the "file:" protocol.
</li>
<li>
Two lines must appear below.
</li>
<li>
Opera will fail at detecting errors, it's a known issue.
</li>
</ul>
<script> <script>
jQuery.ajax( "data/badjson.js" , { jQuery.ajax( "data/badjson.js" , {
dataType: "text" dataType: "text"
}).success(function() { }).success(function() {
$( "<div/>" ).text( "Success OK" ).appendTo( "body" ); jQuery( "<div/>" ).text( "Success OK" ).appendTo( "body" );
}); });
jQuery.ajax( "data/doesnotexist.ext" , { jQuery.ajax( "data/doesnotexist.ext" , {
dataType: "text" dataType: "text"
}).error(function() { }).error(function() {
$( "<div/>" ).text( "Error OK" ).appendTo( "body" ); jQuery( "<div/>" ).text( "Error OK" ).appendTo( "body" );
}).success(function() {
if ( jQuery.browser.opera ) {
jQuery( "<div/>" ).text( "Error Fail (Opera)" ).appendTo( "body" );
}
}); });
</script> </script>
</body> </body>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment