diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index bd0ba61662..182188b186 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -75,6 +75,30 @@ OpenLayers.Layer.prototype = { } this.map = null; }, + + /** + * @param {String} newName + * @param {Hash} newOptions + * + * @returns A clone of this OpenLayers.Layer + * @type OpenLayers.Layer + */ + clone: function (newName, newOptions) { + + if (newName == null) { + newName = this.name; + } + + var mergedOptions = null; + if ( (this.options != null) || (newOptions != null) ) { + // only merge options if there were or will be + mergedOptions = Object.extend( {}, this.options); + Object.extend(mergedOptions, newOptions); + } + + return new OpenLayers.Layer(newName, mergedOptions); + }, + /** * @params {OpenLayers.Bounds} bound diff --git a/tests/test_Layer.html b/tests/test_Layer.html index 7b556e4a4d..4ec0096c4d 100644 --- a/tests/test_Layer.html +++ b/tests/test_Layer.html @@ -12,6 +12,50 @@ t.eq( layer.name, "Test Layer", "layer.name is correct" ); } + function test_02_Layer_clone (t) { + t.plan( 7 ); + + var options = { chicken: 151, foo: "bar" }; + var layer = new OpenLayers.Layer('Test Layer', options); + var clone = layer.clone(); + + t.ok( clone instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" ); + t.eq( clone.name, "Test Layer", "default clone.name is correct" ); + t.ok( ((clone.options["chicken"] == 151) && (clone.options["foo"] == "bar")), "clone.options correctly set" ); + + + var layer = new OpenLayers.Layer('Test Layer'); + var clone = layer.clone(); + + t.ok( clone.options == null, "clone.options correctly left at null" ); + + + + var layer = new OpenLayers.Layer('Test Layer', options); + var clone = layer.clone("Special Bonus"); + + t.eq( clone.name, "Special Bonus", "clone.name is correct" ); + + + + var newOptions = { foo: "stoo", clear: "skies" }; + var layer = new OpenLayers.Layer('Test Layer', options); + var clone = layer.clone("Special Bonus", newOptions); + + t.ok( ((clone.options["chicken"] == 151) && + (clone.options["foo"] == "stoo") && + (clone.options["clear"] == "skies")), "clone.options correctly merged" ); + + + var newOptions = { chicken: 151, foo: "stoo", clear: "skies" }; + var layer = new OpenLayers.Layer('Test Layer'); + var clone = layer.clone("Special Bonus", newOptions); + + t.ok( ((clone.options["foo"] == "stoo") && + (clone.options["clear"] == "skies")), "clone.options correctly merged" ); + + } + function test_99_Layer_destroy (t) { t.plan( 1 ); layer = new OpenLayers.Layer('Test Layer');