Only valid characters in generated ids.

This commit is contained in:
Marc Jansen
2013-02-04 16:43:34 +01:00
parent 39a5aed5a6
commit 73c5dbd8dc
2 changed files with 60 additions and 5 deletions

View File

@@ -7,6 +7,7 @@
* @requires OpenLayers/Control.js * @requires OpenLayers/Control.js
* @requires OpenLayers/Lang.js * @requires OpenLayers/Lang.js
* @requires OpenLayers/Console.js * @requires OpenLayers/Console.js
* @requires OpenLayers/Util.js
* @requires OpenLayers/Events/buttonclick.js * @requires OpenLayers/Events/buttonclick.js
*/ */
@@ -52,7 +53,6 @@ OpenLayers.Control.LayerSwitcher =
*/ */
layerStates: null, layerStates: null,
// DOM Elements // DOM Elements
/** /**
@@ -325,8 +325,14 @@ OpenLayers.Control.LayerSwitcher =
: layer.getVisibility(); : layer.getVisibility();
// create input element // create input element
var inputElem = document.createElement("input"); var inputElem = document.createElement("input"),
inputElem.id = this.id + "_input_" + layer.name; // The input shall have an id attribute so we can use
// labels to interact with them.
inputId = OpenLayers.Util.createUniqueID(
this.id + "_input_"
);
inputElem.id = inputId;
inputElem.name = (baseLayer) ? this.id + "_baseLayers" : layer.name; inputElem.name = (baseLayer) ? this.id + "_baseLayers" : layer.name;
inputElem.type = (baseLayer) ? "radio" : "checkbox"; inputElem.type = (baseLayer) ? "radio" : "checkbox";
inputElem.value = layer.name; inputElem.value = layer.name;
@@ -342,6 +348,8 @@ OpenLayers.Control.LayerSwitcher =
// create span // create span
var labelSpan = document.createElement("label"); var labelSpan = document.createElement("label");
// this isn't the DOM attribute 'for', but an arbitrary name we
// use to find the appropriate input element in <onButtonClick>
labelSpan["for"] = inputElem.id; labelSpan["for"] = inputElem.id;
OpenLayers.Element.addClass(labelSpan, "labelSpan olButton"); OpenLayers.Element.addClass(labelSpan, "labelSpan olButton");
labelSpan._layer = layer.id; labelSpan._layer = layer.id;

View File

@@ -88,13 +88,13 @@
control = new OpenLayers.Control.LayerSwitcher(); control = new OpenLayers.Control.LayerSwitcher();
map.addControl(control); map.addControl(control);
var wmsInput = OpenLayers.Util.getElement(control.id + "_input_" + layer.name); var wmsInput = control.div.childNodes[0].childNodes[1].childNodes[0];
t.ok(wmsInput != null, "correctly makes an input for wms layer"); t.ok(wmsInput != null, "correctly makes an input for wms layer");
t.eq(wmsInput.type, "radio", "wms correctly made a radio button"); t.eq(wmsInput.type, "radio", "wms correctly made a radio button");
t.eq(wmsInput.name, control.id + "_baseLayers", "wms correctly named"); t.eq(wmsInput.name, control.id + "_baseLayers", "wms correctly named");
t.eq(wmsInput.value, layer.name, "wms correctly valued"); t.eq(wmsInput.value, layer.name, "wms correctly valued");
var markersInput = OpenLayers.Util.getElement(control.id + "_input_" + markers.name); var markersInput = control.div.childNodes[0].childNodes[3].childNodes[0];
t.ok(markersInput != null, "correctly makes an input for markers layer"); t.ok(markersInput != null, "correctly makes an input for markers layer");
t.eq(markersInput.type, "checkbox", "wms correctly made a radio button"); t.eq(markersInput.type, "checkbox", "wms correctly made a radio button");
t.eq(markersInput.name, markers.name, "wms correctly named"); t.eq(markersInput.name, markers.name, "wms correctly named");
@@ -191,7 +191,54 @@
t.eq(control.div.childNodes[0].childNodes[0].style.display, "" , "Base layer display on when visble base layer"); t.eq(control.div.childNodes[0].childNodes[0].style.display, "" , "Base layer display on when visble base layer");
} }
// See e.g. https://github.com/openlayers/openlayers/issues/866
function test_Control_LayerSwitcher_validIds(t){
t.plan(2);
// setup
var layername = "Name with spaces & illegal characters * + ~ ` ' ? )",
map = new OpenLayers.Map("map", {
controls: [
new OpenLayers.Control.LayerSwitcher()
],
layers: [
new OpenLayers.Layer.WMS(
layername,
"http://example.com/"
),
// add another layer with the same name, the generated id
// must be different
new OpenLayers.Layer.WMS(
layername,
"http://example.com/"
)
]
});
var baselayerDiv = map.controls[0].div.childNodes[0].childNodes[1],
firstGeneratedInputId = baselayerDiv.childNodes[0].id,
secondGeneratedInputId = baselayerDiv.childNodes[1].id,
// legal ids start with a letter and are followed only by word
// characters (letters, digits, and underscores) plus the dash (-)
// This is only a subset of all allowed charcters inside of ids.
allowedIdChars = (/^[a-zA-Z]{1}[\w-]*$/g);
// tests
// validity
t.ok(
allowedIdChars.test(firstGeneratedInputId),
"id only contains letters, digits, underscores and dashes. It " +
"starts with a letter."
);
// uniqueness
t.ok(
firstGeneratedInputId !== secondGeneratedInputId,
"generated ids are different even for equal layernames"
);
// teardown
map.destroy();
}
</script> </script>
</head> </head>