JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.3
[ckeditor.git] / _source / core / dom / domobject.js
index c0c6e63..e342dc8 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
 For licensing, see LICENSE.html or http://ckeditor.com/license\r
 */\r
 \r
@@ -115,6 +115,26 @@ CKEDITOR.dom.domObject.prototype = (function()
                                        delete nativeListeners[ eventName ];\r
                                }\r
                        }\r
+               },\r
+\r
+               /**\r
+                * Removes any listener set on this object.\r
+                * To avoid memory leaks we must assure that there are no\r
+                * references left after the object is no longer needed.\r
+                */\r
+               removeAllListeners : function()\r
+               {\r
+                       var nativeListeners = this.getCustomData( '_cke_nativeListeners' );\r
+                       for ( var eventName in nativeListeners )\r
+                       {\r
+                               var listener = nativeListeners[ eventName ];\r
+                               if ( this.$.detachEvent )\r
+                                       this.$.detachEvent( 'on' + eventName, listener );\r
+                               else if ( this.$.removeEventListener )\r
+                                       this.$.removeEventListener( eventName, listener, false );\r
+\r
+                               delete nativeListeners[ eventName ];\r
+                       }\r
                }\r
        };\r
 })();\r
@@ -123,6 +143,11 @@ CKEDITOR.dom.domObject.prototype = (function()
 {\r
        var customData = {};\r
 \r
+       CKEDITOR.on( 'reset', function()\r
+               {\r
+                       customData = {};\r
+               });\r
+\r
        /**\r
         * Determines whether the specified object is equal to the current object.\r
         * @name CKEDITOR.dom.domObject.prototype.equals\r
@@ -142,6 +167,9 @@ CKEDITOR.dom.domObject.prototype = (function()
        /**\r
         * Sets a data slot value for this object. These values are shared by all\r
         * instances pointing to that same DOM object.\r
+        * <strong>Note:</strong> The created data slot is only guarantied to be available on this unique dom node,\r
+        * thus any wish to continue access it from other element clones (either created by clone node or from innerHtml)\r
+        * will fail, for such usage, please use {@link CKEDITOR.dom.element::setAttribute} instead.\r
         * @name CKEDITOR.dom.domObject.prototype.setCustomData\r
         * @function\r
         * @param {String} key A key used to identify the data slot.\r
@@ -175,15 +203,18 @@ CKEDITOR.dom.domObject.prototype = (function()
         */\r
        domObjectProto.getCustomData = function( key )\r
        {\r
-               var expandoNumber = this.$._cke_expando,\r
+               var expandoNumber = this.$[ 'data-cke-expando' ],\r
                        dataSlot = expandoNumber && customData[ expandoNumber ];\r
 \r
                return dataSlot && dataSlot[ key ];\r
        };\r
 \r
+       /**\r
+        * @name CKEDITOR.dom.domObject.prototype.removeCustomData\r
+        */\r
        domObjectProto.removeCustomData = function( key )\r
        {\r
-               var expandoNumber = this.$._cke_expando,\r
+               var expandoNumber = this.$[ 'data-cke-expando' ],\r
                        dataSlot = expandoNumber && customData[ expandoNumber ],\r
                        retval = dataSlot && dataSlot[ key ];\r
 \r
@@ -193,9 +224,32 @@ CKEDITOR.dom.domObject.prototype = (function()
                return retval || null;\r
        };\r
 \r
+       /**\r
+        * Removes any data stored on this object.\r
+        * To avoid memory leaks we must assure that there are no\r
+        * references left after the object is no longer needed.\r
+        * @name CKEDITOR.dom.domObject.prototype.clearCustomData\r
+        * @function\r
+        */\r
+       domObjectProto.clearCustomData = function()\r
+       {\r
+               // Clear all event listeners\r
+               this.removeAllListeners();\r
+\r
+               var expandoNumber = this.$[ 'data-cke-expando' ];\r
+               expandoNumber && delete customData[ expandoNumber ];\r
+       };\r
+\r
+       /**\r
+        * Gets an ID that can be used to identiquely identify this DOM object in\r
+        * the running session.\r
+        * @name CKEDITOR.dom.domObject.prototype.getUniqueId\r
+        * @function\r
+        * @returns {Number} A unique ID.\r
+        */\r
        domObjectProto.getUniqueId = function()\r
        {\r
-               return this.$._cke_expando || ( this.$._cke_expando = CKEDITOR.tools.getNextNumber() );\r
+               return this.$[ 'data-cke-expando' ] || ( this.$[ 'data-cke-expando' ] = CKEDITOR.tools.getNextNumber() );\r
        };\r
 \r
        // Implement CKEDITOR.event.\r