--- Begin Message ---
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 maxcarl...@bank on 2009-05-29 16:04:26 PDT
in /Users/maxcarlson/openlaszlo/trunk-clean
for 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
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins
--- End Message ---