02ac246807
## 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)
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;
|
|
}
|
|
}
|