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)
83 lines
3.6 KiB
C++
83 lines
3.6 KiB
C++
/*++
|
|
Copyright (c) Microsoft Corporation
|
|
Licensed under the MIT license.
|
|
|
|
Module Name:
|
|
- TermControlAutomationPeer.h
|
|
|
|
Abstract:
|
|
- This module provides UI Automation access to the TermControl
|
|
to support both automation tests and accessibility (screen
|
|
reading) applications. This mainly interacts with ScreenInfoUiaProvider
|
|
to allow for shared code between ConHost and Windows Terminal
|
|
accessibility providers.
|
|
- Based on the Custom Automation Peers guide on msdn
|
|
(https://docs.microsoft.com/en-us/windows/uwp/design/accessibility/custom-automation-peers)
|
|
- Wraps the UIAutomationCore ITextProvider
|
|
(https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nn-uiautomationcore-itextprovider)
|
|
with a XAML ITextProvider
|
|
(https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.automation.provider.itextprovider)
|
|
|
|
Author(s):
|
|
- Carlos Zamora (CaZamor) 2019
|
|
|
|
Modifications:
|
|
- May 2021: Pulled the core logic of ITextProvider implementation into the
|
|
InteractivityAutomationPeer, to support tab tear out.
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
#include "TermControl.h"
|
|
#include "ControlInteractivity.h"
|
|
#include "TermControlAutomationPeer.g.h"
|
|
#include "../types/TermControlUiaProvider.hpp"
|
|
#include "../types/IUiaEventDispatcher.h"
|
|
#include "../types/IControlAccessibilityInfo.h"
|
|
|
|
namespace winrt::Microsoft::Terminal::Control::implementation
|
|
{
|
|
struct TermControlAutomationPeer :
|
|
public TermControlAutomationPeerT<TermControlAutomationPeer>,
|
|
::Microsoft::Console::Types::IUiaEventDispatcher
|
|
{
|
|
public:
|
|
TermControlAutomationPeer(Microsoft::Terminal::Control::implementation::TermControl* owner,
|
|
const Core::Padding padding,
|
|
Control::InteractivityAutomationPeer implementation);
|
|
|
|
void UpdateControlBounds();
|
|
void SetControlPadding(const Core::Padding padding);
|
|
|
|
#pragma region FrameworkElementAutomationPeer
|
|
hstring GetClassNameCore() const;
|
|
Windows::UI::Xaml::Automation::Peers::AutomationControlType GetAutomationControlTypeCore() const;
|
|
hstring GetLocalizedControlTypeCore() const;
|
|
Windows::Foundation::IInspectable GetPatternCore(Windows::UI::Xaml::Automation::Peers::PatternInterface patternInterface) const;
|
|
Windows::UI::Xaml::Automation::Peers::AutomationOrientation GetOrientationCore() const;
|
|
hstring GetNameCore() const;
|
|
hstring GetHelpTextCore() const;
|
|
Windows::UI::Xaml::Automation::Peers::AutomationLiveSetting GetLiveSettingCore() const;
|
|
#pragma endregion
|
|
|
|
#pragma region IUiaEventDispatcher
|
|
void SignalSelectionChanged() override;
|
|
void SignalTextChanged() override;
|
|
void SignalCursorChanged() override;
|
|
#pragma endregion
|
|
|
|
#pragma region ITextProvider Pattern
|
|
Windows::UI::Xaml::Automation::Provider::ITextRangeProvider RangeFromPoint(Windows::Foundation::Point screenLocation);
|
|
Windows::UI::Xaml::Automation::Provider::ITextRangeProvider RangeFromChild(Windows::UI::Xaml::Automation::Provider::IRawElementProviderSimple childElement);
|
|
com_array<Windows::UI::Xaml::Automation::Provider::ITextRangeProvider> GetVisibleRanges();
|
|
com_array<Windows::UI::Xaml::Automation::Provider::ITextRangeProvider> GetSelection();
|
|
Windows::UI::Xaml::Automation::SupportedTextSelection SupportedTextSelection();
|
|
Windows::UI::Xaml::Automation::Provider::ITextRangeProvider DocumentRange();
|
|
#pragma endregion
|
|
|
|
private:
|
|
winrt::Microsoft::Terminal::Control::implementation::TermControl* _termControl;
|
|
Control::InteractivityAutomationPeer _contentAutomationPeer;
|
|
};
|
|
}
|