[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