You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ha...@apache.org on 2019/12/22 16:39:20 UTC

[royale-asjs] branch develop updated: Cleaned up ElementWrapper and HTMLElementWrapper

This is an automated email from the ASF dual-hosted git repository.

harbs pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


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 <ha...@in-tools.com>
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;
         }
     }
 


Re: [royale-asjs] branch develop updated: Cleaned up ElementWrapper and HTMLElementWrapper

Posted by Alex Harui <ah...@adobe.com.INVALID>.

On 12/23/19, 11:48 PM, "Harbs" <ha...@gmail.com> wrote:

    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.

IMO, it is legal AS/JS.  I think Closure Compiler should have warned on e.bubbles;  Are you sure it didn't?

I'm done working for today.  You might learn something by stepping through the goog.events dispatching before and after your changes.
    
    I keep feeling like we should replace goog.events with our own code, but it’s a scary change… ;-)
    
I think it is safe to get rid of goog.events, but yes, it is a big change.

HTH,
-Alex

    > On Dec 24, 2019, at 9:01 AM, Alex Harui <ah...@adobe.com.INVALID> 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, "harbs@apache.org <ma...@apache.org>" <harbs@apache.org <ma...@apache.org>> 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&amp;data=02%7C01%7Caharui%40adobe.com%7C2239b5c53a5e40ad97cb08d78845b373%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637127705258305361&amp;sdata=9byOZCM%2Baxx5FSJPrfIqO50MH7SSocQP9iOqK7%2BIiBs%3D&amp;reserved=0 <https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7C2239b5c53a5e40ad97cb08d78845b373%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637127705258315356&amp;sdata=7aCHCOQpPN0G42L2L4udJj8WEno2nFDhNPWR6q5W%2FcA%3D&amp;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 <harbs@in-tools.com <ma...@in-tools.com>>
    >    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;
    >             }
    >         }
    
    


Re: [royale-asjs] branch develop updated: Cleaned up ElementWrapper and HTMLElementWrapper

Posted by Harbs <ha...@gmail.com>.
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 <ah...@adobe.com.INVALID> 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, "harbs@apache.org <ma...@apache.org>" <harbs@apache.org <ma...@apache.org>> 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&amp;data=02%7C01%7Caharui%40adobe.com%7Cec736cad56b3465bb2aa08d786fd7eea%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637126295667140081&amp;sdata=ELMay%2FqtfOHVtm0GoQNdXhXrxhKRerWukYuHHhqZJ4E%3D&amp;reserved=0 <https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7Cec736cad56b3465bb2aa08d786fd7eea%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637126295667140081&amp;sdata=ELMay%2FqtfOHVtm0GoQNdXhXrxhKRerWukYuHHhqZJ4E%3D&amp;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 <harbs@in-tools.com <ma...@in-tools.com>>
>    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;
>             }
>         }


Re: [royale-asjs] branch develop updated: Cleaned up ElementWrapper and HTMLElementWrapper

Posted by Alex Harui <ah...@adobe.com.INVALID>.
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, "harbs@apache.org" <ha...@apache.org> 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&amp;data=02%7C01%7Caharui%40adobe.com%7Cec736cad56b3465bb2aa08d786fd7eea%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C637126295667140081&amp;sdata=ELMay%2FqtfOHVtm0GoQNdXhXrxhKRerWukYuHHhqZJ4E%3D&amp;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 <ha...@in-tools.com>
    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;
             }
         }