isEquivilantURL() support for browsers, as best we can figure it. Tested in
IE6, FF, Moz, Opera, IE7, Safari. This may not work in all situations. It's included in util for utility, but it is possible it may fail in some cases in some environments. If you find this to be the case, please open a bug and we will work to resolve it. git-svn-id: http://svn.openlayers.org/trunk/openlayers@2162 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -746,11 +746,36 @@ OpenLayers.Util.isEquivalentUrl = function(url1, url2, options) {
|
||||
urlObj1 = OpenLayers.Util.createUrlObject(url1, options);
|
||||
urlObj2 = OpenLayers.Util.createUrlObject(url2, options);
|
||||
|
||||
//compare keys (host, port, etc)
|
||||
//compare all keys (host, port, etc)
|
||||
for(var key in urlObj1) {
|
||||
if ( (key != "args") && (urlObj1[key] != urlObj2[key]) ) {
|
||||
return false;
|
||||
if (options.test) {
|
||||
alert(key + "\n1:" + urlObj1[key] + "\n2:" + urlObj2[key]);
|
||||
}
|
||||
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
|
||||
@@ -788,25 +813,8 @@ OpenLayers.Util.createUrlObject = function(url, options) {
|
||||
}
|
||||
|
||||
var a = document.createElement('a');
|
||||
|
||||
a.href = url;
|
||||
|
||||
//protocol
|
||||
urlObject.protocol = a.protocol;
|
||||
|
||||
//pathname (this part allows for relative <-> absolute comparison)
|
||||
urlObject.pathname = a.pathname;
|
||||
|
||||
//Test to see if the pathname includes the arguments (this happens in Opera)
|
||||
var qIndex = urlObject.pathname.indexOf("?");
|
||||
if (qIndex != -1) {
|
||||
urlObject.pathname = urlObject.pathname.substring(0, qIndex);
|
||||
}
|
||||
|
||||
|
||||
//hash
|
||||
urlObject.hash = (options.ignoreHash) ? "" : a.hash;
|
||||
|
||||
//host (without port)
|
||||
urlObject.host = a.host;
|
||||
var port = a.port;
|
||||
@@ -814,13 +822,104 @@ OpenLayers.Util.createUrlObject = function(url, options) {
|
||||
var newHostLength = urlObject.host.length - (port.length);
|
||||
urlObject.host = urlObject.host.substring(0, newHostLength);
|
||||
}
|
||||
|
||||
|
||||
//protocol
|
||||
urlObject.protocol = a.protocol;
|
||||
|
||||
//port
|
||||
urlObject.port = ((port == "80") && (options.ignorePort80)) ? "" : port;
|
||||
|
||||
//hash
|
||||
urlObject.hash = (options.ignoreHash) ? "" : a.hash;
|
||||
|
||||
//args
|
||||
urlObject.args = OpenLayers.Util.getArgs(a.search);
|
||||
var queryString = a.search;
|
||||
if (!queryString) {
|
||||
var qMark = url.indexOf("?");
|
||||
queryString = (qMark != -1) ? url.substr(qMark) : "";
|
||||
}
|
||||
urlObject.args = OpenLayers.Util.getArgs(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;
|
||||
}
|
||||
|
||||
if ((urlObject.protocol == "file:") || (urlObject.protocol == "")) {
|
||||
urlObject.host = "localhost";
|
||||
}
|
||||
|
||||
return urlObject;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {String} url
|
||||
*
|
||||
* @returns The string with all queryString and Hash removed
|
||||
* @type String
|
||||
*/
|
||||
OpenLayers.Util.removeTail = function(url) {
|
||||
var head = null;
|
||||
|
||||
var qMark = url.indexOf("?");
|
||||
var hashMark = url.indexOf("#");
|
||||
|
||||
if (qMark == -1) {
|
||||
head = (hashMark != -1) ? url.substr(0,hashMark) : url;
|
||||
} else {
|
||||
head = (hashMark != -1) ? url.substr(0,Math.min(qMark, hashMark))
|
||||
: url.substr(0, qMark);
|
||||
}
|
||||
return head;
|
||||
};
|
||||
@@ -547,8 +547,8 @@
|
||||
|
||||
|
||||
//PATHNAME
|
||||
url1 = "foo.html";
|
||||
url2 = "../tests/foo.html";
|
||||
url1 = "foo.html?bar=now#go";
|
||||
url2 = "../tests/../tests/foo.html?bar=now#go";
|
||||
|
||||
t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "relative vs. absolute paths works");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user