From 0b0d04b637cb41e49618c728a84ea1d92a3a814b Mon Sep 17 00:00:00 2001 From: crschmidt Date: Wed, 27 May 2009 23:46:23 +0000 Subject: [PATCH] Pull up changes for 2.8. Fix for ArcIMS GetFeatureInfo broken (Closes #2110) createUrlObject not working in IE (Closes #2060) git-svn-id: http://svn.openlayers.org/branches/openlayers/2.8@9414 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Layer/ArcIMS.js | 2 +- lib/OpenLayers/Util.js | 125 ++++++--------------------------- tests/Util.html | 110 +++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 105 deletions(-) diff --git a/lib/OpenLayers/Layer/ArcIMS.js b/lib/OpenLayers/Layer/ArcIMS.js index b3a1ddb791..834fdcd51b 100644 --- a/lib/OpenLayers/Layer/ArcIMS.js +++ b/lib/OpenLayers/Layer/ArcIMS.js @@ -412,7 +412,7 @@ OpenLayers.Layer.ArcIMS = OpenLayers.Class(OpenLayers.Layer.Grid, { if (!arcxml.iserror()) { // if the arcxml is not an error, call the callback with the features parsed - callback.call(scope, arcxml.features); + callback.call(scope, response.features); } else { // if the arcxml is an error, return null features selected callback.call(scope, null); diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js index 3a3ef27493..caa0a59e75 100644 --- a/lib/OpenLayers/Util.js +++ b/lib/OpenLayers/Util.js @@ -1282,36 +1282,13 @@ OpenLayers.Util.isEquivalentUrl = function(url1, url2, options) { var urlObj1 = OpenLayers.Util.createUrlObject(url1, options); var urlObj2 = OpenLayers.Util.createUrlObject(url2, options); - //compare all keys (host, port, etc) + //compare all keys except for "args" (treated below) for(var key in urlObj1) { - if (options.test) { - OpenLayers.Console.userError(key + "\n1:" + urlObj1[key] + "\n2:" + urlObj2[key]); + if(key !== "args") { + if(urlObj1[key] != urlObj2[key]) { + return false; + } } - var val1 = urlObj1[key]; - var val2 = urlObj2[key]; - - switch(key) { - case "args": - //do nothing, they'll be treated below - break; - case "host": - case "port": - case "protocol": - if ((val1 == "") || (val2 == "")) { - //these will be blank for relative urls, so no need to - // compare them here -- call break. - // - break; - } - // otherwise continue with default compare - // - default: - if ( (key != "args") && (urlObj1[key] != urlObj2[key]) ) { - return false; - } - break; - } - } // compare search args - irrespective of order @@ -1350,7 +1327,7 @@ OpenLayers.Util.createUrlObject = function(url, options) { if(!(/^\w+:\/\//).test(url)) { var loc = window.location; var port = loc.port ? ":" + loc.port : ""; - var fullUrl = loc.protocol + "//" + loc.host + port; + var fullUrl = loc.protocol + "//" + loc.host.split(":").shift() + port; if(url.indexOf("/") === 0) { // full pathname url = fullUrl + url; @@ -1371,27 +1348,23 @@ OpenLayers.Util.createUrlObject = function(url, options) { var urlObject = {}; - //host (without port) - // if we don't have a host (which is the case with URLs starting with "/" - // in IE), take the window location's host to match other browsers that - // fill in the window's location host automatically - urlObject.host = a.host || window.location.host; - var port = a.port; - if (port.length > 0) { - var newHostLength = urlObject.host.length - (port.length); - urlObject.host = urlObject.host.substring(0, newHostLength); - } + //host (without port) + urlObject.host = a.host.split(":").shift(); - //protocol + //protocol urlObject.protocol = a.protocol; - //port - urlObject.port = ((port == "80") && (options.ignorePort80)) ? "" : port; - - //hash - urlObject.hash = (options.ignoreHash) ? "" : a.hash; + //port (get uniform browser behavior with port 80 here) + if(options.ignorePort80) { + urlObject.port = (a.port == "80" || a.port == "0") ? "" : a.port; + } else { + urlObject.port = (a.port == "" || a.port == "0") ? "80" : a.port; + } + + //hash + urlObject.hash = (options.ignoreHash || a.hash === "#") ? "" : a.hash; - //args + //args var queryString = a.search; if (!queryString) { var qMark = url.indexOf("?"); @@ -1399,65 +1372,9 @@ OpenLayers.Util.createUrlObject = function(url, options) { } urlObject.args = OpenLayers.Util.getParameters(queryString); - //pathname (this part allows for relative <-> absolute comparison) - if ( ((urlObject.protocol == "file:") && (url.indexOf("file:") != -1)) || - ((urlObject.protocol != "file:") && (urlObject.host != "")) ) { - - urlObject.pathname = a.pathname; - - //Test to see if the pathname includes the arguments (Opera) - var qIndex = urlObject.pathname.indexOf("?"); - if (qIndex != -1) { - urlObject.pathname = urlObject.pathname.substring(0, qIndex); - } - - } else { - var relStr = OpenLayers.Util.removeTail(url); - - var backs = 0; - do { - var index = relStr.indexOf("../"); - - if (index == 0) { - backs++; - relStr = relStr.substr(3); - } else if (index >= 0) { - var prevChunk = relStr.substr(0,index - 1); - - var slash = prevChunk.indexOf("/"); - prevChunk = (slash != -1) ? prevChunk.substr(0, slash +1) - : ""; - - var postChunk = relStr.substr(index + 3); - relStr = prevChunk + postChunk; - } - } while(index != -1); - - var windowAnchor = document.createElement("a"); - var windowUrl = window.location.href; - if (options.ignoreCase) { - windowUrl = windowUrl.toLowerCase(); - } - windowAnchor.href = windowUrl; - - //set protocol of window - urlObject.protocol = windowAnchor.protocol; - - var splitter = (windowAnchor.pathname.indexOf("/") != -1) ? "/" : "\\"; - var dirs = windowAnchor.pathname.split(splitter); - dirs.pop(); //remove filename - while ((backs > 0) && (dirs.length > 0)) { - dirs.pop(); - backs--; - } - relStr = dirs.join("/") + "/"+ relStr; - urlObject.pathname = relStr; - } + //pathname (uniform browser behavior with leading "/") + urlObject.pathname = (a.pathname.charAt(0) == "/") ? a.pathname : "/" + a.pathname; - if ((urlObject.protocol == "file:") || (urlObject.protocol == "")) { - urlObject.host = "localhost"; - } - return urlObject; }; diff --git a/tests/Util.html b/tests/Util.html index 4ad9a59d6a..00a1f57779 100644 --- a/tests/Util.html +++ b/tests/Util.html @@ -680,6 +680,116 @@ t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "absolute and relative path without host works for "+url2) } + function test_createUrlObject(t) { + + var cases = [{ + url: "http://example.com/", + exp: { + protocol: "http:", + host: "example.com", + port: "80", + pathname: "/", + args: {}, + hash: "" + } + }, { + url: "http://example.com:80/", + opt: {ignorePort80: true}, + exp: { + protocol: "http:", + host: "example.com", + port: "", + pathname: "/", + args: {}, + hash: "" + } + }, { + url: "http://example.com/", + opt: {ignorePort80: true}, + exp: { + protocol: "http:", + host: "example.com", + port: "", + pathname: "/", + args: {}, + hash: "" + } + }, { + url: "http://example.com:88/", + exp: { + protocol: "http:", + host: "example.com", + port: "88", + pathname: "/", + args: {}, + hash: "" + } + }, { + url: "http://example.com:88/foo#bar", + exp: { + protocol: "http:", + host: "example.com", + port: "88", + pathname: "/foo", + args: {}, + hash: "#bar" + } + }, { + url: "http://example.com:88/?foo=bar", + exp: { + protocol: "http:", + host: "example.com", + port: "88", + pathname: "/", + args: {foo: "bar"}, + hash: "" + } + }, { + url: "http://example.com/bogus/../bogus/../path", + exp: { + protocol: "http:", + host: "example.com", + port: "80", + pathname: "/path", + args: {}, + hash: "" + } + }, { + url: "/relative#foo", + exp: { + protocol: window.location.protocol, + host: window.location.hostname, + port: window.location.port || "80", + pathname: "/relative", + args: {}, + hash: "#foo" + } + }, { + url: "../foo", + exp: { + protocol: window.location.protocol, + host: window.location.hostname, + port: window.location.port || "80", + pathname: (function() { + var parts = window.location.pathname.split("/"); + return parts.slice(0, parts.length -2).join("/") + "/foo"; + })(), + args: {}, + hash: "" + } + }]; + + t.plan(cases.length); + + var c, obj; + for(var i=0; i