This is an automated email from the ASF dual-hosted git repository. gregdove 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 0172bd1 Flex emulation: Fix NPE errors when attempting to use event.currentTarget in a FocusEvent listener (consistent with approach being used for mx.events.MouseEvent) new 0a32d75 Merge branch 'develop' of https://github.com/apache/royale-asjs into develop 0172bd1 is described below commit 0172bd19c4e927b23942f82b8b7be9af6005e5e6 Author: greg-dove <greg.d...@gmail.com> AuthorDate: Fri Jun 5 13:31:56 2020 +1200 Flex emulation: Fix NPE errors when attempting to use event.currentTarget in a FocusEvent listener (consistent with approach being used for mx.events.MouseEvent) --- .../src/main/royale/mx/events/FocusEvent.as | 135 ++++++++++++++++++++- .../royale/mx/events/utils/FocusEventConverter.as | 8 +- 2 files changed, 136 insertions(+), 7 deletions(-) diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/events/FocusEvent.as b/frameworks/projects/MXRoyale/src/main/royale/mx/events/FocusEvent.as index c1e9873..c909cc3 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/events/FocusEvent.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/events/FocusEvent.as @@ -29,6 +29,7 @@ COMPILE::JS { import goog.events.BrowserEvent; import org.apache.royale.core.WrappedHTMLElement; + import org.apache.royale.events.getTargetWrapper; } import org.apache.royale.events.Event; @@ -111,9 +112,14 @@ public class FocusEvent extends org.apache.royale.events.Event super(type, bubbles, cancelable); _relatedObject = relatedObject; } - + + public var shiftKey:Boolean; + public var keyCode:uint; + public var direction:String; + + private var _target:Object; private var _relatedObject:Object; - + /** * @type {?goog.events.FocusEvent} */ @@ -124,10 +130,10 @@ public class FocusEvent extends org.apache.royale.events.Event */ private var nativeEvent:Object; - public function wrapEvent(event:Object):void + public function wrapEvent(event:goog.events.BrowserEvent):void { - //wrappedEvent = event; - nativeEvent = event; //.getBrowserEvent(); + wrappedEvent = event; + nativeEvent = event.getBrowserEvent(); //.getBrowserEvent(); } /** @@ -143,6 +149,125 @@ public class FocusEvent extends org.apache.royale.events.Event return _relatedObject; } + /** + * @copy org.apache.royale.events.BrowserEvent#target + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function get target():Object + { + return wrappedEvent ? getTargetWrapper(wrappedEvent.target) : _target; + } + override public function set target(value:Object):void + { + _target = value; + } + + /** + * @copy org.apache.royale.events.BrowserEvent#currentTarget + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function get currentTarget():Object + { + return wrappedEvent ? getTargetWrapper(wrappedEvent.currentTarget) : _target; + } + override public function set currentTarget(value:Object):void + { + _target = value; + } + + // TODO remove this when figure out how to preserve the real target + // The problem only manifests in SWF, so this alias is good enough for now + public function get targetBeforeBubbling():Object + { + return target; + } + + /** + * Whether the default action has been prevented. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function preventDefault():void + { + if(wrappedEvent) + wrappedEvent.preventDefault(); + else + { + super.preventDefault(); + _defaultPrevented = true; + } + } + + private var _defaultPrevented:Boolean; + /** + * Whether the default action has been prevented. + * @type {boolean} + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function get defaultPrevented():Boolean + { + return wrappedEvent ? wrappedEvent.defaultPrevented : _defaultPrevented; + } + override public function set defaultPrevented(value:Boolean):void + { + _defaultPrevented = value; + } + + /** + * Create a copy/clone of the Event object. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function cloneEvent():IRoyaleEvent + { + return new mx.events.FocusEvent(type, bubbles, cancelable, + relatedObject, shiftKey, keyCode, direction); + } + /** + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function stopImmediatePropagation():void + { + if(wrappedEvent) + { + wrappedEvent.stopPropagation(); + nativeEvent.stopImmediatePropagation(); + } + } + + /** + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.4 + */ + override public function stopPropagation():void + { + if(wrappedEvent) + wrappedEvent.stopPropagation(); + } + } diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/events/utils/FocusEventConverter.as b/frameworks/projects/MXRoyale/src/main/royale/mx/events/utils/FocusEventConverter.as index d61e4d2..3bc287f 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/mx/events/utils/FocusEventConverter.as +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/events/utils/FocusEventConverter.as @@ -171,13 +171,17 @@ package mx.events.utils * @royaleignorecoercion goog.events.BrowserEvent */ COMPILE::JS - public static function convert(nativeEvent:Object):FocusEvent + public static function convert(nativeEvent:Object,browserEvent:goog.events.BrowserEvent=null):mx.events.FocusEvent { var type:String = nativeEvent.type; if (type == "focusin") type = "focusIn"; if (type == "focusout") type = "focusOut"; var newEvent:FocusEvent = new FocusEvent(type, true); - newEvent.wrapEvent(nativeEvent as BrowserEvent); + if(!browserEvent) + { + browserEvent = new goog.events.BrowserEvent(nativeEvent as goog.events.Event,nativeEvent["currentTarget"]); + } + newEvent.wrapEvent(browserEvent); return newEvent; } }