[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