aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Gołębiowski <m.goleb@gmail.com>2015-03-30 20:00:38 +0200
committerMichał Gołębiowski <m.goleb@gmail.com>2015-05-18 22:26:00 +0200
commit61f812b7e7b88dd6e0078c241e4c88905ea51562 (patch)
treefeecff2c00dcdd227b34dcc07e12a5de733f8121
parent3699ef463224a08233f9c37c6c7ad8235eb9a758 (diff)
downloadjquery-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.js32
-rw-r--r--test/integration/gh-1684-ajax.html52
-rw-r--r--test/unit/ajax.js6
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",