From 219159ba4934e7aee3aaa22b32c85c86d9d5c776 Mon Sep 17 00:00:00 2001 From: Sam Bent Date: Wed, 21 Jul 2021 10:31:16 -0700 Subject: [PATCH 1/2] client-side support for new UIA events --- .../System/Windows/Controls/TextAdaptor.cs | 5 ++- .../MS/Internal/Automation/UiaCoreApi.cs | 42 +++++++++++++++++-- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/TextAdaptor.cs b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/TextAdaptor.cs index 4c919d90d11..86ff97a0238 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/TextAdaptor.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/TextAdaptor.cs @@ -308,8 +308,9 @@ internal ITextRangeProvider TextRangeFromTextPointers(ITextPointer rangeStart, I rangeEnd = rangeStart; } - // return the resulting range - return new TextRangeAdaptor(this, rangeStart, rangeEnd, _textPeer); + // return the resulting range, wrapped so that it's ready for use by UIA + ITextRangeProvider textRange = new TextRangeAdaptor(this, rangeStart, rangeEnd, _textPeer); + return TextRangeProviderWrapper.WrapArgument(textRange, _textPeer); } #endregion Internal Methods diff --git a/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs b/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs index e0b3554ed11..b75b6d77acc 100644 --- a/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs +++ b/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs @@ -679,8 +679,8 @@ internal static AutomationEventArgs GetUiaEventArgs(IntPtr argsAddr) case EventArgsType.AsyncContentLoaded: { - UiaAsyncContentLoadedEventArgs aclargs = (UiaAsyncContentLoadedEventArgs)Marshal.PtrToStructure(argsAddr, typeof(UiaAsyncContentLoadedEventArgs)); - return new AsyncContentLoadedEventArgs(aclargs._asyncContentLoadedState, aclargs._percentComplete); + UiaAsyncContentLoadedEventArgs nargs = (UiaAsyncContentLoadedEventArgs)Marshal.PtrToStructure(argsAddr, typeof(UiaAsyncContentLoadedEventArgs)); + return new AsyncContentLoadedEventArgs(nargs._asyncContentLoadedState, nargs._percentComplete); } case EventArgsType.WindowClosed: @@ -689,6 +689,19 @@ internal static AutomationEventArgs GetUiaEventArgs(IntPtr argsAddr) int[] runtimeId = ArrayFromIntPtr(wcargs._pRuntimeId, wcargs._cRuntimeIdLen); return new WindowClosedEventArgs(runtimeId); } + + case EventArgsType.Notification: + { + UiaNotificationEventArgs nargs = (UiaNotificationEventArgs)Marshal.PtrToStructure(argsAddr, typeof(UiaNotificationEventArgs)); + return new NotificationEventArgs(nargs._notificationKind, nargs._notificationProcessing, + Marshal.PtrToStringUni(nargs._displayString), Marshal.PtrToStringUni(nargs._activityId)); + } + + case EventArgsType.ActiveTextPositionChanged: + { + UiaActiveTextPositionChangedEventArgs atpcargs = (UiaActiveTextPositionChangedEventArgs)Marshal.PtrToStructure(argsAddr, typeof(UiaActiveTextPositionChangedEventArgs)); + return new ActiveTextPositionChangedEventArgs(atpcargs._textRange); + } } Debug.Assert(false, "Unknown event type from core:" + args._type); @@ -1448,7 +1461,11 @@ private enum EventArgsType PropertyChanged, StructureChanged, AsyncContentLoaded, - WindowClosed + WindowClosed, + TextEditTextChanged, + Changes, + Notification, + ActiveTextPositionChanged } [StructLayout(LayoutKind.Sequential)] @@ -1498,6 +1515,25 @@ private struct UiaWindowClosedEventArgs internal int _cRuntimeIdLen; } + [StructLayout(LayoutKind.Sequential)] + private struct UiaNotificationEventArgs + { + internal EventArgsType _type; + internal int _eventId; + internal AutomationNotificationKind _notificationKind; + internal AutomationNotificationProcessing _notificationProcessing; + internal IntPtr _displayString; + internal IntPtr _activityId; + } + + [StructLayout(LayoutKind.Sequential)] + private struct UiaActiveTextPositionChangedEventArgs + { + internal EventArgsType _type; + internal int _eventId; + internal ITextRangeProvider _textRange; + } + #endregion Private types //------------------------------------------------------ From 465d18e5489460176e16e8c9220eebade8881d1b Mon Sep 17 00:00:00 2001 From: Sam Bent Date: Wed, 21 Jul 2021 11:30:07 -0700 Subject: [PATCH 2/2] fix over-aggressive search/replace --- .../UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs b/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs index b75b6d77acc..2441d78d391 100644 --- a/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs +++ b/src/Microsoft.DotNet.Wpf/src/UIAutomation/UIAutomationClient/MS/Internal/Automation/UiaCoreApi.cs @@ -679,8 +679,8 @@ internal static AutomationEventArgs GetUiaEventArgs(IntPtr argsAddr) case EventArgsType.AsyncContentLoaded: { - UiaAsyncContentLoadedEventArgs nargs = (UiaAsyncContentLoadedEventArgs)Marshal.PtrToStructure(argsAddr, typeof(UiaAsyncContentLoadedEventArgs)); - return new AsyncContentLoadedEventArgs(nargs._asyncContentLoadedState, nargs._percentComplete); + UiaAsyncContentLoadedEventArgs aclargs = (UiaAsyncContentLoadedEventArgs)Marshal.PtrToStructure(argsAddr, typeof(UiaAsyncContentLoadedEventArgs)); + return new AsyncContentLoadedEventArgs(aclargs._asyncContentLoadedState, aclargs._percentComplete); } case EventArgsType.WindowClosed: