[Laszlo-checkins] r13141 - openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml

bargull@openlaszlo.org bargull at openlaszlo.org
Tue Mar 3 06:39:33 PST 2009


Author: bargull
Date: 2009-03-03 06:39:29 -0800 (Tue, 03 Mar 2009)
New Revision: 13141

Modified:
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js
   openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js
Log:
Change 20090302-bargull-uSw by bargull at dell--p4--2-53 on 2009-03-02 13:37:27
    in /home/Admin/src/svn/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: some more tweaks for dhtml contextmenu / erroneous onmousemove-events

New Features:

Bugs Fixed: LPP-7661 (Views without bgcolor allow context menus to receive clicks in SWF but not in DHTML), LPP-7852 (DHTML: text-events generate onmousemove)

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

Documentation:

Release Notes:

Details:
IE doesn't implement pageX/pageY, only clientX/clientY. In order to get the proper absolute x/y-values, scrollLeft/scrollTop needs to be added (see http://www.quirksmode.org/js/events_properties.html#position).
And I shouldn't try to be too smart in __showContextMenu() when using || for short-circuit ops: Some browsers implement both pageX/pageY and clientX/clientY, so that code did effectively a binary or. 
And "owner" property is not required (needed for LPP-7823 dhtml/IE). And return from loop when elem is `null` which may happen for invalid positions. And finally, also check tagName, this could be necessary because "owner" is no longer required. 

UPDATE: 
LzInputTextSprite:
- register for onmousemove to detect mouse-movements
- don't forward onmousemove-events to inputtextevent()

LzMouseKernel:
- only forward 'onmousemove' for real mousemove-events (LPP-7852)
    

Tests:
IE pageX/pageY fix:
- recompile developer console for dhtml
- right click on dev console in dhtml/IE, note that contextmenu appears at proper position

testcases for LPP-7852 (attached at bugreport)



Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js	2009-03-03 14:15:50 UTC (rev 13140)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js	2009-03-03 14:39:29 UTC (rev 13141)
@@ -359,6 +359,7 @@
     } else {
         div.onmouseout = f;
     }
+    div.onmousemove = f;
     div.onfocus = f;
     div.onclick = f;
     div.onkeyup = f;
@@ -547,9 +548,10 @@
         }
     } else if (eventname == 'onmouseout') {
         sprite.__setglobalclickable(true);
-    }
-
-    if (eventname == 'onkeypress') {
+    } else if (eventname == 'onmousemove') {
+        // don't forward 'onmousemove' to inputtextevent()
+        return;
+    } else if (eventname == 'onkeypress') {
         if (sprite.restrict || (sprite.multiline && view.maxlength > 0)) {
             sprite.__updatefieldsize();
             var keycode = evt.keyCode;

Modified: openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js	2009-03-03 14:15:50 UTC (rev 13140)
+++ openlaszlo/trunk/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js	2009-03-03 14:39:29 UTC (rev 13141)
@@ -41,7 +41,9 @@
 
         if (e.button == 2 && eventname != 'oncontextmenu') return;
         if (eventname == 'oncontextmenu') {
-            if (targ && targ.owner) {
+            if (targ) {
+                // update mouse position, required for Safari
+                LzMouseKernel.__sendMouseMove(e);
                 return LzMouseKernel.__showContextMenu(e);
             }
         } else {
@@ -174,53 +176,55 @@
         var el = document.getElementById('lzcanvasclickdiv');
         el.style.display = isclickable ? 'block' : 'none';
     }
-
     ,__sendMouseMove: function(e) {
+        // see http://www.quirksmode.org/js/events_properties.html#position
         if (e.pageX || e.pageY) {
             LzMouseKernel.__x = e.pageX;
             LzMouseKernel.__y = e.pageY;
         } else if (e.clientX || e.clientY) {
-            LzMouseKernel.__x = e.clientX;
-            LzMouseKernel.__y = e.clientY;
-        } else {
-            // no move detected, just return
-            return;
+            // IE doesn't implement pageX/pageY, instead scrollLeft/scrollTop
+            // needs to be added to clientX/clientY
+            var body = document.body, docElem = document.documentElement;
+            LzMouseKernel.__x = e.clientX + body.scrollLeft + docElem.scrollLeft;
+            LzMouseKernel.__y = e.clientY + body.scrollTop + docElem.scrollTop;
         }
-        LzMouseKernel.__sendEvent('onmousemove');
+        if (e.type == 'mousemove') {
+            LzMouseKernel.__sendEvent('onmousemove');
+        }
     }
     ,__showContextMenu: function(e) {
         // show the default menu if not found...
         var cmenu = LzSprite.__rootSprite.__contextmenu;
         if (document.elementFromPoint) {
             var swf8mode = LzSprite.prototype.quirks.swf8_contextmenu;
-            var x = (e.pageX || e.clientX || 0);
-            var y = (e.pageY || e.clientY || 0);
-            // update mouse position, required for Safari
-            LzMouseKernel.__x = x;
-            LzMouseKernel.__y = y;
+            var x = LzMouseKernel.__x;
+            var y = LzMouseKernel.__y;
             var rootdiv = canvas.sprite.__LZdiv;
             var arr = [];
             do {
                 var elem = document.elementFromPoint(x, y);
-                var owner = elem.owner;
-                if (! owner) {
-                    // owner property is required
+                if (! elem) {
+                    // no element under position
                     break;
-                } else if (owner.__contextmenu) {
-                    // found a contextmenu
-                    cmenu = owner.__contextmenu;
-                    break;
-                } else if (swf8mode && ((owner.__LZdiv === elem && owner.bgcolor != null)
-                                || owner instanceof LzTextSprite)) {
-                    // swf8 compatibility: movieclips with bgcolor and textfields
-                    // don't pass through context-menu
-                    break;
                 } else {
+                    var owner = elem.owner;
+                    if (! owner) {
+                        // no owner attached
+                    } else if (owner.__contextmenu) {
+                        // found a contextmenu
+                        cmenu = owner.__contextmenu;
+                        break;
+                    } else if (swf8mode && ((owner.__LZdiv === elem && owner.bgcolor != null)
+                                    || owner instanceof LzTextSprite)) {
+                        // swf8 compatibility: movieclips with bgcolor and textfields
+                        // don't pass through context-menu
+                        break;
+                    }
                     // hide this element to get next layer
                     arr.push(elem, elem.style.display);
                     elem.style.display = 'none';
                 }
-            } while (elem !== rootdiv);
+            } while (elem !== rootdiv && elem.tagName != 'HTML');
 
             // restore display
             for (var i = arr.length - 1; i >= 0; i -= 2) {



More information about the Laszlo-checkins mailing list