[PR #11501] Properly initialize XamlUiaTextRange with ProviderFromPeer #28619

Open
opened 2026-01-31 09:29:40 +00:00 by claunia · 0 comments
Owner

Original Pull Request: https://github.com/microsoft/terminal/pull/11501

State: closed
Merged: Yes


Summary of the Pull Request

As a part of the Interactivity split, TermControlAutomationPeer had to be split into TermControlAutomationPeer (TCAP) and InteractivityAutomationPeer (IAP). Just about all of the functions in InterativityAutomationPeer operate by calling the non-XAML UIA Provider then wrapping the resulting UIATextRange into a XAML format (a XamlUiaTextRange [XUTR]). As a part of that XUTR constructor, we need a reference to the parent provider.

We generally get that via ProviderFromPeer(), but IAP's ProviderFromPeer() returned null (presumably because IAP isn't in the UI tree, whereas TCAP is directly registered as the automation peer for the TermControl).

It looks like some screen readers didn't care (like NVDA, though there may be a chance we just didn't encounter an issue just yet), but Narrator definitely did.

The fix was to provide XUTR constructors the ProviderFromPeer from TCAP, not IAP. To accomplish this, IAP now holds a weak reference to TCAP, and provides the ProviderFromPeer when needed. We can't cache this result because there is no guarantee that it won't change.

Some miscellaneous changes include:

  • TermControl::OnCreateAutomationPeer now returns the existing auto peer instead of always creating a new one
  • TCAP::WrapArrayOfTextRangeProviders was removed as it was unused (normally, this would be directly affected by the main ProviderFromPeer change here)
  • XUTR::GetEnclosingElement is now hooked up to trace logging for debugging purposes

References

Introduced in #10051
Closes #11488

Validation Steps Performed

Narrator scan mode now works (verified with character, word, and line navigation)
NVDA movement still works (verified with word and line navigation)

**Original Pull Request:** https://github.com/microsoft/terminal/pull/11501 **State:** closed **Merged:** Yes --- ## Summary of the Pull Request As a part of the Interactivity split, `TermControlAutomationPeer` had to be split into `TermControlAutomationPeer` (TCAP) and `InteractivityAutomationPeer` (IAP). Just about all of the functions in `InterativityAutomationPeer` operate by calling the non-XAML UIA Provider then wrapping the resulting `UIATextRange` into a XAML format (a `XamlUiaTextRange` [XUTR]). As a part of that XUTR constructor, we need a reference to the parent provider. We generally get that via `ProviderFromPeer()`, but IAP's `ProviderFromPeer()` returned null (presumably because IAP isn't in the UI tree, whereas TCAP is directly registered as the automation peer for the `TermControl`). It looks like some screen readers didn't care (like NVDA, though there may be a chance we just didn't encounter an issue just yet), but Narrator definitely did. The fix was to provide XUTR constructors the `ProviderFromPeer` from TCAP, _not_ IAP. To accomplish this, IAP now holds a weak reference to TCAP, and provides the `ProviderFromPeer` when needed. We can't cache this result because there is no guarantee that it won't change. Some miscellaneous changes include: - `TermControl::OnCreateAutomationPeer` now returns the existing auto peer instead of always creating a new one - `TCAP::WrapArrayOfTextRangeProviders` was removed as it was unused (normally, this would be directly affected by the main `ProviderFromPeer` change here) - `XUTR::GetEnclosingElement` is now hooked up to trace logging for debugging purposes ## References Introduced in #10051 Closes #11488 ## Validation Steps Performed ✅ Narrator scan mode now works (verified with character, word, and line navigation) ✅ NVDA movement still works (verified with word and line navigation)
claunia added the pull-request label 2026-01-31 09:29:40 +00:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#28619