From 7232cfa3a08c4c95b7a714592de7c9c97fa1a3a2 Mon Sep 17 00:00:00 2001 From: crschmidt Date: Mon, 22 Jan 2007 23:26:32 +0000 Subject: [PATCH] Pull up patches for the following bugs from trunk: #385: building for windows users (fix license) #453: IE gives new DOM elements a parent with fragment node type #454: Fix tests which are breaking in Opera #455: Util.isEquivalentUrl broken in Opera #463: map.setBaseLayer is a bit funky #464: Overview Map dissappears when on permalinked page #465: allow controls to live outside viewport (for real) #466: HTMLDivElement is still undefined in IE7 (but OpenLayers.Util.alphaHack() is now false) #467: isEquivalentURL() not complete for IE #468: Overview MapLosing Rectangle #469: Default marker is incorrectly centered #470: Can not use "search" property IE7 #473: Remove call to checkImgURL #474: overview map isn't properly updated when the argparser kicks in git-svn-id: http://svn.openlayers.org/branches/openlayers/2.3@2181 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- build/build.py | 6 +- lib/OpenLayers/Control/OverviewMap.js | 30 +++--- lib/OpenLayers/Events.js | 5 +- lib/OpenLayers/Map.js | 21 ++-- lib/OpenLayers/Marker.js | 6 +- lib/OpenLayers/Tile/Image.js | 16 ++- lib/OpenLayers/Util.js | 145 ++++++++++++++++++++++---- tests/test_Icon.html | 6 +- tests/test_Layer_EventPane.html | 3 +- tests/test_Layer_WMS.html | 6 +- tests/test_Marker.html | 4 +- tests/test_Popup.html | 5 +- tests/test_Util.html | 39 +++---- theme/default/style.css | 1 + 14 files changed, 213 insertions(+), 80 deletions(-) diff --git a/build/build.py b/build/build.py index 9ac625411d..d268663504 100755 --- a/build/build.py +++ b/build/build.py @@ -14,12 +14,12 @@ if len(sys.argv) > 1: if len(sys.argv) > 2: outputFilename = sys.argv[2] -print "Adding license file." -merged = file("license.txt").read() print "Merging libraries." -merged += mergejs.run(sourceDirectory, None, configFilename) +merged = mergejs.run(sourceDirectory, None, configFilename) print "Compressing." minimized = jsmin.jsmin(merged) +print "Adding license file." +minimized = file("license.txt").read() + minimized print "Writing to %s." % outputFilename file(outputFilename, "w").write(minimized) diff --git a/lib/OpenLayers/Control/OverviewMap.js b/lib/OpenLayers/Control/OverviewMap.js index 0097ae87a7..be413614e0 100644 --- a/lib/OpenLayers/Control/OverviewMap.js +++ b/lib/OpenLayers/Control/OverviewMap.js @@ -133,7 +133,6 @@ OpenLayers.Control.OverviewMap.prototype = OpenLayers.Event.stop(e); }); this.rectEvents = new OpenLayers.Events(this, this.extentRectangle); - this.rectEvents.register('mouseover', this, this.rectMouseOver); this.rectEvents.register('mouseout', this, this.rectMouseOut); this.rectEvents.register('mousedown', this, this.rectMouseDown); this.rectEvents.register('mousemove', this, this.rectMouseMove); @@ -147,8 +146,7 @@ OpenLayers.Control.OverviewMap.prototype = // Optionally add min/max buttons if the control will go in the // map viewport. - if(!this.div.parentNode || - (this.div.parentNode.className == 'olMapViewport')) { + if(!this.outsideViewport) { this.div.className = 'olControlOverviewMapContainer'; var imgLocation = OpenLayers.Util.getImagesLocation(); // maximize button div @@ -187,7 +185,9 @@ OpenLayers.Control.OverviewMap.prototype = // show the overview map this.element.style.display = ''; } - + if(this.map.getExtent()) { + this.update(); + } return this.div; }, @@ -196,22 +196,24 @@ OpenLayers.Control.OverviewMap.prototype = this.map.events.unregister("changebaselayer", this, this.baseLayerDraw); }, - /** - * @param {OpenLayers.Event} evt - */ - rectMouseOver: function (evt) { - this.extentRectangle.style.cursor = 'move'; - }, - /** * @param {OpenLayers.Event} evt */ rectMouseOut: function (evt) { - this.extentRectangle.style.cursor = 'default'; if(this.rectDragStart != null) { if(this.performedRectDrag) { - this.updateMapToRect(); - } + this.rectMouseMove(evt); + var rectPxBounds = this.getRectPxBounds(); + // if we're off of the overview map, update the main map + // otherwise, keep moving the rect + if((rectPxBounds.top <= 0) || (rectPxBounds.left <= 0) || + (rectPxBounds.bottom >= this.size.h - this.hComp) || + (rectPxBounds.right >= this.size.w - this.wComp)) { + this.updateMapToRect(); + } else { + return; + } + } document.onselectstart = null; this.rectDragStart = null; } diff --git a/lib/OpenLayers/Events.js b/lib/OpenLayers/Events.js index ac6151139e..17afdfff3b 100644 --- a/lib/OpenLayers/Events.js +++ b/lib/OpenLayers/Events.js @@ -272,7 +272,10 @@ OpenLayers.Events.prototype = { evt.element = this.element; // execute all callbacks registered for specified type - var listeners = this.listeners[type]; + // get a clone of the listeners array to + // allow for splicing during callbacks + var listeners = (this.listeners[type]) ? + this.listeners[type].slice() : null; if ((listeners != null) && (listeners.length > 0)) { for (var i = 0; i < listeners.length; i++) { var callback = listeners[i]; diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index 68b4ccfd28..6e2dbf809b 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -431,16 +431,19 @@ OpenLayers.Map.prototype = { * @param {Boolean} noEvent */ setBaseLayer: function(newBaseLayer, noEvent) { - var oldBaseLayer = this.baseLayer; + var oldExtent = null; + if(this.baseLayer) { + oldExtent = this.baseLayer.getExtent(); + } - if (newBaseLayer != oldBaseLayer) { + if (newBaseLayer != this.baseLayer) { // is newBaseLayer an already loaded layer? if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) { // make the old base layer invisible - if (oldBaseLayer != null) { - oldBaseLayer.setVisibility(false, noEvent); + if (this.baseLayer != null) { + this.baseLayer.setVisibility(false, noEvent); } // set new baselayer and make it visible @@ -450,10 +453,10 @@ OpenLayers.Map.prototype = { //redraw all layers var center = this.getCenter(); if (center != null) { - if (oldBaseLayer == null) { + if (oldExtent == null) { this.setCenter(center); } else { - this.zoomToExtent(oldBaseLayer.getExtent()); + this.zoomToExtent(oldExtent); } } @@ -480,11 +483,13 @@ OpenLayers.Map.prototype = { * @param {OpenLayers.Pixel} px */ addControlToMap: function (control, px) { + // If a control doesn't have a div at this point, it belongs in the + // viewport. + control.outsideViewport = (control.div != null); control.setMap(this); var div = control.draw(px); if (div) { - // only elements without parents should be appended to the viewport - if(!div.parentNode) { + if(!control.outsideViewport) { div.style.zIndex = this.Z_INDEX_BASE['Control'] + this.controls.length; this.viewPortDiv.appendChild( div ); diff --git a/lib/OpenLayers/Marker.js b/lib/OpenLayers/Marker.js index c370e828cc..3192096c59 100644 --- a/lib/OpenLayers/Marker.js +++ b/lib/OpenLayers/Marker.js @@ -126,7 +126,11 @@ OpenLayers.Marker.prototype = { OpenLayers.Marker.defaultIcon = function() { var url = OpenLayers.Util.getImagesLocation() + "marker.png"; var size = new OpenLayers.Size(21, 25); - return new OpenLayers.Icon(url, size); + var calculateOffset = function(size) { + return new OpenLayers.Pixel(-(size.w/2), -size.h); + }; + + return new OpenLayers.Icon(url, size, null, calculateOffset); }; diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js index 113e5add5c..6539e933ed 100644 --- a/lib/OpenLayers/Tile/Image.js +++ b/lib/OpenLayers/Tile/Image.js @@ -117,12 +117,14 @@ OpenLayers.Tile.Image.prototype = this.imgDiv.className = 'olTileImage'; - /* checkImgURL *should* pretty predictably get called after the - createImage / createAlphaImageDiv onLoad handler */ + /* checkImgURL used to be used to called as a work around, but it + ended up hiding problems instead of solving them and broke things + like relative URLs. See discussion on the dev list: + http://openlayers.org/pipermail/dev/2007-January/000205.html OpenLayers.Event.observe( this.imgDiv, "load", this.checkImgURL.bindAsEventListener(this) ); - + */ this.layer.div.appendChild(this.imgDiv); if(this.layer.opacity != null) { @@ -139,6 +141,14 @@ OpenLayers.Tile.Image.prototype = * the imgDiv display to 'none', as either (a) it will be reset to visible * when the new URL loads in the image, or (b) we don't want to display * this tile after all because its new bounds are outside our maxExtent. + * + * This function should no longer be neccesary with the improvements to + * Grid.js in OpenLayers 2.3. The lack of a good isEquivilantURL function + * caused problems in 2.2, but it's possible that with the improved + * isEquivilant URL function, this might be neccesary at some point. + * + * See discussion in the thread at + * http://openlayers.org/pipermail/dev/2007-January/000205.html * * @private */ diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js index 84f1a538ab..e58a096869 100644 --- a/lib/OpenLayers/Util.js +++ b/lib/OpenLayers/Util.js @@ -568,11 +568,10 @@ OpenLayers.Util.distVincenty=function(p1, p2) { */ OpenLayers.Util.getArgs = function(url) { if(url == null) { - var query = window.location.search.substring(1); - } else { - var query = (url.indexOf('?') == -1) ? - '' : url.substring(url.indexOf('?') + 1); + url = window.location.href; } + var query = (url.indexOf('?') != -1) ? url.substring(url.indexOf('?') + 1) : ''; + var args = new Object(); pairs = query.split(/[&;]/); for(var i = 0; i < pairs.length; ++i) { @@ -747,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 @@ -789,18 +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; - - //hash - urlObject.hash = (options.ignoreHash) ? "" : a.hash; - //host (without port) urlObject.host = a.host; var port = a.port; @@ -808,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; }; - \ No newline at end of file + +/** + * @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; +}; \ No newline at end of file diff --git a/tests/test_Icon.html b/tests/test_Icon.html index c93d3e31db..5aaba8cd8f 100644 --- a/tests/test_Icon.html +++ b/tests/test_Icon.html @@ -24,16 +24,14 @@ t.eq( cloned.url, "b", "cloned.url does change when edited" ); } - function test_02_Marker_setOpacity(t) { + function test_03_Marker_setOpacity(t) { t.plan( 2 ); icon = new OpenLayers.Icon("a",new OpenLayers.Size(5,6)); - t.ok(!icon.imageDiv.style.opacity, "default icon has no opacity"); icon.setOpacity(0.5); - - t.eq(icon.imageDiv.style.opacity + "", "0.5", "icon.setOpacity() works"); + t.eq(parseFloat(icon.imageDiv.style.opacity), 0.5, "icon.setOpacity() works"); } // --> diff --git a/tests/test_Layer_EventPane.html b/tests/test_Layer_EventPane.html index fc100d63fd..6e6efb21cf 100644 --- a/tests/test_Layer_EventPane.html +++ b/tests/test_Layer_EventPane.html @@ -3,6 +3,7 @@