From fc585de50f507b8c29bf89023765f8c3b692f7ec Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Tue, 10 Jul 2012 17:22:50 +0200 Subject: [PATCH] Cache event types and changed method names --- src/ol/object.js | 42 +++++++++++++++++++++++++++++++++++++++--- src/ol/object_test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/ol/object.js b/src/ol/object.js index 24d8fd38bb..3d2fc9036f 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -67,6 +67,24 @@ ol.Object.create = function(arg) { }; +/** + * @private + * @type {Object.} + */ +ol.Object.changedEventTypeCache_ = {}; + + +/** + * @param {string} key Key. + * @private + * @return {string} Changed name. + */ +ol.Object.getChangedEventType_ = function(key) { + return ol.Object.changedEventTypeCache_[key] || + (ol.Object.changedEventTypeCache_[key] = key.toLowerCase() + '_changed'); +}; + + /** * @private * @type {Object.} @@ -85,6 +103,24 @@ ol.Object.getGetterName_ = function(key) { }; +/** + * @private + * @type {Object.} + */ +ol.Object.changedMethodNameCache_ = {}; + + +/** + * @param {string} key String. + * @private + * @return {string} Changed method name. + */ +ol.Object.getChangedMethodName_ = function(key) { + return ol.Object.changedMethodNameCache_[key] || + (ol.Object.changedMethodNameCache_[key] = key + '_changed'); +}; + + /** * @private * @type {Object.} @@ -133,7 +169,7 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey, opt_noNotify) { var targetKey = goog.isDef(opt_targetKey) ? opt_targetKey : key; this.unbind(key); - var eventType = targetKey.toLowerCase() + '_changed'; + var eventType = ol.Object.getChangedEventType_(targetKey); var listeners = ol.Object.getListeners(this); listeners[key] = goog.events.listen(target, eventType, function() { this.notifyInternal_(key); @@ -197,13 +233,13 @@ ol.Object.prototype.notify = function(key) { * @private */ ol.Object.prototype.notifyInternal_ = function(key) { - var changedMethodName = key + '_changed'; + var changedMethodName = ol.Object.getChangedMethodName_(key); if (this[changedMethodName]) { this[changedMethodName](); } else { this.changed(key); } - var eventType = key.toLowerCase() + '_changed'; + var eventType = ol.Object.getChangedEventType_(key); this.dispatchEvent(eventType); }; diff --git a/src/ol/object_test.js b/src/ol/object_test.js index 65e02fcbaf..28b0339535 100644 --- a/src/ol/object_test.js +++ b/src/ol/object_test.js @@ -454,3 +454,29 @@ function testCreateWithOptions() { var obj = new ol.Object({k: 1}); assertEquals(1, obj.get('k')); } + + +function testEventTypeCaseSensitivity() { + var obj = new ol.Object(); + var lowercaseChangedMethodCalled = false; + obj.k_changed = function() { + lowercaseChangedMethodCalled = true; + }; + var uppercaseChangedMethodCalled = false; + obj.K_changed = function() { + uppercaseChangedMethodCalled = true; + }; + var lowercaseEventDispatched = false; + goog.events.listen(obj, 'k_changed', function() { + lowercaseEventDispatched = true; + }); + var uppercaseEventDispatched = false; + goog.events.listen(obj, 'K_changed', function() { + uppercaseEventDispatched = true; + }); + obj.set('K', 1); + assertTrue(lowercaseEventDispatched); + assertFalse(uppercaseEventDispatched); + assertFalse(lowercaseChangedMethodCalled); + assertTrue(uppercaseChangedMethodCalled); +}