X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fcore%2Fdom%2Fdomobject.js;h=bb029e0a8764e40664a7a9542a897ee842d3bb80;hb=039a051ccf3901311661022a30afd60fc38130c9;hp=6962fdb58081adf72e43012fece812aec2e637c6;hpb=c6e377a02b54abc07129d72b632763c727476a15;p=ckeditor.git diff --git a/_source/core/dom/domobject.js b/_source/core/dom/domobject.js index 6962fdb..bb029e0 100644 --- a/_source/core/dom/domobject.js +++ b/_source/core/dom/domobject.js @@ -84,10 +84,10 @@ CKEDITOR.dom.domObject.prototype = (function() { var listener = nativeListeners[ eventName ] = getNativeListener( this, eventName ); - if ( this.$.addEventListener ) - this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture ); - else if ( this.$.attachEvent ) + if ( this.$.attachEvent ) this.$.attachEvent( 'on' + eventName, listener ); + else if ( this.$.addEventListener ) + this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture ); } // Call the original implementation. @@ -107,14 +107,34 @@ CKEDITOR.dom.domObject.prototype = (function() var listener = nativeListeners && nativeListeners[ eventName ]; if ( listener ) { - if ( this.$.removeEventListener ) - this.$.removeEventListener( eventName, listener, false ); - else if ( this.$.detachEvent ) + if ( this.$.detachEvent ) this.$.detachEvent( 'on' + eventName, listener ); + else if ( this.$.removeEventListener ) + this.$.removeEventListener( eventName, listener, false ); delete nativeListeners[ eventName ]; } } + }, + + /** + * Removes any listener set on this object. + * To avoid memory leaks we must assure that there are no + * references left after the object is no longer needed. + */ + removeAllListeners : function() + { + var nativeListeners = this.getCustomData( '_cke_nativeListeners' ); + for ( var eventName in nativeListeners ) + { + var listener = nativeListeners[ eventName ]; + if ( this.$.detachEvent ) + this.$.detachEvent( 'on' + eventName, listener ); + else if ( this.$.removeEventListener ) + this.$.removeEventListener( eventName, listener, false ); + + delete nativeListeners[ eventName ]; + } } }; })(); @@ -123,6 +143,11 @@ CKEDITOR.dom.domObject.prototype = (function() { var customData = {}; + CKEDITOR.on( 'reset', function() + { + customData = {}; + }); + /** * Determines whether the specified object is equal to the current object. * @name CKEDITOR.dom.domObject.prototype.equals @@ -197,7 +222,27 @@ CKEDITOR.dom.domObject.prototype = (function() }; /** - * @name CKEDITOR.dom.domObject.prototype.getCustomData + * Removes any data stored on this object. + * To avoid memory leaks we must assure that there are no + * references left after the object is no longer needed. + * @name CKEDITOR.dom.domObject.prototype.clearCustomData + * @function + */ + domObjectProto.clearCustomData = function() + { + // Clear all event listeners + this.removeAllListeners(); + + var expandoNumber = this.$._cke_expando; + expandoNumber && delete customData[ expandoNumber ]; + }; + + /** + * Gets an ID that can be used to identiquely identify this DOM object in + * the running session. + * @name CKEDITOR.dom.domObject.prototype.getUniqueId + * @function + * @returns {Number} A unique ID. */ domObjectProto.getUniqueId = function() {