You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ah...@apache.org on 2020/06/07 00:00:29 UTC

[royale-asjs] branch develop updated: cancel event for FileReference. Uses blur/focus in Chrome, uses key/mouse in other browsers which could cause delay in getting the event if user is perfectly idle.

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

aharui 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 2f4bbaa  cancel event for FileReference.  Uses blur/focus in Chrome, uses key/mouse in other browsers which could cause delay in getting the event if user is perfectly idle.
2f4bbaa is described below

commit 2f4bbaad8be2d279f6ec1cedc3af520f189cab7e
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sat Jun 6 16:59:59 2020 -0700

    cancel event for FileReference.  Uses blur/focus in Chrome, uses key/mouse in other browsers which could cause delay in getting the event if user is perfectly idle.
---
 .../org/apache/royale/file/beads/FileBrowser.as    | 83 +++++++++++++++++++++-
 1 file changed, 82 insertions(+), 1 deletion(-)

diff --git a/frameworks/projects/Network/src/main/royale/org/apache/royale/file/beads/FileBrowser.as b/frameworks/projects/Network/src/main/royale/org/apache/royale/file/beads/FileBrowser.as
index 9c34462..33aa2ae 100644
--- a/frameworks/projects/Network/src/main/royale/org/apache/royale/file/beads/FileBrowser.as
+++ b/frameworks/projects/Network/src/main/royale/org/apache/royale/file/beads/FileBrowser.as
@@ -81,7 +81,7 @@ package org.apache.royale.file.beads
 			delegate = document.createElement('input') as WrappedHTMLElement;
 			delegate.setAttribute('type', 'file');
 			goog.events.listen(delegate, 'change', fileChangeHandler);
-		}
+			}
 		
 		/**
 		 *  @private
@@ -106,6 +106,11 @@ package org.apache.royale.file.beads
 			createDelegate();
 		}
 		
+		COMPILE::JS
+		private var focusedButton:WrappedHTMLElement;
+		COMPILE::JS
+		private var interval:int = -1;
+		
 		/**
 		 *  Open up the system file browser. A user selection will trigger a 'modelChanged' event on the strand.
 		 *
@@ -113,6 +118,7 @@ package org.apache.royale.file.beads
 		 *  @playerversion Flash 10.2
 		 *  @playerversion AIR 2.6
 		 *  @productversion Royale 0.9
+		 *  @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
 		 */
 		public function browse():void
 		{
@@ -122,10 +128,84 @@ package org.apache.royale.file.beads
 			}
 			COMPILE::JS 
 			{
+				focusedButton = document.activeElement as WrappedHTMLElement;
+				//trace("activeElement is: " + focusedButton);
+				focusedButton.addEventListener("blur", blurHandler);
+				focusedButton.addEventListener("focus", focusHandler);				
+				window.addEventListener("keydown", keyHandler);
+				window.addEventListener("mousemove", mouseHandler);
+				window.addEventListener("mousedown", mouseHandler);
 				delegate.click();
 			}
 		}
 		
+		COMPILE::JS
+		private function blurHandler(e:Object):void
+		{
+			//trace("blur: " + e);
+			//trace("files: " + (delegate as HTMLInputElement).files.length);
+			cleanupWindow();
+		}
+		
+		COMPILE::JS
+		private function focusHandler(e:Object):void
+		{
+			//trace("focus: " + e);
+			//trace("files: " + (delegate as HTMLInputElement).files.length);
+			cleanup();
+			setTimeout(maybeCancel, 100);
+		}
+		
+		COMPILE::JS
+		private function keyHandler(e:Object):void
+		{
+			//trace("key: " + e);
+			//trace("files: " + (delegate as HTMLInputElement).files.length);
+			cleanup();
+			setTimeout(maybeCancel, 100);
+		}
+		
+		COMPILE::JS
+		private function mouseHandler(e:Object):void
+		{
+			//trace("mouse: " + e);
+			//trace("files: " + (delegate as HTMLInputElement).files.length);
+			cleanup();
+			setTimeout(maybeCancel, 100);
+		}
+				
+		COMPILE::JS
+		private function cleanupWindow():void
+		{
+			window.removeEventListener("keydown", keyHandler);
+			window.removeEventListener("mousemove", mouseHandler);
+			window.removeEventListener("mousedown", mouseHandler);
+		}
+		
+		COMPILE::JS
+		private function cleanup():void
+		{
+			focusedButton.removeEventListener("focus", focusHandler);
+			focusedButton.removeEventListener("blur", blurHandler);
+			window.removeEventListener("keydown", keyHandler);
+			window.removeEventListener("mousemove", mouseHandler);
+			window.removeEventListener("mousedown", mouseHandler);
+		}
+		
+		private var frameCount:int = 0;
+		
+		COMPILE::JS
+		private function maybeCancel():void
+		{
+			if ((delegate as HTMLInputElement).files.length) {
+				//trace("FileReference ok");
+			}
+			else {
+				host.dispatchEvent(new Event("cancel"));
+				//trace("FileReference cancel");
+			}
+		}
+						
 		/**
 		 *  @copy org.apache.royale.core.IBead#strand
 		 *  
@@ -154,6 +234,7 @@ package org.apache.royale.file.beads
 		COMPILE::JS
 		private function fileChangeHandler(e:org.apache.royale.events.Event):void
 		{
+			//trace("fileChange");
 			var fileModel:IFileModel = host.model as IFileModel;
 			fileModel.fileReference = (delegate as HTMLInputElement).files[0];
 			host.dispatchEvent(new Event("modelChanged"));