[Laszlo-checkins] r13729 - openlaszlo/trunk/lps/includes/source

bargull@openlaszlo.org bargull at openlaszlo.org
Wed Apr 22 11:12:36 PDT 2009


Author: bargull
Date: 2009-04-22 11:12:33 -0700 (Wed, 22 Apr 2009)
New Revision: 13729

Modified:
   openlaszlo/trunk/lps/includes/source/embednew.js
Log:
Change 20090421-bargull-FBc by bargull at dell--p4--2-53 on 2009-04-21 23:45:37
    in /home/Admin/src/svn/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: fix braino in lz.embed's event-handler utility functions

New Features:

Bugs Fixed: LPP-8074 (DHTML: erroneous onmouseup-events after mouse left app)

Technical Reviewer: max
QA Reviewer: (pending)
Doc Reviewer: (pending)

Documentation:

Release Notes:

Details:
Different objects can have the same string representation. So the simple concatenation of eventscope, eventname, callbackscope and callbackname does not ensure unique identifiers. Instead you need to save both, eventscope and callbackscope, and use those values for comparisons. 
    

Tests:
testcase from bugreport



Modified: openlaszlo/trunk/lps/includes/source/embednew.js
===================================================================
--- openlaszlo/trunk/lps/includes/source/embednew.js	2009-04-22 08:00:05 UTC (rev 13728)
+++ openlaszlo/trunk/lps/includes/source/embednew.js	2009-04-22 18:12:33 UTC (rev 13729)
@@ -673,16 +673,43 @@
      * @param callbackname:String Method name to receive callback in callbackscope
      */
     attachEventHandler: function(eventscope, eventname, callbackscope, callbackname) {
-        if (! callbackscope || !callbackname || !callbackscope[callbackname]) {
+        if (! (callbackscope && callbackname
+                && typeof callbackscope[callbackname] == 'function')) {
             return;
         }
         var s = eventscope + eventname + callbackscope + callbackname;
+        var h = this._handlers[s];
+        if (h != null) {
+            if (h instanceof Array) {
+                for (var i = h.length - 1; i >= 0; --i) {
+                    if (h[i].$e === eventscope && h[i].$c === callbackscope) {
+                        // handler is already attached
+                        return;
+                    }
+                }
+            } else {
+                if (h.$e === eventscope && h.$c === callbackscope) {
+                    // handler is already attached
+                    return;
+                }
+            }
+        }
         var handler = function() {
             var a = window.event ? [window.event] : arguments;
             callbackscope[callbackname].apply(callbackscope, a);
         }
-        this._handlers[s] = handler;
-        //alert('add '+ s);
+        handler.$e = eventscope;
+        handler.$c = callbackscope;
+        if (h != null) {
+            if (h instanceof Array) {
+                h.push(handler);
+            } else {
+                h = [h, handler];
+            }
+        } else {
+            h = handler;
+        }
+        this._handlers[s] = h;
         if(eventscope['addEventListener']) {
             eventscope.addEventListener(eventname, handler, false);
             return true;
@@ -700,10 +727,27 @@
      */
     removeEventHandler: function(eventscope, eventname, callbackscope, callbackname) {
         var s = eventscope + eventname + callbackscope + callbackname;
-        var handler = this._handlers[s];
-        //console.log('remove', this._handlers);
-        this._handlers[s] = null;
-        if (! handler) return;
+        var handler, h = this._handlers[s];
+        if (h != null) {
+            if (h instanceof Array) {
+                for (var i = h.length - 1; i >= 0; --i) {
+                    if (h[i].$e === eventscope && h[i].$c === callbackscope) {
+                        handler = h[i];
+                        h.splice(i, 1);
+                        if (h.length == 0) {
+                            delete this._handlers[s];
+                        }
+                    }
+                }
+            } else if (h.$e === eventscope && h.$c === callbackscope) {
+                handler = h;
+                delete this._handlers[s];
+            }
+        }
+        if (! handler) {
+            // handler not found
+            return;
+        }
         if(eventscope['removeEventListener']) {
             eventscope.removeEventListener(eventname, handler, false);
             return true;



More information about the Laszlo-checkins mailing list