Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to position the cursor in the editor using braille routing keys in NVDA #27216

Closed
bramd opened this issue May 24, 2017 · 16 comments
Closed
Assignees
Labels
accessibility Keyboard, mouse, ARIA, vision, screen readers (non-specific) issues bug Issue identified by VS Code Team member as probable bug verified Verification succeeded
Milestone

Comments

@bramd
Copy link

bramd commented May 24, 2017

  • VSCode Version: Code 1.12.2 (19222cd, 2017-05-10T13:20:36.315Z)
  • OS Version: Windows_NT ia32 10.0.15063

Steps to Reproduce:

  1. Open a file in the editor
  2. Ensure NVDA is in focus mode (for example by pressing space/enter on the editor)
  3. Use a cursor routing button on a connected braille display and click on a character in the text

Expected:

The cursor moves to the chosen position.

Actual:

Cursor doesn't move in the editor, but the cursor is displayed on the right position in braille in the textarea used for editor accessibility until it refreshes (e.g. by moving cursor using the keyboard).

@alexdima alexdima added the accessibility Keyboard, mouse, ARIA, vision, screen readers (non-specific) issues label May 29, 2017
@alexdima
Copy link
Member

@bramd Do you know if there is any way to simulate what NVDA does in this case without having a real braille display?

@alexdima alexdima added the bug Issue identified by VS Code Team member as probable bug label May 30, 2017
@bramd
Copy link
Author

bramd commented Jun 2, 2017

@alexandrudima I had a look in the NVDA source and it's not clear to me what NVDA does exactly. I guess it sends messages through the winapi or another API to instruct the textarea to move the cursor. I didn't catch any useful events with accevent and the default settings. Probably @jcsteh knows?

If you know another way to catch the events/messages being sent, I'm glad to provide a log.

@jcsteh
Copy link

jcsteh commented Jun 5, 2017

NVDA calls IAccessible2::setCaretOffset. I believe this is supposed to be reflected as a selectionChange DOM event. However, I think this may have only been implemented correctly in a fairly recent Chromium version, though I can't find a reference for this. Furthermore, MDN seems to suggest this is only supported for contentEditable in Chrome, not for input/textarea, though this could be outdated information. (I can't remember whether VS Code uses contentEditable or textarea, but vaguely recall textarea.)

@zersiax
Copy link

zersiax commented Jun 12, 2017

After doing some testing, this most likely is a Chromium issue. I had a play with Postman running in a Chrome Stable instance and ran into the same issue, haven't tried any experimental builds though. Looking at the behavior of the braille display it seems the accessibility API registers the event and acts on it, but doesn't actually properly move the caret.

@jcsteh
Copy link

jcsteh commented Jun 12, 2017

@zersiax commented on 13 Jun 2017, 04:26 GMT+10:

After doing some testing, this most likely is a Chromium issue. I had a play with Postman running in a Chrome Stable instance and ran into the same issue

Don't know anything about Postman, but assuming it does custom management of the caret, even if Chrome does fire the selectionChange DOM event, Postman would need to support this event and move its internal idea of the caret accordingly.

I confirmed that VS Code uses textarea. I also confirmed that Chrome (59) does fire selectionChange for textarea:

data:text/html,<textarea>foo</textarea><script>document.addEventListener("selectionchange", function() {alert('selectionChange');});</script>

If I call IAccessibleText::setCaretOffset (as will happen when you press a cursor routing key on a braille display), I get the alert.

@alexdima alexdima added this to the On Deck milestone Jun 13, 2017
@zersiax
Copy link

zersiax commented Jul 19, 2017

For braille users this is a bit of a productivity hog, do we know how we want to proceed on this one yet?

@ushiushix
Copy link

I use braille a lot especially for programming. I tried to use Code as my primary editor for Windows, but this issue blocked me.
Capability of jumping the cursor to the touching position immediately is the biggest advantage of braille displays.

@alexdima
Copy link
Member

alexdima commented Aug 8, 2017

I have briefly investigated listening to the browser event selectionchange. I received it all the time from the textarea, even when clicking around in VS Code or when alt+tabbing, so I cannot add some code that always resets the editor's cursor to the textarea caret when this event is received.

So I would need to write some filtering condition to figure out if this event is coming in due to the use of a Braille display and if we should react to it or not.

The problem I ran into is that I don't know at this time how to emulate/simulate a Braille display caret change i.e. as @jcsteh mentions, the IAccessible2::setCaretOffset call NVDA does, to try to discriminate the false selectionchange events from the ones we should react to.

I can poke around at building NVDA from source and try to get it to call IAccessible2::setCaretOffset or I could create a special version of VS Code where I log all the incoming selectionchange events and then ask you for a trace.

@jcsteh
Copy link

jcsteh commented Aug 8, 2017 via email

@alexdima
Copy link
Member

alexdima commented Aug 9, 2017

Thank you @jcsteh for the alternative steps. I pushed a change where we now listen to "selectionchange" and, with some heuristics, ignore the plethora of events generated by ourselves programmatically.

After these changes, I was quite successful in using Numpad9 or Numpad3 to navigate the review cursor and in using NDVA+Shift+NumpadMinus to move the editor cursor to the review cursor.

The change will show up in our Insiders channel once 1.15 makes it to the Stable channel (i.e. the first Insiders with version 1.16). I will ping you once that happens, to kindly ask for you to validate with a real Braille display.

@alexdima alexdima modified the milestones: August 2017, On Deck Aug 9, 2017
@bramd
Copy link
Author

bramd commented Aug 11, 2017 via email

@ushiushix
Copy link

Now I installed 1.16.0 insider build. Cursor routing keys moves the cursor in the document to the desired position.
I've tested it with JAWS.

Great! And thanks.

@zersiax
Copy link

zersiax commented Aug 23, 2017

Confirmed working in NVDA, provided braille is tethered to focus (nvda+ctrl+t to toggle). Excellent work :)

@alexdima
Copy link
Member

That is great news! Thank you @ushiushix and @zersiax for verifying it works ❤️ !

@derekriemer
Copy link

great work guys!

@roblourens roblourens added the verified Verification succeeded label Sep 1, 2017
@bramd
Copy link
Author

bramd commented Sep 3, 2017 via email

@vscodebot vscodebot bot locked and limited conversation to collaborators Nov 17, 2017
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
accessibility Keyboard, mouse, ARIA, vision, screen readers (non-specific) issues bug Issue identified by VS Code Team member as probable bug verified Verification succeeded
Projects
None yet
Development

No branches or pull requests

7 participants