f94b98b488
## 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)
(cherry picked from commit 02ac246807
)
19 lines
806 B
Plaintext
19 lines
806 B
Plaintext
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
namespace Microsoft.Terminal.Control
|
|
{
|
|
[default_interface] runtimeclass InteractivityAutomationPeer :
|
|
Windows.UI.Xaml.Automation.Peers.AutomationPeer,
|
|
Windows.UI.Xaml.Automation.Provider.ITextProvider
|
|
{
|
|
|
|
void SetControlBounds(Windows.Foundation.Rect bounds);
|
|
void SetControlPadding(Microsoft.Terminal.Core.Padding padding);
|
|
void ParentProvider(Windows.UI.Xaml.Automation.Peers.AutomationPeer parentProvider);
|
|
|
|
event Windows.Foundation.TypedEventHandler<Object, Object> SelectionChanged;
|
|
event Windows.Foundation.TypedEventHandler<Object, Object> TextChanged;
|
|
event Windows.Foundation.TypedEventHandler<Object, Object> CursorChanged;
|
|
}
|
|
}
|