History | Log In     View a printable version of the current page.  
Issue Details (XML | Word | Printable)

Key: LPP-4244
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: P1 P1
Assignee: Unassigned
Reporter: Robert Yeager
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
OpenLaszlo

Mouse handling busted in R5588 IE7 DHTML

Created: 05/Jul/07 01:19 PM   Updated: 25/Jul/07 03:00 PM
Component/s: Components - all
Affects Version/s: Legals, 4.0.3
Fix Version/s: 4.0.3, Legals

Time Tracking:
Not Specified

Severity: Critical
Fixed in Change#: 5,747
Fixed in branch: branches/legals
Runtime: N/A
Fix in hand: False


 Description  « Hide
Mouse handling is busted in R5588 w/ IE7 DHTML. It happens with all components, but the following code demonstrates just the combobox:

<canvas id="maincanvas" width="100%" height="100%" validate="false" debug="false" proxied="false" bgcolor="0xEFF1E8">
<debug x="650" y="200" width="800" height="400" fontsize="12"/>
<view id="dv" x="0" y="0" width="400" height="400" bgcolor="red">
<combobox y="100">
<textlistitem>1</textlistitem>
<textlistitem>2</textlistitem>
<textlistitem>3</textlistitem>
</combobox>
</view>
</canvas>

For the first test w/ IE7 DHTML, try clicking the combobox button over and over, without moving the mouse off the button. Observe that the combobox opens and closes on the first two clicks, but then fails to respond to subsequent clicks.

For the second test w/ IE7 DHTML using the same program, restart the program and mouse over the text entry field, then try to click the button. Observe the button cannot be clicked.

The problem is not limited to the combobox...all components and their manner of responding to mouse events is hosed!

 All   Comments   Work Log   Change History      Sort Order: Ascending order - Click to sort in descending order
Benjamin Shine - 05/Jul/07 04:05 PM
This is in legals.

Philip Romanik - 05/Jul/07 04:58 PM
I verified this problem in IE/dhtml. It works in FF/dhtml.

Philip Romanik - 05/Jul/07 05:55 PM
As it turns out, this isn't a new problem.

I've gone as far back as R4745 (4/17/2007) and the problem is there in IE

Benjamin Shine - 20/Jul/07 03:27 PM
This is present in TOT legals as of r5732.

Amy Muntz - 20/Jul/07 04:01 PM
Assigning to Phil.

Mamye Kratt - 20/Jul/07 04:09 PM
(4.0 branch (4.0.3) build r5718)
IE6-swf OK
IE6-dhtml OK
IE7-swf OK
IE7-dhtml Broken

Max Carlson - 22/Jul/07 09:13 PM
Author: max
Date: 2007-07-22 21:00:59 -0700 (Sun, 22 Jul 2007)
New Revision: 5747

Modified:
   openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js
   openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js
   openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
Log:
Change 20070722-maxcarlson-g by maxcarlson@plastik on 2007-07-22 12:13:31 PDT
    in /Users/maxcarlson/openlaszlo/legals-checkin
    for http://svn.openlaszlo.org/openlaszlo/branches/legals

Summary: Fix inputtext focus and blurring in IE

New Features:

Bugs Fixed: LPP-4244 - Mouse handling busted in R5588 IE7 DHTML

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

Documentation:

Release Notes:

Details: LzSprite.js - setWidth/Height() return new width value if changed. Optimize setOpacity.

LzMouseKernel.js - Pass eventname and target into LzInputTextSprite.__hideIfNotFocused(), but only when fix_ie_clickable quirk is on. Otherwise, act the same as before.

LzInputTextSprite.js - Add __setglobalclickable() method and call it instead of calling __setCSSClassProperty() directly. Turn global ckickability on when mousing out of inputtext, and off again when mousing back over the inputtext. This makes clickable views function they way they should without interfering with the inputtext. setWidth/Height() use values returned from LzSprite.setWidth/Height().
    

Tests: ant lztest, LPP-4244 pass.



Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js 2007-07-23 02:48:38 UTC (rev 5746)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzInputTextSprite.js 2007-07-23 04:00:59 UTC (rev 5747)
@@ -74,6 +74,7 @@
         this.__LZinputclickdiv.className = 'lzclickdiv';
         this.__LZinputclickdiv.owner = this;
         this.__LZinputclickdiv.onmouseover = function () {
+ LzInputTextSprite.prototype.__setglobalclickable(false);
             this.owner.__show();
         }
         this.__LZclickdiv.appendChild(this.__LZinputclickdiv);
@@ -110,19 +111,41 @@
     }
     if (this.quirks.fix_ie_clickable) {
         this.__LZclickdiv.appendChild(this.__LzInputDiv);
- this.__setCSSClassProperty('.lzclickdiv', 'display', 'none');
+ this.__setglobalclickable(false);
     } else {
         this.__LZinputclickdiv.appendChild(this.__LzInputDiv);
     }
     //Debug.write('show');
 }
 
-LzInputTextSprite.prototype.__hideIfNotFocused = function() {
+LzInputTextSprite.prototype.__hideIfNotFocused = function(eventname, target) {
     if (LzInputTextSprite.prototype.__lastshown == null) return;
- if (LzInputTextSprite.prototype.__focusedSprite != LzInputTextSprite.prototype.__lastshown) {
- LzInputTextSprite.prototype.__lastshown.__hide();
+ if (LzSprite.prototype.quirks.fix_ie_clickable && eventname == 'onmousemove') {
+ // track mouse position for inputtext when global clickable is false
+ if (LzInputTextSprite.prototype.__globalclickable == false && LzInputTextSprite.prototype.__focusedSprite && target) {
+ if (target.owner != LzInputTextSprite.prototype.__focusedSprite) {
+ LzInputTextSprite.prototype.__setglobalclickable(true);
+ } else {
+ LzInputTextSprite.prototype.__setglobalclickable(false);
+ }
+ }
+ } else {
+ if (eventname != null && LzInputTextSprite.prototype.__globalclickable == true) {
+ LzInputTextSprite.prototype.__setglobalclickable(false);
+ }
+ if (LzInputTextSprite.prototype.__focusedSprite != LzInputTextSprite.prototype.__lastshown) {
+ LzInputTextSprite.prototype.__lastshown.__hide();
+ }
     }
+
 }
+LzInputTextSprite.prototype.__setglobalclickable = function(c) {
+ if (! LzSprite.prototype.quirks.fix_ie_clickable) return;
+ if (c != LzInputTextSprite.prototype.__globalclickable) {
+ LzInputTextSprite.prototype.__globalclickable = c;
+ LzInputTextSprite.prototype.__setCSSClassProperty('.lzclickdiv', 'display', c ? '' : 'none');
+ }
+}
 
 LzInputTextSprite.prototype.__hide = function() {
     if (this.__shown != true || this.disabled == true) return;
@@ -146,7 +169,7 @@
         // and make the click be displayed or not by whether it is before or after the (input) div?
         // [max 1-18-2007] IE requires different nesting rules for inputtext. Also, if there are _any_ clickable divs behind the inputtext they'll grab clicks. This is the reason I temporarily hide all clickable divs when the inputtext is selected - and the reason the inputtext can't be a child of the clickable view.
 
- this.__setCSSClassProperty('.lzclickdiv', 'display', '');
+ this.__setglobalclickable(true);
         this.__LzInputDiv = this.__LZclickdiv.removeChild(this.__LzInputDiv);
     } else {
         this.__LzInputDiv = this.__LZinputclickdiv.removeChild(this.__LzInputDiv);
@@ -179,6 +202,7 @@
     if (c) {
         this.__LzInputDiv.onblur = function (e) { this.owner.__textEvent(e, 'onblur') }
         this.__LzInputDiv.onmousedown = function (e) { this.owner.__textEvent(e, 'onmousedown') }
+ this.__LzInputDiv.onmouseout = function (e) { this.owner.__textEvent(e, 'onmouseout') }
         this.__LzInputDiv.onfocus = function (e) { this.owner.__textEvent(e, 'onfocus') }
         this.__LzInputDiv.onclick = function (e) { this.owner.__textEvent(e, 'onclick') }
         this.__LzInputDiv.onkeyup = function (e) { this.owner.__textEvent(e, 'onkeyup') }
@@ -201,6 +225,9 @@
     if (this.destroyed == true) return;
     var keycode = e ? e.keyCode : event.keyCode;
     if (eventname == 'onfocus' || eventname == 'onmousedown') {
+ if (eventname == 'onfocus') {
+ LzInputTextSprite.prototype.__setglobalclickable(false);
+ }
         LzInputTextSprite.prototype.__focusedSprite = this;
         this.__show();
         if (eventname == 'onfocus' && this._cancelfocus) {
@@ -218,7 +245,9 @@
             this._cancelblur = false;
             return;
         }
- }
+ } else if (eventname == 'onmouseout') {
+ this.__setglobalclickable(true);
+ }
 
     //Debug.info('__textEvent', eventname, keycode);
     if (this.owner) {
@@ -304,24 +333,26 @@
 LzInputTextSprite.prototype.setWidth = function (w) {
     if (w == null || w < 0 || isNaN(w) || this.width == w) return;
     // call LzSprite.setWidth();
- this.__setWidth(w - this.____wpadding);
- if (this.quirks.fix_clickable) {
- var w = this.CSSDimension(this.width);
- this.__LZclickdiv.style.width = w;
- this.__LZinputclickdiv.style.width = w;
+ var nw = this.__setWidth(w - this.____wpadding);
+ if (this.quirks.fix_clickable && nw != null) {
+ this.__LZclickdiv.style.width = nw;
+ this.__LZinputclickdiv.style.width = nw;
     }
 }
 
 LzInputTextSprite.prototype.setHeight = function (h) {
     if (h == null || h < 0 || isNaN(h) || this.height == h) return;
     // call LzSprite.setHeight();
- this.__setHeight(h);
- if (this.quirks.fix_clickable) {
- var h = this.CSSDimension(this.height);
- this.__LZclickdiv.style.height = h;
- this.__LZinputclickdiv.style.height = h;
+ var nh = this.__setHeight(h);
+ if (this.quirks.fix_clickable && nh != null) {
+ this.__LZclickdiv.style.height = nh;
+ this.__LZinputclickdiv.style.height = nh;
         if (this.multiline && this.quirks.set_height_for_multiline_inputtext) {
- this.__LzInputDiv.style.height = this.CSSDimension(this.height - (this.____hpadding * 2));
+ h = this.CSSDimension(h - (this.____hpadding * 2));
+ if (h != this._multilineheight) {
+ this._multilineheight = h;
+ this.__LzInputDiv.style.height = h
+ }
         }
     }
 }

Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js 2007-07-23 02:48:38 UTC (rev 5746)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzMouseKernel.js 2007-07-23 04:00:59 UTC (rev 5747)
@@ -21,8 +21,15 @@
     ,__mouseEvent: function(e) {
         if (!e) e = window.event;
         var eventname = 'on' + e.type;
- if (window['LzKeyboardKernel']) LzKeyboardKernel.__keyboardEvent(e);
- if (window['LzInputTextSprite'] && eventname != 'onmousemove' && LzInputTextSprite.prototype.__lastshown != null) LzInputTextSprite.prototype.__hideIfNotFocused();
+ var targ = e.srcElement ? e.srcElement : e.target;
+ if (window['LzKeyboardKernel'] && LzKeyboardKernel['__keyboardEvent']) LzKeyboardKernel.__keyboardEvent(e);
+ if (window['LzInputTextSprite']) {
+ if (LzSprite.prototype.quirks.fix_ie_clickable) {
+ LzInputTextSprite.prototype.__hideIfNotFocused(eventname, targ);
+ } else if (eventname != 'onmousemove' && LzInputTextSprite.prototype.__lastshown != null) {
+ LzInputTextSprite.prototype.__hideIfNotFocused();
+ }
+ }
         if (eventname == 'onmouseup' && LzMouseKernel.__lastMouseDown != null) {
             // call mouseup on the sprite that got the last mouse down
             LzMouseKernel.__lastMouseDown.__globalmouseup(e);
@@ -38,7 +45,6 @@
         if (LzMouseKernel.__callback) {
             if (e.button == 2 && eventname != 'oncontextmenu') return;
             if (eventname == 'oncontextmenu') {
- var targ = e.srcElement ? e.srcElement : e.target;
                 if (targ && targ.owner && targ.owner.__contextmenu) {
                     targ.owner.__contextmenu.__show();
                     return targ.owner.__contextmenu.showbuiltins;

Modified: openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js
===================================================================
--- openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js 2007-07-23 02:48:38 UTC (rev 5746)
+++ openlaszlo/branches/legals/WEB-INF/lps/lfc/kernel/dhtml/LzSprite.js 2007-07-23 04:00:59 UTC (rev 5747)
@@ -682,6 +682,7 @@
         if (this.clip) this.__updateClip();
         if (this.stretches) this.__updateStretches();
         if (this.__LZclick) this.__LZclick.style.width = w;
+ return w;
     }
 }
 
@@ -712,6 +713,7 @@
         if (this.clip) this.__updateClip();
         if (this.stretches) this.__updateStretches();
         if (this.__LZclick) this.__LZclick.style.height = h;
+ return h;
     }
 }
 
@@ -777,11 +779,14 @@
     if (this.opacity == o || o < 0) return;
     //Debug.info('setOpacity', o);
     this.opacity = o;
- if (o < .001) o = 0;
- if (this.quirks.ie_alpha_image_loader) {
- this.__LZdiv.style.filter = "alpha(opacity="+(o * 100)+")";
- } else {
- this.__LZdiv.style.opacity = o;
+ o = parseInt(o * 100) / 100;
+ if (o != this._opacity) {
+ this._opacity = o;
+ if (this.quirks.ie_alpha_image_loader) {
+ this.__LZdiv.style.filter = "alpha(opacity=" + parseInt(o * 100) + ")";
+ } else {
+ this.__LZdiv.style.opacity = o;
+ }
     }
 }
 


_______________________________________________
Laszlo-checkins mailing list
Laszlo-checkins@openlaszlo.org
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins

Mamye Kratt - 24/Jul/07 03:59 PM
(legals build r5764)
IE7, dhtml behaves the same as IE6. Close for legals.

Ben please merge fix into the 4.0 branch. Needs to be tested in the 4.0 branch.

Mamye Kratt - 24/Jul/07 04:06 PM
(legals build r5764)
See LPP-4340 - IE7 DHTML: Mouse clicks aren't re-enabled until mouse is moved for remaining issue.

Mamye Kratt - 25/Jul/07 02:59 PM
Reopen to close for 4.0 branch.

Mamye Kratt - 25/Jul/07 03:00 PM
(4.0 branch (4.0.4) build on labs)
Fixed in 4.0 branch. Still seeing smaller issue, see bug above.