-
Notifications
You must be signed in to change notification settings - Fork 8.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Introduce PseudoConsoleWindow a11y provider (#14541)
In order to modify the accessibility information for the PseudoConsoleWindow, it needs to have a UIA provider registered. This PR introduces `PseudoConsoleWindowAccessibilityProvider` and registers it as a UIA provider appropriately. The registration process is based on that of the `WindowUiaProvider` for ConHost. Closes #14385 ## Validation Steps Performed Run Accessibility Insights FastPass on the window. The PseudoConsoleWindow no longer is tagged as missing a name.
- Loading branch information
1 parent
f1090a0
commit 09273be
Showing
7 changed files
with
145 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
79 changes: 79 additions & 0 deletions
79
src/interactivity/base/PseudoConsoleWindowAccessibilityProvider.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// Copyright (c) Microsoft Corporation. | ||
// Licensed under the MIT license. | ||
|
||
#include "precomp.h" | ||
|
||
#include "PseudoConsoleWindowAccessibilityProvider.hpp" | ||
|
||
using namespace Microsoft::Console::Interactivity; | ||
|
||
HRESULT PseudoConsoleWindowAccessibilityProvider::RuntimeClassInitialize(HWND pseudoConsoleHwnd) noexcept | ||
{ | ||
RETURN_HR_IF_NULL(E_INVALIDARG, pseudoConsoleHwnd); | ||
_pseudoConsoleHwnd = pseudoConsoleHwnd; | ||
return S_OK; | ||
} | ||
|
||
IFACEMETHODIMP PseudoConsoleWindowAccessibilityProvider::get_ProviderOptions(_Out_ ProviderOptions* pOptions) | ||
{ | ||
RETURN_HR_IF_NULL(E_INVALIDARG, pOptions); | ||
*pOptions = ProviderOptions_ServerSideProvider; | ||
return S_OK; | ||
} | ||
|
||
IFACEMETHODIMP PseudoConsoleWindowAccessibilityProvider::GetPatternProvider(_In_ PATTERNID /*iid*/, | ||
_COM_Outptr_result_maybenull_ IUnknown** ppInterface) | ||
{ | ||
RETURN_HR_IF_NULL(E_INVALIDARG, ppInterface); | ||
*ppInterface = nullptr; | ||
return S_OK; | ||
} | ||
|
||
IFACEMETHODIMP PseudoConsoleWindowAccessibilityProvider::GetPropertyValue(_In_ PROPERTYID propertyId, | ||
_Out_ VARIANT* pVariant) | ||
{ | ||
RETURN_HR_IF_NULL(E_INVALIDARG, pVariant); | ||
|
||
pVariant->vt = VT_EMPTY; | ||
|
||
// Returning the default will leave the property as the default | ||
// so we only really need to touch it for the properties we want to implement | ||
switch (propertyId) | ||
{ | ||
case UIA_ControlTypePropertyId: | ||
{ | ||
pVariant->vt = VT_I4; | ||
pVariant->lVal = UIA_WindowControlTypeId; | ||
break; | ||
} | ||
case UIA_NamePropertyId: | ||
{ | ||
static constexpr auto AutomationPropertyName = L"Internal Console Management Window"; | ||
pVariant->bstrVal = SysAllocString(AutomationPropertyName); | ||
if (pVariant->bstrVal != nullptr) | ||
{ | ||
pVariant->vt = VT_BSTR; | ||
} | ||
break; | ||
} | ||
case UIA_IsControlElementPropertyId: | ||
case UIA_IsContentElementPropertyId: | ||
case UIA_IsKeyboardFocusablePropertyId: | ||
case UIA_HasKeyboardFocusPropertyId: | ||
{ | ||
pVariant->vt = VT_BOOL; | ||
pVariant->boolVal = VARIANT_FALSE; | ||
break; | ||
} | ||
default: | ||
break; | ||
} | ||
return S_OK; | ||
} | ||
|
||
IFACEMETHODIMP PseudoConsoleWindowAccessibilityProvider::get_HostRawElementProvider(_COM_Outptr_result_maybenull_ IRawElementProviderSimple** ppProvider) | ||
{ | ||
RETURN_HR_IF_NULL(E_INVALIDARG, ppProvider); | ||
RETURN_HR_IF_NULL(gsl::narrow_cast<HRESULT>(UIA_E_ELEMENTNOTAVAILABLE), _pseudoConsoleHwnd); | ||
return UiaHostProviderFromHwnd(_pseudoConsoleHwnd, ppProvider); | ||
} |
34 changes: 34 additions & 0 deletions
34
src/interactivity/base/PseudoConsoleWindowAccessibilityProvider.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// Copyright (c) Microsoft Corporation. | ||
// Licensed under the MIT license. | ||
|
||
#pragma once | ||
|
||
#include "precomp.h" | ||
|
||
namespace Microsoft::Console::Interactivity | ||
{ | ||
class PseudoConsoleWindowAccessibilityProvider final : | ||
public WRL::RuntimeClass<WRL::RuntimeClassFlags<WRL::ClassicCom | WRL::InhibitFtmBase>, IRawElementProviderSimple> | ||
{ | ||
public: | ||
PseudoConsoleWindowAccessibilityProvider() = default; | ||
~PseudoConsoleWindowAccessibilityProvider() = default; | ||
HRESULT RuntimeClassInitialize(HWND pseudoConsoleHwnd) noexcept; | ||
|
||
PseudoConsoleWindowAccessibilityProvider(const PseudoConsoleWindowAccessibilityProvider&) = delete; | ||
PseudoConsoleWindowAccessibilityProvider(PseudoConsoleWindowAccessibilityProvider&&) = delete; | ||
PseudoConsoleWindowAccessibilityProvider& operator=(const PseudoConsoleWindowAccessibilityProvider&) = delete; | ||
PseudoConsoleWindowAccessibilityProvider& operator=(PseudoConsoleWindowAccessibilityProvider&&) = delete; | ||
|
||
// IRawElementProviderSimple methods | ||
IFACEMETHODIMP get_ProviderOptions(_Out_ ProviderOptions* pOptions) override; | ||
IFACEMETHODIMP GetPatternProvider(_In_ PATTERNID iid, | ||
_COM_Outptr_result_maybenull_ IUnknown** ppInterface) override; | ||
IFACEMETHODIMP GetPropertyValue(_In_ PROPERTYID idProp, | ||
_Out_ VARIANT* pVariant) override; | ||
IFACEMETHODIMP get_HostRawElementProvider(_COM_Outptr_result_maybenull_ IRawElementProviderSimple** ppProvider) override; | ||
|
||
private: | ||
HWND _pseudoConsoleHwnd; | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters