Fixes #8095. Properly handles the case where browser cache needs to be bypassed while...
authorjaubourg <j@ubourg.net>
Mon, 31 Jan 2011 18:59:53 +0000 (19:59 +0100)
committerjaubourg <j@ubourg.net>
Mon, 31 Jan 2011 18:59:53 +0000 (19:59 +0100)
src/ajax.js
test/unit/ajax.js

index 39abe90..c7d7f2d 100644 (file)
@@ -350,6 +350,8 @@ jQuery.extend({
                        completeDeferred = jQuery._Deferred(),
                        // Status-dependent callbacks
                        statusCode = s.statusCode || {},
+                       // ifModified key
+                       ifModifiedKey,
                        // Headers (they are sent all at once)
                        requestHeaders = {},
                        // Response headers
@@ -453,10 +455,10 @@ jQuery.extend({
                                if ( s.ifModified ) {
 
                                        if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) {
-                                               jQuery.lastModified[ s.url ] = lastModified;
+                                               jQuery.lastModified[ ifModifiedKey ] = lastModified;
                                        }
                                        if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) {
-                                               jQuery.etag[ s.url ] = etag;
+                                               jQuery.etag[ ifModifiedKey ] = etag;
                                        }
                                }
 
@@ -590,6 +592,9 @@ jQuery.extend({
                                s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
                        }
 
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
+
                        // Add anti-cache in url if needed
                        if ( s.cache === false ) {
 
@@ -609,11 +614,12 @@ jQuery.extend({
 
                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
                if ( s.ifModified ) {
-                       if ( jQuery.lastModified[ s.url ] ) {
-                               requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ];
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ ifModifiedKey ];
                        }
-                       if ( jQuery.etag[ s.url ] ) {
-                               requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ];
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               requestHeaders[ "if-none-match" ] = jQuery.etag[ ifModifiedKey ];
                        }
                }
 
index 33f2782..a536b9f 100644 (file)
@@ -1867,96 +1867,105 @@ test("data option: empty bodies for non-GET requests", function() {
        });
 });
 
-test("jQuery.ajax - If-Modified-Since support", function() {
-       expect( 3 );
+var ifModifiedNow = new Date();
 
-       stop();
+jQuery.each( { " (cache)": true, " (no cache)": false }, function( label, cache ) {
 
-       var url = "data/if_modified_since.php?ts=" + new Date();
+       test("jQuery.ajax - If-Modified-Since support" + label, function() {
+               expect( 3 );
 
-       jQuery.ajax({
-               url: url,
-               ifModified: true,
-               success: function(data, status) {
-                       equals(status, "success");
+               stop();
 
-                       jQuery.ajax({
-                               url: url,
-                               ifModified: true,
-                               success: function(data, status) {
-                                       if ( data === "FAIL" ) {
-                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
-                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
-                                       } else {
-                                               equals(status, "notmodified");
-                                               ok(data == null, "response body should be empty");
+               var url = "data/if_modified_since.php?ts=" + ifModifiedNow++;
+
+               jQuery.ajax({
+                       url: url,
+                       ifModified: true,
+                       cache: cache,
+                       success: function(data, status) {
+                               equals(status, "success" );
+
+                               jQuery.ajax({
+                                       url: url,
+                                       ifModified: true,
+                                       cache: cache,
+                                       success: function(data, status) {
+                                               if ( data === "FAIL" ) {
+                                                       ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
+                                                       ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
+                                               } else {
+                                                       equals(status, "notmodified");
+                                                       ok(data == null, "response body should be empty");
+                                               }
+                                               start();
+                               },
+                                       error: function() {
+                                               // Do this because opera simply refuses to implement 304 handling :(
+                                               // A feature-driven way of detecting this would be appreciated
+                                               // See: http://gist.github.com/599419
+                                               ok(jQuery.browser.opera, "error");
+                                               ok(jQuery.browser.opera, "error");
+                                               start();
                                        }
-                                       start();
-                       },
-                               error: function() {
-                                       // Do this because opera simply refuses to implement 304 handling :(
-                                       // A feature-driven way of detecting this would be appreciated
-                                       // See: http://gist.github.com/599419
-                                       ok(jQuery.browser.opera, "error");
-                                       ok(jQuery.browser.opera, "error");
-                                       start();
-                       }
-                       });
-               },
-               error: function() {
-                       equals(false, "error");
-                       // Do this because opera simply refuses to implement 304 handling :(
-                       // A feature-driven way of detecting this would be appreciated
-                       // See: http://gist.github.com/599419
-                       ok(jQuery.browser.opera, "error");
-                       start();
-               }
+                               });
+                       },
+                       error: function() {
+                               equals(false, "error");
+                               // Do this because opera simply refuses to implement 304 handling :(
+                               // A feature-driven way of detecting this would be appreciated
+                               // See: http://gist.github.com/599419
+                               ok(jQuery.browser.opera, "error");
+                               start();
+                       }
+               });
        });
-});
 
-test("jQuery.ajax - Etag support", function() {
-       expect( 3 );
+       test("jQuery.ajax - Etag support" + label, function() {
+               expect( 3 );
 
-       stop();
+               stop();
 
-       var url = "data/etag.php?ts=" + new Date();
+               var url = "data/etag.php?ts=" + ifModifiedNow++;
 
-       jQuery.ajax({
-               url: url,
-               ifModified: true,
-               success: function(data, status) {
-                       equals(status, "success");
+               jQuery.ajax({
+                       url: url,
+                       ifModified: true,
+                       cache: cache,
+                       success: function(data, status) {
+                               equals(status, "success" );
 
-                       jQuery.ajax({
-                               url: url,
-                               ifModified: true,
-                               success: function(data, status) {
-                                       if ( data === "FAIL" ) {
-                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
-                                               ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
-                                       } else {
-                                               equals(status, "notmodified");
-                                               ok(data == null, "response body should be empty");
+                               jQuery.ajax({
+                                       url: url,
+                                       ifModified: true,
+                                       cache: cache,
+                                       success: function(data, status) {
+                                               if ( data === "FAIL" ) {
+                                                       ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
+                                                       ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
+                                               } else {
+                                                       equals(status, "notmodified");
+                                                       ok(data == null, "response body should be empty");
+                                               }
+                                               start();
+                               },
+                               error: function() {
+                                               // Do this because opera simply refuses to implement 304 handling :(
+                                               // A feature-driven way of detecting this would be appreciated
+                                               // See: http://gist.github.com/599419
+                                               ok(jQuery.browser.opera, "error");
+                                               ok(jQuery.browser.opera, "error");
+                                               start();
                                        }
-                                       start();
-                       },
-                       error: function() {
-                                       // Do this because opera simply refuses to implement 304 handling :(
-                                       // A feature-driven way of detecting this would be appreciated
-                                       // See: http://gist.github.com/599419
-                                       ok(jQuery.browser.opera, "error");
-                                       ok(jQuery.browser.opera, "error");
-                                       start();
-                               }
-                       });
-               },
-               error: function() {
-                       // Do this because opera simply refuses to implement 304 handling :(
-                       // A feature-driven way of detecting this would be appreciated
-                       // See: http://gist.github.com/599419
-                       ok(jQuery.browser.opera, "error");
-                       start();
-               }
+                               });
+                       },
+                       error: function() {
+                               // Do this because opera simply refuses to implement 304 handling :(
+                               // A feature-driven way of detecting this would be appreciated
+                               // See: http://gist.github.com/599419
+                               ok(jQuery.browser.opera, "error");
+                               start();
+                       }
+               });
        });
 });