terminal/src/types
Carlos Zamora a0e5085b49
Expose Text Attributes to UI Automation (#10336)
## Summary of the Pull Request
This implements `GetAttributeValue` and `FindAttribute` for `UiaTextRangeBase` (the shared `ITextRangeProvider` for Conhost and Windows Terminal). This also updates `UiaTracing` to collect more useful information on these function calls. 

## References
#7000 - Epic
[Text Attribute Identifiers](https://docs.microsoft.com/en-us/windows/win32/winauto/uiauto-textattribute-ids)
[ITextRangeProvider::GetAttributeValue](https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nf-uiautomationcore-itextrangeprovider-getattributevalue)
[ITextRangeProvider::FindAttribute](https://docs.microsoft.com/en-us/windows/win32/api/uiautomationcore/nf-uiautomationcore-itextrangeprovider-findattribute)

## PR Checklist
* [X] Closes #2161 
* [X] Tests added/passed

## Detailed Description of the Pull Request / Additional comments
- `TextBuffer`:
   - Exposes a new `TextBufferCellIterator` that takes in an end position. This simplifies the logic drastically as we can now use this iterator to navigate through the text buffer. The iterator can also expose the position in the buffer.
- `UiaTextRangeBase`:
   - Shared logic & helper functions:
      - Most of the text attributes are stored as `TextAttribute`s in the text buffer. To extract them, we generate an attribute verification function via `_getAttrVerificationFn()`, then use that to verify if a given cell has the desired attribute.
      - A few attributes are special (i.e. font name, font size, and "is read only"), in that they are (1) acquired differently and (2) consistent across the entire text buffer. These are handled separate from the attribute verification function.
   - `GetAttributeValue`: Retrieve the attribute verification of the first cell in the range. Then, verify that the entire range has that attribute by iterating through the text range. If a cell does not have that attribute, return the "reserved mixed attribute value".
   - `FindAttribute`: Iterate through the text range and leverage the attribute verification function to find the first contiguous range with that attribute. Then, make the end exclusive and output a `UiaTextRangeBase`. This function must be able to perform a search backwards, so we abstract the "start" and "end" into `resultFirstAnchor` and `resultSecondAnchor`, then perform post processing to output a valid `UiaTextRangeBase`.
- `UiaTracing`:
   - `GetAttributeValue`: Log uia text range, desired attribute, resulting attribute metadata, and the type of the result.
   - `FindAttribute`: Log uia text range, desired attribute and attribute metadata, if we were searching backwards, the type of the result, and the resulting text range.
   - `AttributeType` is a nice way to understand/record if the result was either of the reserved UIA values, a normal result, or an error.
- `UiaTextRangeTests`:
   - `GetAttributeValue`:
      - verify that we know which attributes we support
      - test each of the known text attributes (expecting 100% code coverage for `_getAttrVerificationFn()`)
   - `FindAttribute`: 
      - test each of the known _special_ text attributes
      - test `IsItalic`. NOTE: I'm explicitly only testing one of the standard text attributes because the logic is largely the same between all of them and they leverage `_getAttrVerificationFn()`.

## Validation Steps Performed
- @codeofdusk has been testing this Conhost build
- Tests added for Conhost and shared implementation
- Windows Terminal changes were manually verified using accessibility insights and NVDA
2021-07-09 23:21:35 +00:00
..
inc Add support for XTPUSHSGR / XTPOPSGR (#1978) 2021-02-17 18:31:52 -08:00
lib Add support for XTPUSHSGR / XTPOPSGR (#1978) 2021-02-17 18:31:52 -08:00
ut_types Add support for paste filtering and bracketed paste mode (#9034) 2021-02-08 13:11:01 +00:00
CodepointWidthDetector.cpp Fully regenerate CodepointWidthDetector from Unicode 13.0 (#8035) 2020-10-27 17:36:28 +00:00
colorTable.cpp Separate runtime TerminalSettings from profile-TerminalSettings (#8602) 2021-02-08 22:01:40 +00:00
convert.cpp Move CharToKeyEvents (and friends) into InteractivityBase (#9106) 2021-02-10 17:10:56 -08:00
dirs Switch to v5 UUIDs as profile GUIDs for the default profiles (#913) 2019-05-21 13:29:16 -07:00
Environment.cpp Fix environment block creation (#7401) 2020-08-25 18:16:48 +00:00
FocusEvent.cpp Initial release of the Windows Terminal source code 2019-05-02 15:29:04 -07:00
GlyphWidth.cpp Add GH issue IDs to all the suppress/disables that I left behind as they were a bit too challenging to solve with this giant PR 2019-09-05 11:14:43 -07:00
IBaseData.h Expose Text Attributes to UI Automation (#10336) 2021-07-09 23:21:35 +00:00
IControlAccessibilityInfo.h hook up UIA tree to WPF control (#4548) 2020-02-24 23:17:55 +00:00
IInputEvent.cpp Make loop in IInputEvent more consistent and modern (#4959) 2020-03-17 10:52:33 -07:00
IInputEventStreams.cpp Improve debugging experience of key events (#2872) 2019-09-24 13:50:53 -07:00
IUiaData.h Properly represent block selections in UIA (#4991) 2020-03-18 21:03:51 +00:00
IUiaEventDispatcher.h Attach UiaRenderer and Fire Selection Changed Events (#2989) 2019-12-11 13:52:49 -08:00
IUiaTraceable.h Add more object ID tracing for Accessibility (#5215) 2020-04-03 20:06:47 +00:00
KeyEvent.cpp Fix SA for Visual Studio 16.8 (#8551) 2020-12-11 05:04:30 +00:00
MenuEvent.cpp Initial release of the Windows Terminal source code 2019-05-02 15:29:04 -07:00
ModifierKeyState.cpp Fix a bunch of spelling errors across the project (#4295) 2020-02-10 20:40:01 +00:00
MouseEvent.cpp Initial release of the Windows Terminal source code 2019-05-02 15:29:04 -07:00
precomp.cpp Initial release of the Windows Terminal source code 2019-05-02 15:29:04 -07:00
precomp.h Change backslashes in include statements to forward slashes (#8205) 2020-11-25 21:02:10 +00:00
ScreenInfoUiaProviderBase.cpp Replace basic_string_view<T> with span<const T> (#6921) 2020-07-15 16:40:42 +00:00
ScreenInfoUiaProviderBase.h Cache the size viewport structure inside TextBuffer (#6841) 2020-07-09 11:18:25 +00:00
sgrStack.cpp Add support for XTPUSHSGR / XTPOPSGR (#1978) 2021-02-17 18:31:52 -08:00
sources.inc Add support for XTPUSHSGR / XTPOPSGR (#1978) 2021-02-17 18:31:52 -08:00
TermControlUiaProvider.cpp Properly represent block selections in UIA (#4991) 2020-03-18 21:03:51 +00:00
TermControlUiaProvider.hpp hook up UIA tree to WPF control (#4548) 2020-02-24 23:17:55 +00:00
TermControlUiaTextRange.cpp Fix UIA ScrollIntoView at EndExclusive (#7868) 2020-10-09 20:27:13 +00:00
TermControlUiaTextRange.hpp Change backslashes in include statements to forward slashes (#8205) 2020-11-25 21:02:10 +00:00
ThemeUtils.cpp Use standard 1px window borders on NC Island Window (#3394) 2019-11-04 15:45:40 -08:00
UiaTextRangeBase.cpp Expose Text Attributes to UI Automation (#10336) 2021-07-09 23:21:35 +00:00
UiaTextRangeBase.hpp Expose Text Attributes to UI Automation (#10336) 2021-07-09 23:21:35 +00:00
UiaTracing.cpp Expose Text Attributes to UI Automation (#10336) 2021-07-09 23:21:35 +00:00
UiaTracing.h Expose Text Attributes to UI Automation (#10336) 2021-07-09 23:21:35 +00:00
unicode_width_overrides.xml Fully regenerate CodepointWidthDetector from Unicode 13.0 (#8035) 2020-10-27 17:36:28 +00:00
Utf16Parser.cpp C26447,C26440 - is noexcept but can throw or doesn't throw but not noexcept 2019-08-29 15:23:07 -07:00
utils.cpp Add support for paste filtering and bracketed paste mode (#9034) 2021-02-08 13:11:01 +00:00
viewport.cpp Correct horizontal coordinates in viewport overflow test (#8456) 2020-12-03 21:53:16 +00:00
WindowBufferSizeEvent.cpp Initial release of the Windows Terminal source code 2019-05-02 15:29:04 -07:00