Skip to content
Browse files

Fixes #8125. Status is set to 200 for requests with status 0 when loc…

…ation.protocol if "file:". Added test/localfile.html to control it works.
  • Loading branch information...
1 parent cb49b4a commit cb85da7b62e74e7339ed652ade209aaffbd0c15b @jaubourg jaubourg committed Feb 1, 2011
Showing with 46 additions and 4 deletions.
  1. +6 −4 src/ajax/xhr.js
  2. +40 −0 test/localfile.html
View
10 src/ajax/xhr.js
@@ -156,12 +156,14 @@ if ( jQuery.support.ajax ) {
statusText = "";
}
- // Filter status for non standard behaviours
+ // Filter status for non standard behaviors
status =
+ // Most browsers return 0 when it should be 200 for local files
// Opera returns 0 when it should be 304
// Webkit returns 0 for failing cross-domain no matter the real status
- status === 0 ?
- (
+ !status ?
+ // All: for local files, 0 is a success
+ ( location.protocol === "file:" ? 200 : (
// Webkit, Firefox: filter out faulty cross-domain requests
!s.crossDomain || statusText ?
(
@@ -172,7 +174,7 @@ if ( jQuery.support.ajax ) {
) :
// We assume 302 but could be anything cross-domain related
302
- ) :
+ ) ) :
(
// IE sometimes returns 1223 when it should be 204 (see #1450)
status == 1223 ?
View
40 test/localfile.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr" id="html">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>jQuery Local File Test</title>
+ <!-- Includes -->
+ <script src="../src/core.js"></script>
+ <script src="../src/support.js"></script>
+ <script src="../src/data.js"></script>
+ <script src="../src/queue.js"></script>
+ <script src="../src/attributes.js"></script>
+ <script src="../src/event.js"></script>
+ <script src="../src/sizzle/sizzle.js"></script>
+ <script src="../src/sizzle-jquery.js"></script>
+ <script src="../src/traversing.js"></script>
+ <script src="../src/manipulation.js"></script>
+ <script src="../src/css.js"></script>
+ <script src="../src/ajax.js"></script>
+ <script src="../src/ajax/jsonp.js"></script>
+ <script src="../src/ajax/script.js"></script>
+ <script src="../src/ajax/xhr.js"></script>
+ <script src="../src/effects.js"></script>
+ <script src="../src/offset.js"></script>
+ <script src="../src/dimensions.js"></script>
+</head>
+
+<body>
+ <script>
+ jQuery.ajax( "data/badjson.js" , {
+ dataType: "text"
+ }).success(function() {
+ $( "<div/>" ).text( "Success OK" ).appendTo( "body" );
+ });
+ jQuery.ajax( "data/doesnotexist.ext" , {
+ dataType: "text"
+ }).error(function() {
+ $( "<div/>" ).text( "Error OK" ).appendTo( "body" );
+ });
+ </script>
+</body>

3 comments on commit cb85da7

@scottjehl

Hey Julian,
Do you know if this change ended up making it into 1.5.1 final? jQuery Mobile users have been unable to use jQM with Phonegap since jQuery 1.4.4 because of the file:// issue that this fix seems to address, but it doesn't look like the latest version of jQuery core makes it better.

Any info you have on this would be great help.
We've got a thread going here: https://github.com/jquery/jquery-mobile/issues#issue/991

BTW: there seems to be a separate more minor regression as well in that the success callback didn't always return an HTML dataType when it should, but Kin was able to work around that one temporarily in jQuery Mobile (noted here: https://github.com/jquery/jquery-mobile/issues#issue/991/comment/811934 )

Thanks so much!
-Scott

@jaubourg
jQuery Foundation member
@markusweb

to make this clear: with jquery 1.5.1 the ajax call itself works. so that is not the problem .the content loads fine. this seems not the problem with ajax call. an ajax call should work if the origin page was opened via file://. at least in this case i found the problem.
as far as i see it the problem lies in jquery mobile. there is an isExternal check, to see whether it is an internal or an external page call. only in the case of an internal call jqm does page transitions and inserts the conent into the dom of the page. so only in case of internal it acts and feels like an iphone app. with external call there is a new page loaded.
i have patched the isExternal check in jquerymobile. with my patch the app in phonegap works. we maybe have to check, whether other things still works. we use a kind of limited webapp/phonegap app, so my patch works for me.

see https://github.com/jquery/jquery-mobile/issues/#issue/1191

Please sign in to comment.
Something went wrong with that request. Please try again.