Skip to content

Fix bug when updating add-ons automatically - #18971

Merged
seanbudd merged 4 commits into
nvaccess:masterfrom
nvdaes:fixUpdateAddons
Sep 23, 2025
Merged

seanbudd merged 4 commits into
nvaccess:masterfrom
nvdaes:fixUpdateAddons

Conversation

@nvdaes

@nvdaes nvdaes commented Sep 23, 2025 •

Copy link
Copy Markdown
Collaborator
  • Fix bug when updating add-ons automatically
  • Update changelog

Link to issue number:

Fixes #18965

Summary of the issue:

When NVDA is configured to update add-ons automatically without provide notifications, add-ons aren't updated and an error is produced.

Description of user facing changes:

NVDA can be configured to update add-ons automatically, and this should work as expected.

Description of developer facing changes:

None.

Description of development approach:

Use wx.CallAfter to present a message informing that add-ons are been updated, in the _checkForUpdatableAddonsmethod of the UpdatableAddonsDialog class, just after the condition to check that add-ons should be updated automatically, ensuring that this can be run in the main thread.

Additionally, an error has been discovered and fixed in addonHandler, when installing an add-on which shows a message before installation.

Testing strategy:

Tested locally with clipContentsDesigner (which asks a question before installation) and resourceMonitor.

Known issues with pull request:

None.

Code Review Checklist:

  • Documentation:
    • Change log entry
    • User Documentation
    • Developer / Technical Documentation
    • Context sensitive help for GUI changes
  • Testing:
    • Unit tests
    • System (end to end) tests
    • Manual testing
  • UX of all users considered:
    • Speech
    • Braille
    • Low Vision
    • Different web browsers
    • Localization in other languages / culture than English
  • API is compatible with existing add-ons.
  • Security precautions taken.

@nvdaes nvdaes changed the title Fix bug when update add-ons automatically Fix bug when updating add-ons automatically Sep 23, 2025
@nvdaes
nvdaes marked this pull request as ready for review September 23, 2025 04:15
@nvdaes
nvdaes requested a review from a team as a code owner September 23, 2025 04:15
@nvdaes
nvdaes requested a review from seanbudd September 23, 2025 04:15
Comment thread user_docs/en/changes.md Outdated

@seanbudd seanbudd left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @nvdaes

@seanbudd
seanbudd merged commit f294547 into nvaccess:master Sep 23, 2025
5 of 6 checks passed
@github-actions github-actions Bot added this to the 2026.1 milestone Sep 23, 2025
LeonarddeR added a commit to LeonarddeR/nvda that referenced this pull request Aug 22, 2026
…ddonImports

_cleanupAddonImports now matches modules on their file path against the
add-on directory, case insensitively and anchored at a path separator.
Modules without a file attribute are skipped.
Add unit tests covering the cleanup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
LeonarddeR added a commit to LeonarddeR/nvda that referenced this pull request Aug 25, 2026
…ddonImports

_cleanupAddonImports now matches modules on their file path against the
add-on directory, case insensitively and anchored at a path separator.
Modules without a file attribute are skipped.
Add unit tests covering the cleanup.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
seanbudd pushed a commit that referenced this pull request Aug 26, 2026
Fixup for #18971.
Summary of the issue:

Installing or removing an add-on can run install tasks. These tasks can import modules from the add-on. Python caches every import in sys.modules. NVDA must drop the add-on's modules from that cache afterwards. Otherwise a later import returns the cached old module instead of the file on disk.

Modules the tasks load directly are tracked in _importedAddonModules and dropped reliably. Modules imported indirectly, for example through a relative import inside the add-on, are not tracked. For those, _cleanupAddonImports scans every module imported during the task and drops each one whose file is inside the add-on directory.

That scan has been broken twice:

    Remove add-on modules imported in install tasks to avoid conflicts between add-ons #15967 introduced it reading module.__file__ directly. Modules without a __file__, such as built-in modules, made it crash with AttributeError.
    Fix bug when updating add-ons automatically #18971 fixed that crash by reading module.__name__ instead. A module name is not a file path, so the scan matches nothing. Since 2026.1 it drops nothing.

Result: updating an add-on can break on the first start after the update. The old version's uninstall task runs first and leaves old modules in the cache. The new version then partly imports old code. A second restart of NVDA resolves the situation regardless.
Description of user facing changes:

Updated add-ons that perform install tasks no longer raise intermittent errors on the first start of NVDA after the update.
Description of developer facing changes:

None.
Description of development approach:

The approach of #15967 was the correct one: a module belongs to the add-on when its file is inside the add-on directory. This change returns to matching on the file path and fixes the three defects of that implementation:

    The file is read with getattr(module, "__file__", None). Modules without a __file__ are skipped instead of crashing the scan, so the error fixed by Fix bug when updating add-ons automatically #18971 stays fixed.
    The file path and the add-on directory are compared through os.path.normcase, so case differences match.
    The directory prefix ends with a path separator, so a sibling directory such as myAddonExtra no longer matches myAddon.

Each defect is covered by a unit test. The loop over the tracked modules is unchanged.
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 this pull request may close these issues.

Error in option to update add-ons automatically

2 participants