public
Description: Prototype JavaScript framework
Homepage: http://prototypejs.org/
Clone URL: git://github.com/sstephenson/prototype.git
Add event cleanup on Element#update and Element#replace so that replaced content 
does not leak memory. [#28 state:resolved]
Fri Apr 18 08:06:53 -0700 2008
commit  3d27a63da0e72807c6bb83e73ffa4359ee9e6465
tree    ce2b3824f5cf47584826d8780284a191cde5ed71
parent  35cea73bfeab45d0231dbcbb4aa088ed250140a3
...
 
 
1
2
3
...
1
2
3
4
5
0
@@ -1,3 +1,5 @@
0
+* Add event cleanup on Element#update and Element#replace so that replaced content does not leak memory. (jddalton, Andrew Dupont)
0
+
0
 * Loop through all elements and remove all handlers on page unload. IE needs this in order to prevent memory leaks. (kangax, jddalton, Andrew Dupont)
0
 
0
 * Fix issue where IE fails to GC when the page is navigated away from before it's done loading. (jddalton, Andrew Dupont)
...
877
878
879
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
880
881
882
...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
0
@@ -877,6 +877,27 @@ else if (Prototype.Browser.IE) {
0
       onchange:    v._getEv
0
     });
0
   })(Element._attributeTranslations.read.values);
0
+
0
+  // Wrap Element#update and Element#replace to clean up event handlers on 
0
+  // newly-removed elements. Prevents memory leaks in IE.  
0
+  Element._purgeObservers = function(element, includeRoot) {
0
+    Element.select(element, '*').each(Event.stopObserving);
0
+    if (includeRoot === true) Event.stopObserving(element);
0
+  };
0
+    
0
+  Element.Methods.update = Element.Methods.update.wrap(
0
+    function(proceed, element, contents) {
0
+      Element._purgeObservers(element, false);
0
+      return proceed(element, contents);
0
+    }
0
+  );
0
+  
0
+  Element.Methods.replace = Element.Methods.replace.wrap(
0
+    function(proceed, element, contents) {
0
+      Element._purgeObservers(element, true);
0
+      return proceed(element, contents);
0
+    }
0
+  );  
0
 }
0
 
0
 else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {

Comments