From 0f28ee97662662264e7c8d2b1f55aa03de0f53a0 Mon Sep 17 00:00:00 2001 From: dkazennov Date: Thu, 16 Jun 2022 17:40:00 +0400 Subject: [PATCH] Issue 3421 UIAProvider support for WebBrowser control and UnitTests --- .../WebBrowser.WebBrowserAccessibleObject.cs | 30 +++++++++++ .../src/System/Windows/Forms/WebBrowser.cs | 4 ++ ...Browser.WebBrowserAccessibleObjectTests.cs | 53 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObject.cs create mode 100644 src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObjectTests.cs diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObject.cs b/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObject.cs new file mode 100644 index 00000000000..ecf6a85381a --- /dev/null +++ b/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObject.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using static Interop; + +namespace System.Windows.Forms +{ + public partial class WebBrowser + { + internal class WebBrowserAccessibleObject : ControlAccessibleObject + { + public WebBrowserAccessibleObject(WebBrowser owner) : base(owner) + { + } + + internal override object? GetPropertyValue(UiaCore.UIA propertyID) + => propertyID switch + { + UiaCore.UIA.AutomationIdPropertyId + => Owner.Name, + UiaCore.UIA.HasKeyboardFocusPropertyId + => Owner.Focused, + UiaCore.UIA.IsKeyboardFocusablePropertyId + => (State & AccessibleStates.Focusable) == AccessibleStates.Focusable, + _ => base.GetPropertyValue(propertyID) + }; + } + } +} diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.cs b/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.cs index 272694fa1c8..6b9e8f810db 100644 --- a/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.cs +++ b/src/System.Windows.Forms/src/System/Windows/Forms/WebBrowser.cs @@ -64,6 +64,8 @@ public WebBrowser() : base("8856f961-340a-11d0-a96b-00c04fd705a2") // Public properties: // + internal override bool SupportsUiaProviders => true; + /// /// Specifies whether the WebBrowser control may navigate to another page once /// it has been loaded. NOTE: it will always be able to navigate before being loaded. @@ -1130,6 +1132,8 @@ protected override WebBrowserSiteBase CreateWebBrowserSiteBase() return new WebBrowserSite(this); } + protected override AccessibleObject CreateAccessibilityInstance() => new WebBrowserAccessibleObject(this); + /// /// Attaches to the DWebBrowserEvents2 connection point. /// diff --git a/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObjectTests.cs b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObjectTests.cs new file mode 100644 index 00000000000..203c6bddf9e --- /dev/null +++ b/src/System.Windows.Forms/tests/UnitTests/System/Windows/Forms/WebBrowser.WebBrowserAccessibleObjectTests.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Xunit; +using static System.Windows.Forms.WebBrowser; +using static Interop.UiaCore; + +namespace System.Windows.Forms.Tests +{ + public class WebBrowser_WebBrowserAccessibleObjectTests : IClassFixture + { + [WinFormsFact] + public void WebBrowserAccessibleObject_Ctor_Default() + { + using WebBrowser webBrowser = new(); + WebBrowserAccessibleObject accessibleObject = (WebBrowserAccessibleObject)webBrowser.AccessibilityObject; + + Assert.Equal(webBrowser, accessibleObject.Owner); + Assert.False(webBrowser.IsHandleCreated); + } + + [WinFormsTheory] + [InlineData((int)UIA.NamePropertyId, "TestName")] + [InlineData((int)UIA.AutomationIdPropertyId, "ToolStripContainer1")] + public void WebBrowserAccessibleObject_GetPropertyValue_Invoke_ReturnsExpected(int propertyID, object expected) + { + using WebBrowser webBrowser = new WebBrowser + { + Name = expected.ToString(), + AccessibleName = expected.ToString() + }; + + WebBrowserAccessibleObject accessibleObject = (WebBrowserAccessibleObject)webBrowser.AccessibilityObject; + object value = accessibleObject.GetPropertyValue((UIA)propertyID); + + Assert.Equal(expected, value); + Assert.False(webBrowser.IsHandleCreated); + } + + [WinFormsFact] + public void WebBrowserAccessibleObject_GetPropertyValue_HasKeyboardFocus_ReturnsFalse_IfControlHasNoFocus() + { + using WebBrowser webBrowser = new(); + + WebBrowserAccessibleObject accessibleObject = (WebBrowserAccessibleObject)webBrowser.AccessibilityObject; + bool value = (bool)accessibleObject.GetPropertyValue(UIA.HasKeyboardFocusPropertyId); + + Assert.False(value); + Assert.False(webBrowser.IsHandleCreated); + } + } +}