nvaccess / nvda

NVDA, the free and open source Screen Reader for Microsoft Windows
https://www.nvaccess.org/
Other
2.11k stars 637 forks source link

NVDA does not identify page title change in Single page Apps(SPA) #12078

Open gauravahir28 opened 3 years ago

gauravahir28 commented 3 years ago

NVDA does not Identify the page title change in Single page applications(SPA). Where as, JAWS Identifies the same!

I was working on a Survey application which was built using React JS. For each survey, the page title was getting changed to the question of the survey The JAWS was announcing the page title as soon as it was getting changed, Where as NVDA wasn't! We had to do some focus management stuff to make NVDA announce the same.

Steps to reproduce:

I can't provide the survey application URL as it is a internal stuff, But you can produce the same behavior on React JS's Official website. Head over to React JS Home page and do the following:


Minimal sample from comment https://github.com/nvaccess/nvda/issues/12078#issuecomment-1243742106 We have the same problem. Inter-page navigation with plain-js works as expected, but when updating the document.title with plain-js, nvda doesn't announce the title change.

Here is a live plain-js example: https://yasinkuralay.github.io/Nvda-12078-Bug-Reproduction/

Or you can clone the github repo: https://github.com/YasinKuralay/Nvda-12078-Bug-Reproduction.git

Actual behavior:

If the Dynamic reporting of the content is turned on, NVDA will speak Navigated to Docs, Navigated to Tutorial etc. as React JS Team has Implemented live announcement for the accessibility purpose. Where as if the Dynamic reporting of the content is turned off, NVDA will speak nothing!

Expected behavior:

NVDA should identify page title change in single page applications(SPA) as it identifies for any other pages.

System configuration

NVDA installed/portable/running from source:

Installed

NVDA version:

2020.3

Windows version:

Windows 10(20H2)

Name and version of other software in use when reproducing the issue:

Other information about your system:

Other questions

Does the issue still occur after restarting your computer?

Yes

Have you tried any other versions of NVDA? If so, please report their behaviors.

Same behavior with NVDA 2020.2

If addons are disabled, is your problem still occuring?

Not tried.

Did you try to run the COM registry fixing tool in NVDA menu / tools?

Yes

Adriani90 commented 3 years ago

Could you please check in the advanced settings if cancelable speech is on or off? Please try both settings and report if the behavior changes. This would help to investigate further.

gauravahir28 commented 3 years ago

Hay @Adriani90 - I tried both! But the behavior is same as I menssioned earlier.

feerrenrut commented 3 years ago

Could you provide a minimal test case (plain html, plain js)? This will help us to understand the mechanism being used to update the title. We can then investigate look at the events the browser / windows is sending to notify of the title change.

gauravahir28 commented 3 years ago

We aren't using plain JS for our project. We are using React JS for the project. With Plain JS, NVDA works as expected Where as with Single page applications using React, Angular etc. it does not identify the page title change. As I menssioned in my first comment, You can replicate the behavior at your end by visiting to React JS Home page

feerrenrut commented 3 years ago

React JS only delivers html, javascript and css to the client. It must be possible to reproduce this issue with plain JS. I understand this may not be something you are interested in investigating.

Can you confirm if you have tried other browsers (Chrome / Firefox)?

gauravahir28 commented 3 years ago

I can produce this issue on all the browsers listed below with their versions:

Also, you can produce the same issue on Angular JS home page.

Just click on any navigation link such as features, Docs, RESOURCES etc. You will notice that, the page title gets changed but NVDA does not convey the same!

zersiax commented 3 years ago

I believe that for example Netlify has solved this by echoing " navigated to XYZ" to presumably some aria-live region somewhere. While it's not plain JS, the Angular website linked to above should be a good starting point to look at what events are being used to alter the page title? Presumably it's just loading in a new component, I don't currently have the time or resources to really dig into this though.

YasinKuralay commented 2 years ago

We have the same problem. Inter-page navigation with plain-js works as expected, but when updating the document.title with plain-js, nvda doesn't announce the title change.

Here is a live plain-js example @feerrenrut : https://yasinkuralay.github.io/Nvda-12078-Bug-Reproduction/

Or you can clone the github repo: https://github.com/YasinKuralay/Nvda-12078-Bug-Reproduction.git

jcsteh commented 2 years ago

There are a few things at play here.

First, some browsers don't fire a name change event on the document when its title changes. You can reproduce that with this test case: data:text/html,<title>before</title><div onclick="document.title = 'after';">change</div> In Chromium (and Firefox before version 101), if you press enter on "change", NVDA says nothing. The document title changes to "after", but no event is fired, so NVDA doesn't know about the change. I fixed this in Firefox 101; see https://bugzilla.mozilla.org/show_bug.cgi?id=1748393. This needs to be fixed in Chromium as well.

Second, NVDA doesn't report name changes except for the focus. This normally makes sense, but it probably should report name changes for document ancestors. You can reproduce this with this test case: data:text/html,<title>before</title><button onclick="document.title = 'after';">change</button> Even in Firefox, this doesn't work because the "change" button gets focus. Even though Firefox fires a name change on the document, NVDA ignores it.

cary-rowen commented 2 years ago

Hello, @seanbudd @michaelDCurran

14224 and #13471, also related to this?

Was the information provided by @jcsteh helpful in solving this problem?