0f122ca290
Adds a check before every UIA function call to ensure the terminal (specifically the buffer) is initialized before doing work. Both the `ScreenInfoUiaProvider` and the `UiaTextRange` are now covered. ## References Closes #11135 #10971 & #11042 ## Detailed Description of the Pull Request / Additional comments Originally, I tried applying this heuristic to all the `RuntimeClassInitialize` on `UiaTextRangeBase` with the philosophy of "a range pointing to an invalid buffer is invalid itself", but that caused a regression on [MSFT 33353327](https://microsoft.visualstudio.com/OS/_workitems/edit/33353327). `IUiaData` also has `GetTextBuffer()` return a `TextBuffer&`, which cannot be checked for nullness. Instead, I decided to add a function to `IUiaData` that checks if we have a valid state. Since this is shared with Conhost and Conhost doesn't have this issue, I simply make that function say that it's always in a valid state. ## Validation Steps Performed - [X] Narrator can detect newly created terminals - [X] (On Windows Server 2022) Windows Terminal does not hang on launch
49 lines
1.4 KiB
C++
49 lines
1.4 KiB
C++
/*++
|
|
Copyright (c) Microsoft Corporation
|
|
Licensed under the MIT license.
|
|
|
|
Module Name:
|
|
- IUiaData.hpp
|
|
|
|
Abstract:
|
|
- This serves as the interface defining all information needed for the UI Automation Tree
|
|
|
|
Author(s):
|
|
- Carlos Zamora (CaZamor) Aug-2019
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
#include "IBaseData.h"
|
|
|
|
struct ITextRangeProvider;
|
|
|
|
namespace Microsoft::Console::Types
|
|
{
|
|
class IUiaData : public IBaseData
|
|
{
|
|
public:
|
|
~IUiaData() = 0;
|
|
|
|
protected:
|
|
IUiaData() = default;
|
|
IUiaData(const IUiaData&) = default;
|
|
IUiaData(IUiaData&&) = default;
|
|
IUiaData& operator=(const IUiaData&) = default;
|
|
IUiaData& operator=(IUiaData&&) = default;
|
|
|
|
public:
|
|
virtual const bool IsSelectionActive() const = 0;
|
|
virtual const bool IsBlockSelection() const = 0;
|
|
virtual void ClearSelection() = 0;
|
|
virtual void SelectNewRegion(const COORD coordStart, const COORD coordEnd) = 0;
|
|
virtual const COORD GetSelectionAnchor() const noexcept = 0;
|
|
virtual const COORD GetSelectionEnd() const noexcept = 0;
|
|
virtual void ColorSelection(const COORD coordSelectionStart, const COORD coordSelectionEnd, const TextAttribute attr) = 0;
|
|
virtual const bool IsUiaDataInitialized() const noexcept = 0;
|
|
};
|
|
|
|
// See docs/virtual-dtors.md for an explanation of why this is weird.
|
|
inline IUiaData::~IUiaData() {}
|
|
}
|