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

Vertical navigation: offset too big for buffer causes NVDA to freeze for a while at least for 8 seconds for every key press #16382

Closed
Adriani90 opened this issue Apr 11, 2024 · 2 comments · Fixed by #16385
Milestone

Comments

@Adriani90
Copy link
Collaborator

Steps to reproduce:

  1. Running NVDA, open this website, but it happens on many websites:
    https://ci.appveyor.com/project/NVAccess/nvda
  2. While in browse mode, assign an input gesture for vertical navigation, e.g. nvda+alt+up and down arrow keys
  3. Navigate to the current build
    4.1. Navigate vertically starting from the last pull request displayed there
    4.2. Go to the console where you can see the building process, and start vertical navigation from there.

Actual behavior:

in 4.1, NVDA freezes after a while even it doesn't find any further vertically aligned elements on the screen. Following is written to the log:

IO - inputCore.InputManager.executeGesture (07:25:27.899) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
IO - speech.speech.speak (07:25:27.940) - MainThread (13164):
Speaking ['Link', 'master', ' ', 'Link', '20342a38', ' ']
IO - inputCore.InputManager.executeGesture (07:25:29.235) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:29.749) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - inputCore.InputManager.executeGesture (07:25:35.953) - winInputHook (5656):
Input: kb(laptop):downArrow
IO - speech.speech.speak (07:25:37.460) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
IO - speech.speech.speak (07:25:37.464) - MainThread (13164):
Speaking ['Link', '20342a38', ' ']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:25:37.469) - Dummy-9 (8952):
Thread 20760, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67983 too big for buffer, returning false

DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:37.757) - watchdog (8260):
Recovered from potential freeze after 8.508360700041521 seconds.
IO - inputCore.InputManager.executeGesture (07:25:38.952) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:39.462) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - inputCore.InputManager.executeGesture (07:25:40.911) - winInputHook (5656):
Input: kb(laptop):downArrow
IO - speech.speech.speak (07:25:47.335) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
IO - speech.speech.speak (07:25:47.335) - MainThread (13164):
Speaking ['15 min 57 sec ']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:25:47.339) - Dummy-9 (8952):
Thread 7072, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67983 too big for buffer, returning false

DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:47.474) - watchdog (8260):
Recovered from potential freeze after 8.511709100042935 seconds.
IO - inputCore.InputManager.executeGesture (07:25:48.405) - winInputHook (5656):
Input: kb(laptop):upArrow
IO - speech.speech.speak (07:25:48.413) - MainThread (13164):
Speaking ['Link', '20342a38', ' ']
IO - inputCore.InputManager.executeGesture (07:25:48.806) - winInputHook (5656):
Input: kb(laptop):downArrow
IO - speech.speech.speak (07:25:48.810) - MainThread (13164):
Speaking ['15 min 59 sec ']
IO - inputCore.InputManager.executeGesture (07:25:49.267) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:49.781) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - inputCore.InputManager.executeGesture (07:25:49.882) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
IO - inputCore.InputManager.executeGesture (07:25:50.323) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
IO - inputCore.InputManager.executeGesture (07:25:50.513) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
IO - inputCore.InputManager.executeGesture (07:25:50.682) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
IO - inputCore.InputManager.executeGesture (07:25:51.442) - winInputHook (5656):
Input: kb(laptop):upArrow
IO - speech.speech.speak (07:25:58.051) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:25:58.059) - Dummy-9 (8952):
Thread 7072, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67982 too big for buffer, returning false

IO - inputCore.InputManager.executeGesture (07:25:58.165) - winInputHook (5656):
Input: kb(laptop):upArrow
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:58.288) - watchdog (8260):
Recovered from potential freeze after 9.007131499995012 seconds.
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:25:58.564) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - speech.speech.speak (07:26:06.715) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:26:06.723) - Dummy-9 (8952):
Thread 12500, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67983 too big for buffer, returning false

DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:26:07.071) - watchdog (8260):
Recovered from potential freeze after 9.007925099984277 seconds.
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:26:07.230) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - speech.speech.speak (07:26:14.833) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:26:14.841) - Dummy-9 (8952):
Thread 12500, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67983 too big for buffer, returning false

DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:26:15.241) - watchdog (8260):
Recovered from potential freeze after 8.511239100014791 seconds.
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:26:15.341) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - speech.speech.speak (07:26:22.700) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:26:22.708) - Dummy-8 (4976):
Thread 12500, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67983 too big for buffer, returning false

DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:26:22.850) - watchdog (8260):
Recovered from potential freeze after 8.009069300023839 seconds.
DEBUG - watchdog._waitUntilNormalCoreAliveTimeout (07:26:23.200) - watchdog (8260):
Potential freeze, waiting up to 10 seconds.
IO - speech.speech.speak (07:26:31.128) - MainThread (13164):
Speaking ['no next vertically aligned paragraph']
IO - speech.speech.speak (07:26:31.132) - MainThread (13164):
Speaking ['Link', '20342a38', ' ']
DEBUGWARNING - RPC process 4736 (firefox.exe) (07:26:31.136) - Dummy-8 (4976):
Thread 12500, build\x86_64\vbufBase\storage.cpp, VBufStorage_buffer_t::getLineOffsets, 1068:
Offset of 67983 too big for buffer, returning false

IO - speech.speech.speak (07:26:31.144) - MainThread (13164):
Speaking ['Link', 'master', ' ']

In 4.2, following error is sometimes displayed and NVDA is silent when landing on the vertically aligned element:

IO - inputCore.InputManager.executeGesture (07:35:58.438) - winInputHook (5656):
Input: kb(laptop):NVDA+alt+downArrow
DEBUGWARNING - NVDAObjects.IAccessible.IAccessible._get_IAccessibleRole (07:35:58.448) - MainThread (13164):
accRole failed: (-2147024809, 'Falscher Parameter.', (None, None, None, 0, None))
ERROR - scriptHandler.executeScript (07:35:58.450) - MainThread (13164):
error executing script: <bound method BrowseModeTreeInterceptor.addQuickNav.<locals>.<lambda> of <virtualBuffers.gecko_ia2.Gecko_ia2 object at 0x05C7AB70>> with gesture 'NVDA+Alt+Pfeiltaste nach unten'
Traceback (most recent call last):
  File "scriptHandler.pyc", line 295, in executeScript
  File "browseMode.pyc", line 564, in <lambda>
  File "browseMode.pyc", line 522, in _quickNavScript
  File "browseMode.pyc", line 469, in _iterSimilarParagraph
  File "browseMode.pyc", line 506, in paragraphFunc
TypeError: 'NoneType' object is not subscriptable

Expected behavior:

In 4.1, No freeze
In 4.2, no error and NVDA navigates and speaks properly the vertically aligned element.

NVDA logs, crash dumps and other attachments:

System configuration

NVDA installed/portable/running from source:

Installed

NVDA version:

alpha-31398,a69fbc62 (2024.2.0.31398)

Windows version:

Windows 23 H2

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

Firefox 124

Other information about your system:

Asus ROG strix with Intel I12900HK 5 ght, 32 gb DDR, NVIDIA gtx 3070TI with 8 gb GDDR6X

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.

n/a

If NVDA add-ons are disabled, is your problem still occurring?

No add-ons in use

Does the issue still occur after you run the COM Registration Fixing Tool in NVDA's tools menu?

yes

@Adriani90
Copy link
Collaborator Author

cc: @mltony

@mltony
Copy link
Contributor

mltony commented Apr 11, 2024

Re 4.1. So it seems that the implementation of vertical navigation is about 10x slower than in BrowserNav. I investigated that and to my surprise found that in BrowserNav I had an optimization for Gecko textInfos that speeds up x coordinate retrieval a lot. Apparently I totally forgot about it. Will try to prepare a PR that incorporates that optimization. But also I wanted to mention that this command is not instanteneous by definition, so it will time out on larger documents by design.
Re 4.2. I couldn't repro that but it is easy to catch that exception - I will include that in the PR.

seanbudd pushed a commit that referenced this issue Apr 15, 2024
Closes #16382.

Summary of the issue:
Vertical navigation is too slow.

Description of user facing changes
N/A

Description of development approach
Retrieving x coordinate faster in Gecko textInfo by doing a direct IAccessible2 call - as opposed to creating an NVDAObject. According to my rough measurement, this speeds up vertical navigation about 10 times.
@nvaccessAuto nvaccessAuto added this to the 2024.2 milestone Apr 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants