[Laszlo-dev] Proposal to merge to 4.4 - change 'Add mouseevents attribute to html component to enable/disable iframe mouse events'

Amy Muntz amuntz at laszlosystems.com
Sat May 30 05:57:24 PDT 2009


  Absolutely.  Please merge.
Amy

On Fri, May 29, 2009 at 8:24 PM , Max Carlson wrote:

  I think this change is pretty low-risk, and webtop needs it to work in 
Safari so I think it should go in 4.4 ASAP.

-- 
Regards,
Max Carlson
OpenLaszlo.org

------------------------------

 From: max at openlaszlo.org
To: laszlo-checkins at openlaszlo.org
Date: Fri May 29 17:22:03 PDT 2009
Subject: [Laszlo-checkins] r14026 - in openlaszlo/trunk/lps:	 
components/extensions includes/source

Author: max
Date: 2009-05-29 17:22:02 -0700 (Fri, 29 May 2009)
New Revision: 14026

Modified:
   openlaszlo/trunk/lps/components/extensions/html.lzx
   openlaszlo/trunk/lps/includes/source/iframemanager.js
Log:
Change 20090529-maxcarlson-8 by maxcarlson at Bank <mailto:maxcarlson at Bank> 
  <mailto:maxcarlson at Bank>  on 2009-05-29 16:04:26 PDT
    in /Users/maxcarlson/openlaszlo/trunk-clean
    for http://svn.openlaszlo.org/openlaszlo/trunk 
<http://svn.openlaszlo.org/openlaszlo/trunk>   
<http://svn.openlaszlo.org/openlaszlo/trunk>

Summary: Add mouseevents attribute to html component to enable/disable 
iframe mouse events

Bugs Fixed: LPP-8233 - Safari is intercepting mouseup/mousedown/click 
events over an iframe

Technical Reviewer: hminsky
QA Reviewer: mdemmon

Details: html - Add mouseevents attribute that to enable/disable sending 
of iframe mouse events mousedown/up/click, etc.  Rename srcset  flag -> 
__srcset.

iframemanager - Add __sendmouseevents hash to track event sending for 
each iframe.  Clear mouse listeners before unloading or destroying 
iframes.  Refactor iframe event registration/unregistration to 
__setSendMouseEvents().  Call __setSendMouseEvents() after iframes 
finish loading to listen for mouse events if __sendmouseevents is true 
for the iframe id.

Tests: Testcase from LPP-8233 works in Safari if the <html/> instance 
has mouseevents set to false in test/extensions/html.lzx.


Modified: openlaszlo/trunk/lps/components/extensions/html.lzx
===================================================================
--- openlaszlo/trunk/lps/components/extensions/html.lzx	2009-05-29 
23:11:56 UTC (rev 14025)
+++ openlaszlo/trunk/lps/components/extensions/html.lzx	2009-05-30 
00:22:02 UTC (rev 14026)
@@ -115,6 +115,22 @@
           @access number
     -->
     <attribute name="minimumwidth" type="number" value="0"/>
+    <!--- If true, attempt to listen for mouse events on the iframe
+          @type Boolean
+          @access boolean
+    -->
+    <attribute name="mouseevents" type="boolean" value="true"/>
+    <setter name="mouseevents" args="send">
+    <![CDATA[
+        this.mouseevents = send;
+        if (this['iframeid']) {
+            lz.embed.iframemanager.setSendMouseEvents(this.iframeid, 
send);
+        } else {
+            this.__mouseevents = send;
+        }
+        if (this['onmouseevents'] && this.onmouseevents.ready) 
this.onmouseevents.sendEvent(send);
+    ]]>
+    </setter>
 
     <!--- Sets the view to listen to for x/y/width/height change 
events.
           @type LzView
@@ -176,7 +192,7 @@
         if (this['iframeid']) {
             lz.embed.iframemanager.setSrc(this.iframeid, s, 
this.history);
         } else {
-            this.srcset = s;
+            this.__srcset = s;
         }
         this.onsrc.sendEvent(s);
     </setter>
@@ -217,12 +233,13 @@
         //Debug.write('setiframeid', id, this)
         this.iframeid = id;
         if (this['isfront']) this.bringToFront();
-        if (this['srcset']) lz.embed.iframemanager.setSrc(id, 
this.srcset, this.history);
+        if (this['__srcset']) lz.embed.iframemanager.setSrc(id, 
this.__srcset, this.history);
         this.__updatepos(null);
         if ($dhtml) {
             this.setAttribute('clickable', true);
         }
         this.setAttribute('ready', true);
+        if (this['__mouseevents']) 
lz.embed.iframemanager.setSendMouseEvents(id, this.__mouseevents);
     </method>
     <!--- @access private -->
     <method name="__gotload">

Modified: openlaszlo/trunk/lps/includes/source/iframemanager.js
===================================================================
--- openlaszlo/trunk/lps/includes/source/iframemanager.js	2009-05-29 
23:11:56 UTC (rev 14025)
+++ openlaszlo/trunk/lps/includes/source/iframemanager.js	2009-05-30 
00:22:02 UTC (rev 14026)
@@ -9,6 +9,7 @@
     ,__loading: {}
     ,__callqueue: {}
     ,__calljsqueue: {}
+    ,__sendmouseevents: {}
     ,create: function(owner, name, scrollbars, appendto, defaultz, 
canvasref) {
         //console.log(owner + ', ' + name + ', ' + scrollbars + ', ' + 
appendto + ', ' + defaultz)
         var id = '__lz' + lz.embed.iframemanager.__counter++;
@@ -144,6 +145,8 @@
             this.__callqueue[id].push(['setSrc', id, s, history]);
             return;
         }
+        // clear out mouse listeners
+        this.__setSendMouseEvents(id, false);
         //console.log('setSrc', id, s, history)
         if (history) {
             var iframe = lz.embed.iframemanager.getFrame(id);
@@ -230,28 +233,10 @@
             
lz.embed[iframe.owner].callMethod('lz.embed.iframemanager.__gotload(\'' 
+ id + '\')');
         }
         this.__loading[id] = false;
-        var iframe = lz.embed.iframemanager.getFrameWindow(id);
-        // bind into global events.
-        if (lz.embed.browser.isIE) {
-            lz.embed.attachEventHandler(document, 'mouseover', 
lz.embed.iframemanager, '__globalMouseover', id);
+        // Enable mouse listeners if needed
+        if (this.__sendmouseevents[id]) {
+            this.__setSendMouseEvents(id, true);
         }
-        try {
-            lz.embed.attachEventHandler(iframe.document, 'mousedown', 
lz.embed.iframemanager, '__mouseEvent', id);
-            lz.embed.attachEventHandler(iframe.document, 'mouseup', 
lz.embed.iframemanager, '__mouseEvent', id);
-            lz.embed.attachEventHandler(iframe.document, 'click', 
lz.embed.iframemanager, '__mouseEvent', id);
-            //lz.embed.attachEventHandler(iframe.document, 'mousemove', 
lz.embed.iframemanager, '__mouseEvent', id);
-            iframe.document.oncontextmenu = function(e) {
-                return lz.embed.iframemanager.__mouseEvent(e, id);
-            }
-            if (lz.embed.browser.isIE) {
-                lz.embed.attachEventHandler(iframe.document, 
'mouseenter', lz.embed.iframemanager, '__mouseEvent', id);
-                lz.embed.attachEventHandler(iframe.document, 
'mouseleave', lz.embed.iframemanager, '__mouseEvent', id);
-            } else {
-                lz.embed.attachEventHandler(iframe.document, 
'mouseover', lz.embed.iframemanager, '__mouseEvent', id);
-                lz.embed.attachEventHandler(iframe.document, 
'mouseout', lz.embed.iframemanager, '__mouseEvent', id);
-            }
-        } catch(e) {
-        }
         if (this.__calljsqueue[id]) {
             this.__playQueue(this.__calljsqueue[id]);
             delete this.__calljsqueue[id];
@@ -295,25 +280,8 @@
         }
         var iframe = lz.embed.iframemanager.__frames[id];
         if (iframe) {
-            if (lz.embed.browser.isIE) {
-                lz.embed.removeEventHandler(document, 'mouseover', 
lz.embed.iframemanager, '__globalMouseover');
-            }
-            // remove event listeners
-            try {
-                lz.embed.removeEventHandler(iframe.document, 
'mousedown', lz.embed.iframemanager, '__mouseEvent');
-                lz.embed.removeEventHandler(iframe.document, 'mouseup', 
lz.embed.iframemanager, '__mouseEvent');
-                lz.embed.removeEventHandler(iframe.document, 'click', 
lz.embed.iframemanager, '__mouseEvent');
-                //lz.embed.removeEventHandler(iframe.document, 
'mousemove', lz.embed.iframemanager, '__mouseEvent');
-                iframe.document.oncontextmenu = null;
-                if (lz.embed.browser.isIE) {
-                    lz.embed.removeEventHandler(iframe.document, 
'mouseenter', lz.embed.iframemanager, '__mouseEvent');
-                    lz.embed.removeEventHandler(iframe.document, 
'mouseleave', lz.embed.iframemanager, '__mouseEvent');
-                } else {
-                    lz.embed.removeEventHandler(iframe.document, 
'mouseover', lz.embed.iframemanager, '__mouseEvent');
-                    lz.embed.removeEventHandler(iframe.document, 
'mouseout', lz.embed.iframemanager, '__mouseEvent');
-                }
-            } catch(e) {
-            }
+            // clear out mouse listeners
+            this.__setSendMouseEvents(id, false);
             iframe.owner = null;
             iframe.appcontainer = null;
             LzSprite.prototype.__discardElement(iframe);
@@ -394,4 +362,61 @@
             
lz.embed[iframe.owner].callMethod('lz.embed.iframemanager.__gotMouseEvent(\'' 
+ id + '\',\'' + eventname + '\')');
         }
     }
+    ,setSendMouseEvents: function(id, send) {
+        if (this.__callqueue[id]) {
+            this.__callqueue[id].push(['setSendMouseEvents', id, 
send]);
+            return;
+        }
+        this.__sendmouseevents[id] = send;
+    }
+    ,__setSendMouseEvents: function(id, send) {
+        var iframe = lz.embed.iframemanager.getFrameWindow(id);
+        if (! iframe) {
+            return;
+        }
+        //console.log('sending', id, send);
+        if (send) {
+            // bind into global events.
+            if (lz.embed.browser.isIE) {
+                lz.embed.attachEventHandler(document, 'mouseover', 
lz.embed.iframemanager, '__globalMouseover', id);
+            }
+            try {
+                lz.embed.attachEventHandler(iframe.document, 
'mousedown', lz.embed.iframemanager, '__mouseEvent', id);
+                lz.embed.attachEventHandler(iframe.document, 'mouseup', 
lz.embed.iframemanager, '__mouseEvent', id);
+                lz.embed.attachEventHandler(iframe.document, 'click', 
lz.embed.iframemanager, '__mouseEvent', id);
+                //lz.embed.attachEventHandler(iframe.document, 
'mousemove', lz.embed.iframemanager, '__mouseEvent', id);
+                iframe.document.oncontextmenu = function(e) {
+                    return lz.embed.iframemanager.__mouseEvent(e, id);
+                }
+                if (lz.embed.browser.isIE) {
+                    lz.embed.attachEventHandler(iframe.document, 
'mouseenter', lz.embed.iframemanager, '__mouseEvent', id);
+                    lz.embed.attachEventHandler(iframe.document, 
'mouseleave', lz.embed.iframemanager, '__mouseEvent', id);
+                } else {
+                    lz.embed.attachEventHandler(iframe.document, 
'mouseover', lz.embed.iframemanager, '__mouseEvent', id);
+                    lz.embed.attachEventHandler(iframe.document, 
'mouseout', lz.embed.iframemanager, '__mouseEvent', id);
+                }
+            } catch(e) {
+            }
+        } else {
+            // remove event listeners
+            if (lz.embed.browser.isIE) {
+                lz.embed.removeEventHandler(document, 'mouseover', 
lz.embed.iframemanager, '__globalMouseover');
+            }
+            try {
+                lz.embed.removeEventHandler(iframe.document, 
'mousedown', lz.embed.iframemanager, '__mouseEvent');
+                lz.embed.removeEventHandler(iframe.document, 'mouseup', 
lz.embed.iframemanager, '__mouseEvent');
+                lz.embed.removeEventHandler(iframe.document, 'click', 
lz.embed.iframemanager, '__mouseEvent');
+                //lz.embed.removeEventHandler(iframe.document, 
'mousemove', lz.embed.iframemanager, '__mouseEvent');
+                iframe.document.oncontextmenu = null;
+                if (lz.embed.browser.isIE) {
+                    lz.embed.removeEventHandler(iframe.document, 
'mouseenter', lz.embed.iframemanager, '__mouseEvent');
+                    lz.embed.removeEventHandler(iframe.document, 
'mouseleave', lz.embed.iframemanager, '__mouseEvent');
+                } else {
+                    lz.embed.removeEventHandler(iframe.document, 
'mouseover', lz.embed.iframemanager, '__mouseEvent');
+                    lz.embed.removeEventHandler(iframe.document, 
'mouseout', lz.embed.iframemanager, '__mouseEvent');
+                }
+            } catch(e) {
+            }
+        }
+    }
 }

_______________________________________________
Laszlo-checkins mailing list
Laszlo-checkins at openlaszlo.org <mailto:Laszlo-checkins at openlaszlo.org>   
<mailto:Laszlo-checkins at openlaszlo.org>
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins 
<http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins>   
<http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.openlaszlo.org/pipermail/laszlo-dev/attachments/20090530/65fff8eb/attachment-0001.html


More information about the Laszlo-dev mailing list