From 0e5b341cc0f3f9bf0f6659e09704f2267cfdfdba Mon Sep 17 00:00:00 2001 From: jaubourg Date: Wed, 26 Jan 2011 01:36:05 +0100 Subject: [PATCH] Fixes #5856. Adds document protocol at the beginning of URLs without protocol (thanks go to skrings for the initial pull request). Simplifies cross-domain detection regexp and logic as a consequence. Also took the opportunity to remove an unused variable. Unit test added. --- src/ajax.js | 19 ++++++++----------- test/unit/ajax.js | 12 ++++++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/ajax.js b/src/ajax.js index 8f8bc60ab..a6ee676d4 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -7,15 +7,13 @@ var r20 = /%20/g, rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, rquery = /\?/, rscript = /)<[^<]*)*<\/script>/gi, rselectTextarea = /^(?:select|textarea)/i, rspacesAjax = /\s+/, rts = /([?&])_=[^&]*/, - rurl = /^(\w+:)?\/\/([^\/?#:]+)(?::(\d+))?/, - - // Slice function - sliceFunc = Array.prototype.slice, + rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/, // Keep a copy of the old load method _load = jQuery.fn.load, @@ -544,8 +542,9 @@ jQuery.extend({ }; // Remove hash character (#7531: and string promotion) + // Add protocol if not provided (#5856: IE7 issue with protocol-less urls) // We also use the url parameter if available - s.url = ( "" + ( url || s.url ) ).replace( rhash, "" ); + s.url = ( "" + ( url || s.url ) ).replace( rhash, "" ).replace( rprotocol, protocol + "//" ); // Extract dataTypes list s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax ); @@ -553,12 +552,10 @@ jQuery.extend({ // Determine if a cross-domain request is in order if ( !s.crossDomain ) { parts = rurl.exec( s.url.toLowerCase() ); - s.crossDomain = !!( - parts && - ( parts[ 1 ] && parts[ 1 ] != protocol || - parts[ 2 ] != loc.hostname || - ( parts[ 3 ] || ( ( parts[ 1 ] || protocol ) === "http:" ? 80 : 443 ) ) != - ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) ) + s.crossDomain = !!( parts && + ( parts[ 1 ] != protocol || parts[ 2 ] != loc.hostname || + ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != + ( loc.port || ( protocol === "http:" ? 80 : 443 ) ) ) ); } diff --git a/test/unit/ajax.js b/test/unit/ajax.js index abe90c88e..2624b5583 100644 --- a/test/unit/ajax.js +++ b/test/unit/ajax.js @@ -415,6 +415,18 @@ test(".ajax() - contentType" , function() { }); +test(".ajax() - protocol-less urls", function() { + expect(1); + + jQuery.ajax({ + url: "//somedomain.com", + beforeSend: function( xhr, settings ) { + equals(settings.url, location.protocol + "//somedomain.com", "Make sure that the protocol is added."); + return false; + } + }); +}); + test(".ajax() - hash", function() { expect(3);