airsdk / Adobe-Runtime-Support

Report, track and discuss issues in Adobe AIR. Monitored by Adobe - and HARMAN - and maintained by the AIR community.
203 stars 11 forks source link

[Bug] Windows: Any control + letter result in weird empty rectangle in the text field. #2815

Closed bobaoapae closed 7 months ago

bobaoapae commented 1 year ago

Hello i started using sdk yesterday and already buyed a one year license as almost works 99%.

One of the issues i'm having is this:

Whenever i copy some text and try to paste in the air application(It's a game) the text became just the random thing show in the image above. Copy text from game to paste in some others app works without problem, just pasting anything in the game don't works

image

bobaoapae commented 1 year ago

Update:

The issue it's not the paste Control + V, any Control + letter result in this weird character in the text area

ajwfrost commented 1 year ago

Hi

What platform is this on? And is that just a normal text field?

It looks like five 'empty rectangle' characters which are what would be displayed if there was no appropriate character available in the selected font, so can you please also check the text format that's applied there to ensure it's not an embedded font, or if it is, please make sure all the font characters are included (not sure if you're creating this from Animate or a tool that only embeds characters that are required in the source..)

Also just wondering if you can read out the value of the text field to see what the 'text' contents area when this happens - and then what happens if you set those values manually?

Could be all sorts of things I'm afraid! but with the above it will help us narrow it down a bit..

thanks

bobaoapae commented 1 year ago

Hello, it's windows I don't checked in others plataforma wet. Theses empty rectangles only show when I press control + any letter. Like: control + a, control + c, control + v etc etc etc. If I just type works normally, right click copy and paste also works without problem.

Other example. Control + a should select all the text in the text field but instead it's not doing this and acting adding theses rectangles

bobaoapae commented 1 year ago

Here it's a video showing the issue

Video of the issue

M4rkY4 commented 1 year ago

I believe, it would be easier for somebody to help if you would trace and write here what symbols/symbol codes are they printing. Cause every [] is some symbol/letter and it means something, and what exact symbol and in what encoding your actions type, as well as the font you use and what symbols from that font you embed, might help in better understanding the cause.

bobaoapae commented 1 year ago

Font it's Arial:

_inputField = new TextField(); _inputField.type = "input"; _inputField.autoSize = "none"; _inputField.multiline = false; _inputField.wordWrap = false; _inputField.maxChars = 100; _inputField.x = loc1.x; _inputField.y = loc1.y; _inputField.height = 20; addChild(_inputField); _inputField.addEventListener("change", onInputFieldChange); _inputField.addEventListener(TextEvent.TEXT_INPUT, onTextInput); setTextFormat(new TextFormat("Arial",12,65280));

private function setTextFormat(param1:TextFormat) : void { _inputField.defaultTextFormat = param1; _inputField.setTextFormat(param1); }

private function __onInputFieldChange(param1:Event) : void { if(_inputField.text) { trace("Input Field Changed: ", _inputField.text); } }

private function __onTextInput(param1:TextEvent):void { trace("Input Field Input: ", param1.text); }

[trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed: [trace] Input Field Changed:

[trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input: [trace] Input Field Input:

Yeah just show empty in the output console.

bobaoapae commented 1 year ago

Even showing empty in the trace statement, the empty rectangle are added to the textfield as show in the video.

bobaoapae commented 1 year ago

image

If i copy and paste from the input in to Notepad++ they show theses code, any control + letter generate some other weird code

bobaoapae commented 1 year ago
          if (param1.ctrlKey)
                      {
                          param1.preventDefault();
                          if (param1.keyCode == 65)
                          {
                              _inputField.setSelection(0, _inputField.text.length);
                          }
                          else if (param1.keyCode == 67)
                          {
                              //get selection or all text and copy to clipboard
                              if (_inputField.selectionBeginIndex != _inputField.selectionEndIndex)
                              {
                                  Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, _inputField.text.substring(_inputField.selectionBeginIndex, _inputField.selectionEndIndex));
                              }
                              else
                              {
                                  Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, _inputField.text);
                              }
                          }
                          else if (param1.keyCode == 86)
                          {
                              if (!Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT))
                                  return;
                              var data:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String;
                              if (_inputField.selectionBeginIndex != _inputField.selectionEndIndex)
                              {
                                  _inputField.replaceText(_inputField.selectionBeginIndex, _inputField.selectionEndIndex, data);
                                  _inputField.setSelection(_inputField.selectionBeginIndex + data.length, _inputField.selectionBeginIndex + data.length);
                              }
                              else
                              {
                                  _inputField.replaceText(_inputField.caretIndex, _inputField.caretIndex, Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String);
                                  _inputField.setSelection(_inputField.caretIndex + data.length, _inputField.caretIndex + data.length);
                              }
                          }
                          else if (param1.keyCode == 88)
                          {
                              if (_inputField.selectionBeginIndex != _inputField.selectionEndIndex)
                              {
                                  Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, _inputField.text.substring(_inputField.selectionBeginIndex, _inputField.selectionEndIndex));
                                  _inputField.replaceText(_inputField.selectionBeginIndex, _inputField.selectionEndIndex, "");
                                  _inputField.setSelection(_inputField.selectionBeginIndex, _inputField.selectionBeginIndex);
                              }
                              else
                              {
                                  Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, _inputField.text);
                                  _inputField.text = "";
                              }
                          }
                          return;
                      }

Manually handling the expected behavior fix the problem, but this should not be needed, i have to do this to all my inputx text to works as expected

ajwfrost commented 1 year ago

So it looks like the ctrl-letter combination is resulting in a key code that's just a = 1, b = 2, c = 3, v = 22 etc (ascii value 1 = 'SOH' control code... etc)

Your code snippets imply this is just a regular TextField object that's getting the text. And it's Windows -> what version, and do you have any options with virtual keyboards or other language input options?

I don't suppose you have Visual Studio available and could do a "spy" on this, to find out what Windows messages are going to it? https://learn.microsoft.com/en-us/visualstudio/debugger/introducing-spy-increment

Alternatively if it would be possible for you to package up your app as a bundle and zip it up, could we try it here and see if we can reproduce this and then spy on things?

Or actually, probably the first thing to try is what happens if you have Adobe Scout running? Load up your application and then do the ctrl-a etc. In the Scout window, if you click on the frame in which you've pressed the keyboard (you can see where these would be in the 'events' section) and then if you click on "Activity sequence" on the bottom right, you should see something like

Handling event "keydown": 102

When I try it, hitting 'a' gives me a keydown of 97 and then a keypress of 97. Hitting ctrl-a gives me a keydown of 97 and an immediate keypress of 12. It would be good to know whether the keydown of 97 still happens when you are using the ctrl button - if not, then it seems something (in Windows?) is translating the key code before it gets to AIR...?

thanks

bobaoapae commented 1 year ago

With the control pressed scout show the events but don't show the Handling Event login in the activity sequence. Without the control pressed show as expected. Control pressed: image image Without control: image image Event flood if keep control pressed without pressing others keys: image

ajwfrost commented 1 year ago

Seems like something is very wrong with the keyboard input on this... what language have you got Windows set to? and is there a different display language from the keyboard input language? Presumably it's a hardware keyboard rather than a virtual one?

I think we can put together a quick and simple Windows app that shows what events are being received when you press various key combinations, which will help us understand what's happening and whether we can handle these within AIR...

thanks

bobaoapae commented 1 year ago

The alt + key you can ignore, it's my bad from the previous code, users are using control + alt to get some keyboards key and my code preventdefault if control pressed.

The issue remain only control + any key like explain before.

Windows language: PT_BR Hardware keyboard, any keyboard layout as the issue occurs to all our client using some or other keyboard layout ABNT2/US INTERNATIONAL, and any windows windows 7,8,8.1,10

bobaoapae commented 1 year ago

@ajwfrost any news on that? This it's really impacting my application

pol2095 commented 1 year ago

I can repoduce it in Windows 11 french.

bobaoapae commented 12 months ago

@ajwfrost hello, any updates on that issue?

ajwfrost commented 11 months ago

Hi

We've still not been able to reproduce this on Windows 10 or 11, reviewing it again I'm wondering if it's due to a hardware keyboard (we've just been trying by switching the keyboard and windows input/display languages).

From some testing (with thanks to @bobaoapae) it seems we're still getting the same Windows key events on all platforms, the issue is then in how the WM_KEYDOWN event is being handled for the ctrl-a, ctrl-c etc cases. This should be picked up by the application code and translated into a call to select-all, copy etc, and the event should then have 'preventDefault' set, which means we ignore the subsequent WM_CHAR event. If that WM_CHAR gets through, it causes the square/invalid character shown in the text field.

The mystery really is why the events aren't being picked up for translation. It looks like they should be, it's not particularly complex code; the only things that may prevent it are perhaps the other settings (alt/shift/etc, but those look to be the same) or whether there's a native menu accelerator that's getting in the way.

Could someone please put the below code into a simple SWF file (call testInputTextField() to initialise) and then let us know the trace logs if they press/release the 'a' button, then press ctrl and hold it, press/release 'a', and then release ctrl?

        private function testInputTextField() : void
        {
            var tf : TextField = new TextField();
            tf.type = "input";
            tf.border = true;
            tf.width = 300;
            tf.height = 70;
            tf.x = tf.y = 20;
            addChild(tf);
            NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownCapture, true, int.MAX_VALUE, false);
            NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownCapture2, true, int.MIN_VALUE, false);
            NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownBubble, false, int.MAX_VALUE, false);
            NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownBubble2, false, int.MIN_VALUE, false);
            tf.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboard);
            tf.addEventListener(KeyboardEvent.KEY_UP, onKeyboard);

            var appMenu : NativeMenu = null;
            if (NativeApplication.supportsMenu)
            {
                trace("NativeApplication supports menu");
                appMenu = NativeApplication.nativeApplication.menu;
            }
            else
            {
                if (NativeApplication.nativeApplication.activeWindow && NativeWindow.supportsMenu)
                {
                    trace("NativeWindow present and supports menu");
                    appMenu = NativeApplication.nativeApplication.activeWindow.menu;
                }
            }
            if (appMenu) trace("MENU IS PRESENT");
            else trace("No menu present");
        }
        private function onKeyboard(e : KeyboardEvent) : void
        {
            trace("TextField: " + e.toString());
            if (e.type == KeyboardEvent.KEY_UP)
            {
                var strOutput : String = "String = ";
                var txt : String = (e.target as TextField).text;
                for (var i : uint = 0; i < txt.length; i++)
                {
                    if (i) strOutput += ", ";
                    strOutput += txt.charCodeAt(i);
                }
                trace(strOutput);
            }
        }
        private function onKeyDownCapture(e : KeyboardEvent) : void
        {
            trace("\nCapture before: " + e.toString());
            if (e.isDefaultPrevented()) trace("Default is prevented");
        }
        private function onKeyDownCapture2(e : KeyboardEvent) : void
        {
            trace("Capture after:  " + e.toString());
            if (e.isDefaultPrevented()) trace("Default is prevented");
        }
        private function onKeyDownBubble(e : KeyboardEvent) : void
        {
            trace("Bubbles before: " + e.toString());
            if (e.isDefaultPrevented()) trace("Default is prevented");
            if (e.ctrlKey && !e.shiftKey && !e.altKey && !e.commandKey)
            {
                var bSpecial : Boolean = ("xXcCvVaA".indexOf(String.fromCharCode(e.charCode)) != -1);
                trace("Checking char code = " + e.charCode + " = [" + String.fromCharCode(e.charCode) + "]" + (bSpecial ? " - SPECIAL" : ""));
            }
        }
        private function onKeyDownBubble2(e : KeyboardEvent) : void
        {
            trace("Bubbles after:  " + e.toString());
            if (e.isDefaultPrevented()) trace("Default is prevented");
        }
ajwfrost commented 11 months ago

@bobaoapae @pol2095 wondering whether either of you could get an app set up with the above code and see if you can reproduce it, it would be good if we could get to the bottom of why the keyboard shortcuts aren't getting interpreted properly!

thanks

pol2095 commented 11 months ago

On Windows 11 AZERTY keyboard, for me [Ctrl+a] work correctly, but for example [Ctrl+e] result in weird empty rectangle in the text field, [Ctrl+l] result in weird top arrow in the text field.

I used [Ctrl+e] :

No menu present

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=101 keyCode=69 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=101 keyCode=69 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=101 keyCode=69 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=101 keyCode=69 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=101 keyCode=69 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyUp" bubbles=true cancelable=false eventPhase=2 charCode=101 keyCode=69 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
String = 101

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=101 keyCode=69 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=101 keyCode=69 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=101 keyCode=69 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=101 keyCode=69 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 101 = [e]
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=101 keyCode=69 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyUp" bubbles=true cancelable=false eventPhase=2 charCode=101 keyCode=69 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
String = 101, 5
TextField: [KeyboardEvent type="keyUp" bubbles=true cancelable=false eventPhase=2 charCode=0 keyCode=17 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
String = 101, 5

and [Ctrl+l]

No menu present

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=108 keyCode=76 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=108 keyCode=76 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=108 keyCode=76 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=108 keyCode=76 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=108 keyCode=76 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyUp" bubbles=true cancelable=false eventPhase=2 charCode=108 keyCode=76 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
String = 108

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 0 = []
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]

Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=108 keyCode=76 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=108 keyCode=76 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=2 charCode=108 keyCode=76 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=108 keyCode=76 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
Checking char code = 108 = [l]
Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=108 keyCode=76 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
TextField: [KeyboardEvent type="keyUp" bubbles=true cancelable=false eventPhase=2 charCode=108 keyCode=76 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
String = 108, 12
TextField: [KeyboardEvent type="keyUp" bubbles=true cancelable=false eventPhase=2 charCode=0 keyCode=17 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
String = 108, 12
ajwfrost commented 11 months ago

Okay thanks. So if the ctrl-a/c/v/x shortcuts are being handled, then the behaviour you see above would be considered to be expected (and I see the same here, when using ctrl-e to inject a non-printable character..)

I think we shouldn't change that behaviour due to the potential impact on other people. If you don't want these non-printable characters to be sent to the text field, you can add another handler to prevent it e.g. for a global change:

NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, function(e:KeyboardEvent):void {
    if (e.ctrlKey)
    {
        var bSpecial : Boolean = ("xXcCvVaA".indexOf(String.fromCharCode(e.charCode)) != -1);
        if (!bSpecial) e.preventDefault();
    }
});

But I think @bobaoapae was seeing that even a ctrl-a shortcut resulted in a non-printable character being added....

thanks

pol2095 commented 11 months ago

@ajwfrost Good idea, thanks.

bobaoapae commented 11 months ago

Logs for control + a, control + c, control +v, control +x

[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 0 = []
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 97 = [a] - SPECIAL
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Default is prevented
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 0 = []
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=99 keyCode=67 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=99 keyCode=67 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=99 keyCode=67 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 99 = [c] - SPECIAL
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=99 keyCode=67 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Default is prevented
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 0 = []
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=118 keyCode=86 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=118 keyCode=86 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=118 keyCode=86 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 118 = [v] - SPECIAL
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=118 keyCode=86 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Default is prevented
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 0 = []
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=120 keyCode=88 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=120 keyCode=88 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=120 keyCode=88 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 120 = [x] - SPECIAL
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=120 keyCode=88 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Default is prevented
bobaoapae commented 11 months ago

Logs for press/release the 'a' button, then press ctrl and hold it, press/release 'a', and then release ctrl:

[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=97 keyCode=65 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=97 keyCode=65 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=97 keyCode=65 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=97 keyCode=65 keyLocation=0 ctrlKey=false altKey=false shiftKey=false controlKey=false commandKey=false functionKey=false]
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 0 = []
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=0 keyCode=17 keyLocation=1 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Capture after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=1 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Bubbles before: [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Checking char code = 97 = [a] - SPECIAL
[trace] Bubbles after:  [KeyboardEvent type="keyDown" bubbles=true cancelable=true eventPhase=3 charCode=97 keyCode=65 keyLocation=0 ctrlKey=true altKey=false shiftKey=false controlKey=true commandKey=false functionKey=false]
[trace] Default is prevented
bobaoapae commented 11 months ago
[trace] NativeWindow present and supports menu
[trace] No menu present
ajwfrost commented 11 months ago

Thanks @bobaoapae .. but from those logs, where you're seeing Default is prevented and not seeing any String = xx... output, it implies to me that you're not seeing these empty rectangles when you press ctrl-a etc?

bobaoapae commented 11 months ago

yes... for some reason in this example i don't get empty rectangles...

ajwfrost commented 11 months ago

@bobaoapae that seems odd; are you able to add any similar listeners into your original game that was showing up the problems, to see if we can spot where things are going wrong?

thanks