1) was code I added a few days ago to temporarily work around the bug of nested BrowserEvents.
The code you mention below is a bug (interesting the compiler didn’t catch it). I fixed it locally and tried removing e.bubbles completely. Neither made a difference. I keep feeling like we should replace goog.events with our own code, but it’s a scary change… ;-) > On Dec 24, 2019, at 9:01 AM, Alex Harui <[email protected]> wrote: > > Harbs, > > In HTMLElementWrapper, it looked like there were 3 main code paths: > > 1) if(eventObject is IBrowserEvent){ > 2a) if (converter) > 2b) else > > I'm only looking at this diff, but it feels like some of those may have > gotten lost, so please double-check. > > Also, it may be the Crux issue is related to this: > > - e = EventUtils.createEvent(eventType); > + e = EventUtils.createEvent(eventType), e.bubbles; > > HTH, > -Alex > > On 12/22/19, 8:39 AM, "[email protected] <mailto:[email protected]>" > <[email protected] <mailto:[email protected]>> wrote: > > This is an automated email from the ASF dual-hosted git repository. > > harbs pushed a commit to branch develop > in repository > https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&data=02%7C01%7Caharui%40adobe.com%7Cec736cad56b3465bb2aa08d786fd7eea%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637126295667140081&sdata=ELMay%2FqtfOHVtm0GoQNdXhXrxhKRerWukYuHHhqZJ4E%3D&reserved=0 > > <https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&data=02%7C01%7Caharui%40adobe.com%7Cec736cad56b3465bb2aa08d786fd7eea%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637126295667140081&sdata=ELMay%2FqtfOHVtm0GoQNdXhXrxhKRerWukYuHHhqZJ4E%3D&reserved=0> > > > The following commit(s) were added to refs/heads/develop by this push: > new f50c999 Cleaned up ElementWrapper and HTMLElementWrapper > f50c999 is described below > > commit f50c9990a3190cf681364905525656984ab2e9c5 > Author: Harbs <[email protected] <mailto:[email protected]>> > AuthorDate: Sun Dec 22 18:39:04 2019 +0200 > > Cleaned up ElementWrapper and HTMLElementWrapper > --- > .../beads/CrossBrowserFireListenerOverrideBead.as | 4 +- > .../org/apache/royale/core/ElementWrapper.as | 41 ++--- > .../org/apache/royale/core/HTMLElementWrapper.as | 204 > +-------------------- > .../org/apache/royale/events/KeyboardEvent.as | 4 +- > .../royale/org/apache/royale/events/MouseEvent.as | 4 +- > .../src/main/royale/mx/core/Application.as | 8 +- > .../main/royale/spark/components/Application.as | 4 +- > 7 files changed, 37 insertions(+), 232 deletions(-) > > diff --git > a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/CrossBrowserFireListenerOverrideBead.as > > b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/CrossBrowserFireListenerOverrideBead.as > index 36db48b..98532bd 100644 > --- > a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/CrossBrowserFireListenerOverrideBead.as > +++ > b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/CrossBrowserFireListenerOverrideBead.as > @@ -20,7 +20,7 @@ package org.apache.royale.html.beads > { > import org.apache.royale.core.IBead; > import org.apache.royale.core.IStrand; > - import org.apache.royale.core.HTMLElementWrapper; > + import org.apache.royale.core.ElementWrapper; > COMPILE::JS > { > import goog.events; > @@ -87,7 +87,7 @@ package org.apache.royale.html.beads > } > > e.wrapEvent(eventObject); > - return HTMLElementWrapper.googFireListener(listener, e); > + return ElementWrapper.googFireListener(listener, e); > } > } > } > diff --git > a/frameworks/projects/Core/src/main/royale/org/apache/royale/core/ElementWrapper.as > > b/frameworks/projects/Core/src/main/royale/org/apache/royale/core/ElementWrapper.as > index 58b7a64..ec7ab71 100644 > --- > a/frameworks/projects/Core/src/main/royale/org/apache/royale/core/ElementWrapper.as > +++ > b/frameworks/projects/Core/src/main/royale/org/apache/royale/core/ElementWrapper.as > @@ -27,6 +27,7 @@ package org.apache.royale.core > import org.apache.royale.events.ElementEvents; > import goog.events; > import goog.events.EventTarget; > + import goog.DEBUG; > } > COMPILE::SWF > { > @@ -77,8 +78,7 @@ package org.apache.royale.core > if (!_beads) > { > _beads = new Vector.<IBead>(); > - } > - > + } > _beads.push(bead); > bead.strand = this; > } > @@ -115,9 +115,7 @@ package org.apache.royale.core > public function removeBead(bead:IBead):IBead > { > var i:uint, n:uint, value:Object; > - > n = _beads.length; > - > for (i = 0; i < n; i++) > { > value = _beads[i]; > @@ -125,7 +123,7 @@ package org.apache.royale.core > if (bead === value) > { > _beads.splice(i, 1); > - > + bead.strand = null; > return bead; > } > } > @@ -173,6 +171,11 @@ package org.apache.royale.core > public class ElementWrapper extends EventDispatcher implements IStrand > { > > + /** > + * @royalesuppresspublicvarwarning > + */ > + static public var converterMap:Object = {}; > + > //-------------------------------------- > // Static Function > //-------------------------------------- > @@ -185,13 +188,13 @@ package org.apache.royale.core > */ > static public function fireListenerOverride(listener:Object, > eventObject:goog.events.BrowserEvent):Boolean > { > - /** > - * For now we're adding in some just-in-case code to prevent > conflicts with ElementWrapper. This needs to be fixed. > - */ > var e:IBrowserEvent; > - if(eventObject is IBrowserEvent){ > - e = eventObject as IBrowserEvent > - } else { > + var nativeEvent:Object = eventObject.getBrowserEvent(); > + var converter:Object = > converterMap[nativeEvent.constructor.name]; > + if (converter) > + e = converter["convert"](nativeEvent,eventObject); > + else > + { > e = new org.apache.royale.events.BrowserEvent(); > e.wrapEvent(eventObject); > } > @@ -262,7 +265,7 @@ package org.apache.royale.core > { > _beads = new Vector.<IBead>(); > } > - > + if (goog.DEBUG && !(bead is IBead)) throw new > TypeError('Cannot convert '+bead+' to IBead'); > _beads.push(bead); > bead.strand = this; > } > @@ -274,11 +277,8 @@ package org.apache.royale.core > public function getBeadByType(classOrInterface:Class):IBead > { > var bead:IBead, i:uint, n:uint; > - > if (!_beads) return null; > - > n = _beads.length; > - > for (i = 0; i < n; i++) > { > bead = _beads[i]; > @@ -299,9 +299,7 @@ package org.apache.royale.core > public function removeBead(bead:IBead):IBead > { > var i:uint, n:uint, value:Object; > - > n = _beads.length; > - > for (i = 0; i < n; i++) > { > value = _beads[i]; > @@ -309,7 +307,6 @@ package org.apache.royale.core > if (bead === value) > { > _beads.splice(i, 1); > - > return bead; > } > } > @@ -351,12 +348,12 @@ package org.apache.royale.core > override public function dispatchEvent(e:Object):Boolean > { > var eventType:String = ""; > - if (typeof(e) === 'string') > + if (typeof(e) == 'string') > { > eventType = e as String; > - if (e === Event.CHANGE) > + if (e == "change") > { > - e = EventUtils.createEvent(eventType); > + e = EventUtils.createEvent(eventType, e.bubbles); > } > } > else > @@ -364,7 +361,7 @@ package org.apache.royale.core > eventType = e.type; > if (ElementEvents.elementEvents[eventType]) > { > - e = EventUtils.createEvent(eventType); > + e = EventUtils.createEvent(eventType), e.bubbles; > } > } > var source:Object = this.getActualDispatcher_(eventType); > diff --git > a/frameworks/projects/Core/src/main/royale/org/apache/royale/core/HTMLElementWrapper.as > > b/frameworks/projects/Core/src/main/royale/org/apache/royale/core/HTMLElementWrapper.as > index d44fb29..59e571c 100644 > --- > a/frameworks/projects/Core/src/main/royale/org/apache/royale/core/HTMLElementWrapper.as > +++ > b/frameworks/projects/Core/src/main/royale/org/apache/royale/core/HTMLElementWrapper.as > @@ -144,92 +144,13 @@ package org.apache.royale.core > } > > COMPILE::JS > - public class HTMLElementWrapper extends EventDispatcher implements > IStrand > + public class HTMLElementWrapper extends ElementWrapper > { > > - //-------------------------------------- > - // Static Function > - //-------------------------------------- > - > - /** > - * @param listener The listener object to call > {goog.events.Listener}. > - * @param eventObject The event object to pass to the listener. > - * @return Result of listener. > - * @royaleignorecoercion org.apache.royale.events.IBrowserEvent > - */ > - static public function fireListenerOverride(listener:Object, > eventObject:goog.events.BrowserEvent):Boolean > - { > - /** > - * For now we're adding in some just-in-case code to prevent > conflicts with ElementWrapper. This needs to be fixed. > - */ > - var e:IBrowserEvent; > - if(eventObject is IBrowserEvent){ > - e = eventObject as IBrowserEvent > - } else { > - var nativeEvent:Object = eventObject.getBrowserEvent(); > - var converter:Object = > converterMap[nativeEvent.constructor.name]; > - if (converter) > - e = converter["convert"](nativeEvent,eventObject); > - else > - { > - e = new org.apache.royale.events.BrowserEvent(); > - e.wrapEvent(eventObject); > - } > - } > - return HTMLElementWrapper.googFireListener(listener, e); > - } > - > - /** > - * @royalesuppresspublicvarwarning > - */ > - static public var converterMap:Object = {}; > - > - /** > - * Static initializer > - */ > - static public function installOverride():Boolean > - { > - HTMLElementWrapper.googFireListener = > goog.events.fireListener; > - goog.events.fireListener = > HTMLElementWrapper.fireListenerOverride; > - return true; > - } > - > - //-------------------------------------- > - // Static Property > - //-------------------------------------- > - > - /** > - * The original fireListener. > - * > - * @royalesuppresspublicvarwarning > - */ > - static public var googFireListener:Function; > - > - /** > - * The properties that triggers the static initializer. > - * Note, in JS, this property has to be declared > - * after the installOverride. > - * > - * @royalesuppresspublicvarwarning > - */ > - static public var installedOverride:Boolean = installOverride(); > > //-------------------------------------- > // Property > //-------------------------------------- > - > - private var _element:WrappedHTMLElement; > - > - public function get element():WrappedHTMLElement > - { > - return _element; > - } > - > - public function set element(value:WrappedHTMLElement):void > - { > - _element = value; > - _element.royale_wrapper = this; > - } > > /** > * allow access from overrides > @@ -270,8 +191,6 @@ package org.apache.royale.core > } > } > > - private var _beads:Array; > - > //-------------------------------------- > // Function > //-------------------------------------- > @@ -280,85 +199,15 @@ package org.apache.royale.core > * @param bead The new bead. > * @royaleignorecoercion org.apache.royale.core.IBeadModel > */ > - public function addBead(bead:IBead):void > + override public function addBead(bead:IBead):void > { > - if (!_beads) > - { > - _beads = []; > - } > - if (goog.DEBUG && !(bead is IBead)) throw new > TypeError('Cannot convert '+bead+' to IBead') > - _beads.push(bead); > - > - if (bead is IBeadModel) > + if (bead is IBeadModel) > { > _model = bead as IBeadModel; > } > - > - bead.strand = this; > - } > - > - /** > - * @param classOrInterface The requested bead type. > - * @return The bead. > - */ > - public function getBeadByType(classOrInterface:Class):IBead > - { > - var bead:IBead, i:uint, n:uint; > - > - if (!_beads) return null; > - > - n = _beads.length; > - > - for (i = 0; i < n; i++) > - { > - bead = _beads[i]; > - > - if (bead is classOrInterface) > - { > - return bead; > - } > - } > - > - return null; > + super.addBead(bead); > } > - > - /** > - * @param bead The bead to remove. > - * @return The bead. > - */ > - public function removeBead(bead:IBead):IBead > - { > - var i:uint, n:uint, value:Object; > - > - n = _beads.length; > - > - for (i = 0; i < n; i++) > - { > - value = _beads[i]; > - > - if (bead === value) > - { > - _beads.splice(i, 1); > - bead.strand = null; > - return bead; > - } > - } > - > - return null; > - } > - > - override public function addEventListener(type:String, > handler:Function, opt_capture:Boolean = false, opt_handlerScope:Object = > null):void > - { > - var source:Object = getActualDispatcher_(type); > - goog.events.listen(source, type, handler); > - } > - > - override public function removeEventListener(type:String, > handler:Function, opt_capture:Boolean = false, opt_handlerScope:Object = > null):void > - { > - var source:Object = getActualDispatcher_(type); > - goog.events.unlisten(source, type, handler); > - } > - > + > private function getActualDispatcher_(type:String):Object > { > var source:Object = this; > @@ -368,48 +217,7 @@ package org.apache.royale.core > } > return source; > } > - > - override public function hasEventListener(type:String):Boolean > - { > - var source:Object = this.getActualDispatcher_(type); > - > - return goog.events.hasListener(source, type); > - } > - > - /** > - * @royaleignorecoercion String > - */ > - override public function dispatchEvent(e:Object):Boolean > - { > - var eventType:String = ""; > - if (typeof(e) === 'string') > - { > - eventType = e as String; > - if (e === org.apache.royale.events.Event.CHANGE) > - { > - e = EventUtils.createEvent(eventType, e.bubbles); > - } > - } > - else > - { > - eventType = e.type; > - if (ElementEvents.elementEvents[eventType]) > - { > - e = EventUtils.createEvent(eventType, e.bubbles); > - } > - } > - var source:Object = this.getActualDispatcher_(eventType); > - if (e.bubbles) { > - return dispatchBubblingEvent(source, e); > - } > - if (source == this) > - { > - return super.dispatchEvent(e); > - } > - > - return source.dispatchEvent(e); > - } > - > + > /** > * @royaleignorecoercion org.apache.royale.events.IEventDispatcher > */ > diff --git > a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/KeyboardEvent.as > > b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/KeyboardEvent.as > index bbcaa1d..8719a1e 100644 > --- > a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/KeyboardEvent.as > +++ > b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/KeyboardEvent.as > @@ -21,7 +21,7 @@ package org.apache.royale.events > COMPILE::JS > { > import goog.events.BrowserEvent; > - import org.apache.royale.core.HTMLElementWrapper; > + import org.apache.royale.core.ElementWrapper; > import org.apache.royale.events.Event; > import org.apache.royale.events.utils.KeyboardEventConverter; > } > @@ -314,7 +314,7 @@ package org.apache.royale.events > COMPILE::JS > public static function setupConverter():Boolean > { > - HTMLElementWrapper.converterMap["KeyboardEvent"] = > KeyboardEventConverter; > + ElementWrapper.converterMap["KeyboardEvent"] = > KeyboardEventConverter; > return true; > } > > diff --git > a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/MouseEvent.as > > b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/MouseEvent.as > index 0d30f31..33bb052 100644 > --- > a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/MouseEvent.as > +++ > b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/MouseEvent.as > @@ -32,7 +32,7 @@ package org.apache.royale.events > > import goog.events.BrowserEvent; > > - import org.apache.royale.core.HTMLElementWrapper; > + import org.apache.royale.core.ElementWrapper; > import org.apache.royale.events.Event; > import org.apache.royale.events.utils.MouseEventConverter; > } > @@ -838,7 +838,7 @@ package org.apache.royale.events > > public static function setupConverter():Boolean > { > - HTMLElementWrapper.converterMap["MouseEvent"] = > MouseEventConverter; > + ElementWrapper.converterMap["MouseEvent"] = > MouseEventConverter; > _useNativeConstructor = typeof window.MouseEvent == > 'function'; > return true; > } > diff --git > a/frameworks/projects/MXRoyale/src/main/royale/mx/core/Application.as > b/frameworks/projects/MXRoyale/src/main/royale/mx/core/Application.as > index 2e79aec..525bed2 100644 > --- a/frameworks/projects/MXRoyale/src/main/royale/mx/core/Application.as > +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/core/Application.as > @@ -66,7 +66,7 @@ import mx.managers.FocusManager; > import mx.managers.ISystemManager; > > COMPILE::JS { > - import org.apache.royale.core.HTMLElementWrapper; > + import org.apache.royale.core.ElementWrapper; > import org.apache.royale.events.ElementEvents; > } > > @@ -632,9 +632,9 @@ public class Application extends Container implements > IStrand, IParent, IEventDi > COMPILE::JS > public function initializeApplication():void > { > - HTMLElementWrapper.converterMap["MouseEvent"] = > MouseEventConverter; > - HTMLElementWrapper.converterMap["KeyboardEvent"] = > KeyboardEventConverter; > - HTMLElementWrapper.converterMap["FocusEvent"] = > FocusEventConverter; > + ElementWrapper.converterMap["MouseEvent"] = MouseEventConverter; > + ElementWrapper.converterMap["KeyboardEvent"] = > KeyboardEventConverter; > + ElementWrapper.converterMap["FocusEvent"] = FocusEventConverter; > addEventListener(KeyboardEvent.KEY_DOWN, > keyDownForCapsLockHandler); > > initManagers(); > diff --git > a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Application.as > > b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Application.as > index a840ea3..0a85538 100644 > --- > a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Application.as > +++ > b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Application.as > @@ -67,7 +67,7 @@ import mx.events.utils.MouseEventConverter; > import mx.managers.ISystemManager; > > COMPILE::JS { > - import org.apache.royale.core.HTMLElementWrapper; > + import org.apache.royale.core.ElementWrapper; > } > > import org.apache.royale.binding.ContainerDataBinding; > @@ -324,7 +324,7 @@ public class Application extends SkinnableContainer > implements IStrand, IParent, > > COMPILE::JS > { > - HTMLElementWrapper.converterMap["MouseEvent"] = > MouseEventConverter; > + ElementWrapper.converterMap["MouseEvent"] = > MouseEventConverter; > } > }
