diff options
author | Michał Gołębiowski <m.goleb@gmail.com> | 2015-03-30 20:00:38 +0200 |
---|---|---|
committer | Michał Gołębiowski <m.goleb@gmail.com> | 2015-05-18 22:26:00 +0200 |
commit | 61f812b7e7b88dd6e0078c241e4c88905ea51562 (patch) | |
tree | feecff2c00dcdd227b34dcc07e12a5de733f8121 | |
parent | 3699ef463224a08233f9c37c6c7ad8235eb9a758 (diff) | |
download | jquery-61f812b7e7b88dd6e0078c241e4c88905ea51562.tar.gz jquery-61f812b7e7b88dd6e0078c241e4c88905ea51562.zip |
Ajax: Use the native XHR for all non-local requests in IE9+
IE throws an error on cross-domain PATCH requests if issued via the ActiveX
interface. This commit switches the logic to use the native XHR in all
non-local requests.
Fixes gh-1684
Closes gh-2183
-rw-r--r-- | src/ajax/xhr.js | 32 | ||||
-rw-r--r-- | test/integration/gh-1684-ajax.html | 52 | ||||
-rw-r--r-- | test/unit/ajax.js | 6 |
3 files changed, 79 insertions, 11 deletions
diff --git a/src/ajax/xhr.js b/src/ajax/xhr.js index 9c204a851..c563992f9 100644 --- a/src/ajax/xhr.js +++ b/src/ajax/xhr.js @@ -11,17 +11,31 @@ jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? function() { // XHR cannot access local files, always use ActiveX for that case - return !this.isLocal && + if ( this.isLocal ) { + return createActiveXHR(); + } + + // Support: IE 10-11 + // IE seems to error on cross-domain PATCH requests when ActiveX XHR + // is used. In IE 9+ always use the native XHR. + // Note: this condition won't catch Spartan as it doesn't define + // document.documentMode but it also doesn't have ActiveX so it won't + // reach this code. + if ( document.documentMode > 8 ) { + return createStandardXHR(); + } - // Support: IE<9 - // oldIE XHR does not support non-RFC2616 methods (#13240) - // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx - // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 - // Although this check for six methods instead of eight - // since IE also does not support "trace" and "connect" - /^(get|post|head|put|delete|options)$/i.test( this.type ) && + // Support: IE<9 + // oldIE XHR does not support non-RFC2616 methods (#13240) + // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx + // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 + // Although this check for six methods instead of eight + // since IE also does not support "trace" and "connect" + if ( /^(get|post|head|put|delete|options)$/i.test( this.type ) ) { + return createActiveXHR(); + } - createStandardXHR() || createActiveXHR(); + return createStandardXHR(); } : // For all other browsers, use the standard XMLHttpRequest object createStandardXHR; diff --git a/test/integration/gh-1684-ajax.html b/test/integration/gh-1684-ajax.html new file mode 100644 index 000000000..55e31d7fe --- /dev/null +++ b/test/integration/gh-1684-ajax.html @@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html> +<head lang="en"> + <meta charset="UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>Test for gh-1684</title> + <style> + #result { + font-size: 24px; + margin: 0.5em 0; + } + #response { + white-space: pre; + } + .error { + background-color: red; + } + .warn { + background-color: yellow; + } + .success { + background-color: lightgreen; + } + </style> +</head> + +<body> + <div id="result"></div> + <div id="response"></div> + <script src="../../dist/jquery.js"></script> + <script> + if ( !jQuery.support.cors ) { + jQuery( "#result" ) + .addClass( "success" ) + .text( "CORS not supported in this browser. Test not run." ); + } else { + jQuery.ajax( { + url: "http://httpbin.org/patch", + method: "PATCH", + success: function( data ) { + jQuery( "#result" ).addClass( "success" ).text( "Test passed." ); + jQuery( "#response" ).text( "Response:\n" + JSON.stringify( data, null, 4 ) ); + }, + error: function( error ) { + jQuery( "#result" ).addClass( "error" ).text( "Test failed." ); + jQuery( "#response" ).text( "Error:\n" + JSON.stringify( error, null, 4 ) ); + } + } ); + } + </script> +</body> +</html> diff --git a/test/unit/ajax.js b/test/unit/ajax.js index f030b48fc..1233f14ce 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -1578,8 +1578,10 @@ module( "ajax", { } } ); - // BrowserStack PATCH support sometimes breaks so on TestSwarm run the test in IE8 only. - if ( location.search.indexOf( "swarmURL=" ) === -1 || document.documentMode < 9 ) { + // BrowserStack PATCH support sometimes breaks so on TestSwarm run the test in IE only. + // Unfortunately, all IE versions gets special treatment in request object creation + // so we need to test in all supported IE versions to be sure. + if ( location.search.indexOf( "swarmURL=" ) === -1 || document.documentMode ) { ajaxTest( "#13240 - jQuery.ajax() - support non-RFC2616 methods", 1, { url: "data/echoQuery.php", method: "PATCH", |