From 4efa03eb59a43bde442bac2ea6360a2d7a987595 Mon Sep 17 00:00:00 2001 From: Arjen Kopinga Date: Wed, 22 Feb 2012 17:39:11 +0100 Subject: [PATCH 1/5] Fix for being able to select a feature from an invisible layer that uses the Canvas renderer --- lib/OpenLayers/Renderer/Canvas.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/OpenLayers/Renderer/Canvas.js b/lib/OpenLayers/Renderer/Canvas.js index 35939afdd2..199ca8f10d 100644 --- a/lib/OpenLayers/Renderer/Canvas.js +++ b/lib/OpenLayers/Renderer/Canvas.js @@ -787,6 +787,10 @@ OpenLayers.Renderer.Canvas = OpenLayers.Class(OpenLayers.Renderer, { */ getFeatureIdFromEvent: function(evt) { var featureId, feature; + + // if the drawing canvas isn't visible, return undefined. + if (this.root.style.display === "none") return feature; + if (this.hitDetection) { // this dragging check should go in the feature handler if (!this.map.dragging) { From bf834e6b8ef97f06904ea18b94d0fb92315a4737 Mon Sep 17 00:00:00 2001 From: Arjen Kopinga Date: Wed, 22 Feb 2012 17:44:31 +0100 Subject: [PATCH 2/5] being a good coder and adding braces around if statement body --- lib/OpenLayers/Renderer/Canvas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/OpenLayers/Renderer/Canvas.js b/lib/OpenLayers/Renderer/Canvas.js index 199ca8f10d..30ab7a6d99 100644 --- a/lib/OpenLayers/Renderer/Canvas.js +++ b/lib/OpenLayers/Renderer/Canvas.js @@ -789,7 +789,7 @@ OpenLayers.Renderer.Canvas = OpenLayers.Class(OpenLayers.Renderer, { var featureId, feature; // if the drawing canvas isn't visible, return undefined. - if (this.root.style.display === "none") return feature; + if (this.root.style.display === "none") { return feature; } if (this.hitDetection) { // this dragging check should go in the feature handler From f8189f2862b2010f149d1f135879496ab0e9dce9 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 23 Feb 2012 10:23:23 +0100 Subject: [PATCH 3/5] Added unit tests for hit detection on invisible canvas layer --- tests/Renderer/Canvas.html | 86 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/tests/Renderer/Canvas.html b/tests/Renderer/Canvas.html index bdec99948c..a19aa1f56f 100644 --- a/tests/Renderer/Canvas.html +++ b/tests/Renderer/Canvas.html @@ -348,6 +348,92 @@ } + // Extra test: hit detection on an invisible canvas should return undefined + function test_hitDetectionOnInvisibleLayer(t) { + if (!supported) { + t.plan(0); + return; + } + + var layer = new OpenLayers.Layer.Vector(null, { + isBaseLayer: true, + resolutions: [1], + styleMap: new OpenLayers.StyleMap({ + pointRadius: 5, + strokeWidth: 3, + fillColor: "red", + fillOpacity: 0.5, + strokeColor: "blue", + strokeOpacity: 0.75 + }), + renderers: ["Canvas"] + }); + + var map = new OpenLayers.Map({ + div: "map", + controls: [], + layers: [layer], + center: new OpenLayers.LonLat(0, 0), + zoom: 0 + }); + + layer.addFeatures([ + new OpenLayers.Feature.Vector( + new OpenLayers.Geometry.Point(-100, 0) + ), + new OpenLayers.Feature.Vector( + OpenLayers.Geometry.fromWKT("LINESTRING(-50 0, 50 0)") + ), + new OpenLayers.Feature.Vector( + OpenLayers.Geometry.fromWKT("POLYGON((100 -25, 150 -25, 150 25, 100 25, 100 -25), (120 -5, 130 -5, 130 5, 120 5, 120 -5))") + ) + ]); + + var cases = [{ + msg: "center of invisible point", x: -100, y: 0, id: layer.features[0].id + }, { + msg: "edge of invisible point", x: -103, y: 3, id: layer.features[0].id + }, { + msg: "outside invisible point", x: -110, y: 3, id: null + }, { + msg: "center of invisible line", x: 0, y: 0, id: layer.features[1].id + }, { + msg: "edge of invisible line", x: 0, y: 1, id: layer.features[1].id + }, { + msg: "outside invisible line", x: 0, y: 5, id: null + }, { + msg: "inside invisible polygon", x: 110, y: 0, id: layer.features[2].id + }, { + msg: "edge of invisible polygon", x: 99, y: 0, id: layer.features[2].id + }, { + msg: "inside invisible polygon hole", x: 125, y: 0, id: null + }, { + msg: "outside invisible polygon", x: 155, y: 0, id: null + }]; + + function px(x, y) { + return map.getPixelFromLonLat( + new OpenLayers.LonLat(x, y) + ); + } + + var num = cases.length; + t.plan(num); + var c, feature; + + // Hit detection on an invisible canvas layer should always return undefined + layer.setVisibility(false); + + for (var i=0; i Date: Tue, 28 Feb 2012 10:15:55 +0100 Subject: [PATCH 4/5] simplified unit test for hit detection on invisible canvas --- tests/Renderer/Canvas.html | 94 +++----------------------------------- 1 file changed, 7 insertions(+), 87 deletions(-) diff --git a/tests/Renderer/Canvas.html b/tests/Renderer/Canvas.html index a19aa1f56f..303b56732d 100644 --- a/tests/Renderer/Canvas.html +++ b/tests/Renderer/Canvas.html @@ -336,104 +336,24 @@ } var num = cases.length; - t.plan(num); + t.plan(2 * num); var c, feature; for (var i=0; i Date: Tue, 28 Feb 2012 10:45:18 +0100 Subject: [PATCH 5/5] Simplifying logic that returns undefined when root is invisible. --- lib/OpenLayers/Renderer/Canvas.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/OpenLayers/Renderer/Canvas.js b/lib/OpenLayers/Renderer/Canvas.js index 30ab7a6d99..ee90db4e38 100644 --- a/lib/OpenLayers/Renderer/Canvas.js +++ b/lib/OpenLayers/Renderer/Canvas.js @@ -788,10 +788,7 @@ OpenLayers.Renderer.Canvas = OpenLayers.Class(OpenLayers.Renderer, { getFeatureIdFromEvent: function(evt) { var featureId, feature; - // if the drawing canvas isn't visible, return undefined. - if (this.root.style.display === "none") { return feature; } - - if (this.hitDetection) { + if (this.hitDetection && this.root.style.display !== "none") { // this dragging check should go in the feature handler if (!this.map.dragging) { var xy = evt.xy;