From 5ac8bd6a894198e9baba7593bf92ed924bcc99ed Mon Sep 17 00:00:00 2001 From: euzuro Date: Wed, 30 Jul 2008 17:10:04 +0000 Subject: [PATCH] fix broken register() on events r=tschaub (Closes #1502) git-svn-id: http://svn.openlayers.org/trunk/openlayers@7610 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Events.js | 19 +++++------ tests/Events.html | 73 ++++++++++++++++++++++++++++++++++++---- tests/Layer/Grid.html | 13 +++++-- 3 files changed, 86 insertions(+), 19 deletions(-) diff --git a/lib/OpenLayers/Events.js b/lib/OpenLayers/Events.js index 80a95ff7ee..334c1f6091 100644 --- a/lib/OpenLayers/Events.js +++ b/lib/OpenLayers/Events.js @@ -406,7 +406,6 @@ OpenLayers.Events = OpenLayers.Class({ initialize: function (object, element, eventTypes, fallThrough) { this.object = object; this.element = element; - this.eventTypes = eventTypes; this.fallThrough = fallThrough; this.listeners = {}; @@ -418,9 +417,10 @@ OpenLayers.Events = OpenLayers.Class({ // if eventTypes is specified, create a listeners list for each // custom application event. - if (this.eventTypes != null) { - for (var i = 0; i < this.eventTypes.length; i++) { - this.addEventType(this.eventTypes[i]); + this.eventTypes = []; + if (eventTypes != null) { + for (var i = 0; i < eventTypes.length; i++) { + this.addEventType(eventTypes[i]); } } @@ -457,6 +457,7 @@ OpenLayers.Events = OpenLayers.Class({ */ addEventType: function(eventName) { if (!this.listeners[eventName]) { + this.eventTypes.push(eventName); this.listeners[eventName] = []; } }, @@ -532,16 +533,14 @@ OpenLayers.Events = OpenLayers.Class({ */ register: function (type, obj, func) { - if (func != null && - ((this.eventTypes && OpenLayers.Util.indexOf(this.eventTypes, type) != -1) || - OpenLayers.Util.indexOf(this.BROWSER_EVENTS, type) != -1)) { + if ( (func != null) && + (OpenLayers.Util.indexOf(this.eventTypes, type) != -1) ) { + if (obj == null) { obj = this.object; } var listeners = this.listeners[type]; - if (listeners != null) { - listeners.push( {obj: obj, func: func} ); - } + listeners.push( {obj: obj, func: func} ); } }, diff --git a/tests/Events.html b/tests/Events.html index c193f8857e..238ec54af1 100644 --- a/tests/Events.html +++ b/tests/Events.html @@ -12,7 +12,7 @@ var eventTypes = ["doThingA", "doThingB", "doThingC"]; var browserTypes = OpenLayers.Events.prototype.BROWSER_EVENTS; - var totalTests = 5 + eventTypes.length + browserTypes.length; + var totalTests = 4 + 2*eventTypes.length + 2*browserTypes.length; t.plan( totalTests ); @@ -22,16 +22,17 @@ t.ok(events.object ==obj, " 'object' property correctly set"); t.ok(events.element == mapDiv, " 'element' property correctly set"); - t.ok(events.eventTypes == eventTypes, " 'eventTypes' property correctly set"); for (var i = 0; i < browserTypes.length; i++) { - t.ok( events.listeners[browserTypes[i]] instanceof Array, - "browser event: " + browserTypes[i] + " correctly registered" ); + var type = browserTypes[i]; + t.ok( events.listeners[type] instanceof Array, "browser event: " + type + " correctly registered" ); + t.ok( OpenLayers.Util.indexOf(events.eventTypes, type) != -1, "browser type " + type + "' correctly added to eventTypes array"); } for (var i = 0; i < eventTypes.length; i++) { - t.ok( events.listeners[eventTypes[i]] instanceof Array, - "custom event: " + eventTypes[i] + " correctly registered"); + var type = eventTypes[i]; + t.ok( events.listeners[type] instanceof Array, "custom event: " + type + " correctly registered"); + t.ok( OpenLayers.Util.indexOf(events.eventTypes, type) != -1, "eventType " + type + "' correctly added to eventTypes array"); } // default/nulls @@ -40,6 +41,62 @@ "init of Events with null object/element/eventTypes still creates listeners array" ); } + function XXXtest_Events_register(t){ + t.plan(4); + + var ev = { + 'object': {}, + 'listeners': { + 'listenerA': { + 'push': function(options){ + gObjA = options.obj; + gFuncA = options.func; + } + }, + 'listenerB': { + 'push': function(options){ + gObjB = options.obj; + gFuncB = options.func; + } + } + }, + 'eventTypes': ['listenerA', 'listenerB'] + }; + + var type = null; + var object = null; + var func = null; + + //func null + gObjA = null; gFuncA = null; gObjB = null; gFuncB = null; + OpenLayers.Events.prototype.register.apply(ev, [type, object, func]); + t.ok((gObjA == null) && (gFuncA == null) && + (gObjB == null) && (gFuncB == null), "no push called func null"); + + //valid func, type not in ev.eventTypes + func = function() {}; + gObjA = null; gFuncA = null; gObjB = null; gFuncB = null; + OpenLayers.Events.prototype.register.apply(ev, [type, object, func]); + t.ok((gObjA == null) && (gFuncA == null) && + (gObjB == null) && (gFuncB == null), "no push called func null"); + + //valid func, type in ev.eventTypes, null obj + type = 'listenerA'; + gObjA = null; gFuncA = null; gObjB = null; gFuncB = null; + OpenLayers.Events.prototype.register.apply(ev, [type, object, func]); + t.ok((gObjA == ev.object) && (gFuncA == func) && + (gObjB == null) && (gFuncB == null), "push called on listenerA's mock array when type passed in 'listenerA'. events.object taken since obj is null."); + + //valid func, type in ev.eventTypes, valid obj + type = 'listenerB'; + object = {}; + gObjA = null; gFuncA = null; gObjB = null; gFuncB = null; + OpenLayers.Events.prototype.register.apply(ev, [type, object, func]); + t.ok((gObjA == null) && (gFuncA == null) && + (gObjB == object) && (gFuncB == func), "push called on listenerB's mock array when type passed in 'listenerB'."); + + } + function test_Events_register_unregister(t) { t.plan( 18 ); @@ -355,7 +412,7 @@ function test_Events_addEventType(t) { - t.plan( 6 ); + t.plan( 8 ); var mapDiv = OpenLayers.Util.getElement('map'); var obj = {result: 0}; @@ -369,9 +426,11 @@ var newEventType = "onFoo"; t.ok( events.listeners[newEventType] == null, "event type not yet registered has null entry in listeners array"); + t.ok( OpenLayers.Util.indexOf(events.eventTypes, newEventType) == -1, "event type not yet registered not in eventTypes array"); events.addEventType(newEventType); t.eq( events.listeners[newEventType].length, 0, "event type passed to addEventType correctly set up" ); + t.ok( OpenLayers.Util.indexOf(events.eventTypes, newEventType) != -1, "event type passed to addEventType in eventTypes array"); var func = function () {}; events.register( "doThingA", obj, func ); diff --git a/tests/Layer/Grid.html b/tests/Layer/Grid.html index 2b0d1a610b..c9e86612d8 100644 --- a/tests/Layer/Grid.html +++ b/tests/Layer/Grid.html @@ -23,7 +23,7 @@ function test_Layer_Grid_constructor (t) { - t.plan( 5 ); + t.plan( 8 ); layer = new OpenLayers.Layer.Grid(name, url, params, null); t.ok( layer instanceof OpenLayers.Layer.Grid, "returns OpenLayers.Layer.Grid object" ); @@ -31,7 +31,16 @@ t.eq( layer.ratio, 1.5, "ratio default is 1.5"); t.eq( layer.numLoadingTiles, 0, "numLoadingTiles starts at 0"); t.ok( layer.events.listeners["tileloaded"] != null, "'tileloaded' event added to layer's event types"); - + t.ok( OpenLayers.Util.indexOf(layer.events.eventTypes, 'tileloaded') != -1 ,"'tileloaded' event added to layer's event types"); + + //regression testing for #1502 + t.ok( layer.events.listeners['tileloaded'].length == 0, "no listeners for tileloaded preregister"); + + var obj = {}; + var func = function() {}; + layer.events.register('tileloaded', obj, func); + + t.ok( layer.events.listeners['tileloaded'].length == 1, "one listener for tileloaded after register"); }