diff --git a/shell/platform/common/accessibility_bridge.cc b/shell/platform/common/accessibility_bridge.cc index 4b1ea03563815..8a98f3d724b4c 100644 --- a/shell/platform/common/accessibility_bridge.cc +++ b/shell/platform/common/accessibility_bridge.cc @@ -527,11 +527,12 @@ void AccessibilityBridge::SetTooltipFromFlutterUpdate( void AccessibilityBridge::SetTreeData(const SemanticsNode& node, ui::AXTreeUpdate& tree_update) { FlutterSemanticsFlag flags = node.flags; - // Set selection if: + // Set selection of the focused node if: // 1. this text field has a valid selection // 2. this text field doesn't have a valid selection but had selection stored // in the tree. - if (flags & FlutterSemanticsFlag::kFlutterSemanticsFlagIsTextField) { + if (flags & FlutterSemanticsFlag::kFlutterSemanticsFlagIsTextField && + flags & FlutterSemanticsFlag::kFlutterSemanticsFlagIsFocused) { if (node.text_selection_base != -1) { tree_update.tree_data.sel_anchor_object_id = node.id; tree_update.tree_data.sel_anchor_offset = node.text_selection_base; diff --git a/shell/platform/common/accessibility_bridge_unittests.cc b/shell/platform/common/accessibility_bridge_unittests.cc index e6a72f98d4d21..0aa078f925f5d 100644 --- a/shell/platform/common/accessibility_bridge_unittests.cc +++ b/shell/platform/common/accessibility_bridge_unittests.cc @@ -152,7 +152,9 @@ TEST(AccessibilityBridgeTest, canHandleSelectionChangeCorrectly) { std::shared_ptr bridge = std::make_shared(); FlutterSemanticsNode root = CreateSemanticsNode(0, "root"); - root.flags = FlutterSemanticsFlag::kFlutterSemanticsFlagIsTextField; + root.flags = static_cast( + FlutterSemanticsFlag::kFlutterSemanticsFlagIsTextField | + FlutterSemanticsFlag::kFlutterSemanticsFlagIsFocused); bridge->AddFlutterSemanticsNodeUpdate(&root); bridge->CommitUpdates(); diff --git a/shell/platform/windows/accessibility_bridge_windows.cc b/shell/platform/windows/accessibility_bridge_windows.cc index 83435ce3a41b1..d5b252ae8d43a 100644 --- a/shell/platform/windows/accessibility_bridge_windows.cc +++ b/shell/platform/windows/accessibility_bridge_windows.cc @@ -41,10 +41,23 @@ void AccessibilityBridgeWindows::OnAccessibilityEvent( DispatchWinAccessibilityEvent(win_delegate, ax::mojom::Event::kChildrenChanged); break; - case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: + case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: { + // An event indicating a change in document selection should be fired + // only for the focused node whose selection has changed. If a valid + // caret and selection exist in the app tree, they must both be within + // the focus node. + ui::AXNode::AXID focus_id = GetAXTreeData().sel_focus_object_id; + auto focus_delegate = + GetFlutterPlatformNodeDelegateFromID(focus_id).lock(); + if (!focus_delegate) { + win_delegate = + std::static_pointer_cast( + focus_delegate); + } DispatchWinAccessibilityEvent( win_delegate, ax::mojom::Event::kDocumentSelectionChanged); break; + } case ui::AXEventGenerator::Event::FOCUS_CHANGED: DispatchWinAccessibilityEvent(win_delegate, ax::mojom::Event::kFocus); SetFocus(win_delegate); diff --git a/shell/platform/windows/accessibility_bridge_windows_unittests.cc b/shell/platform/windows/accessibility_bridge_windows_unittests.cc index e3cc3b58a0f98..ecada69ff8d80 100644 --- a/shell/platform/windows/accessibility_bridge_windows_unittests.cc +++ b/shell/platform/windows/accessibility_bridge_windows_unittests.cc @@ -338,5 +338,11 @@ TEST(AccessibilityBridgeWindows, OnAccessibilityStateChanged) { ax::mojom::Event::kStateChanged); } +TEST(AccessibilityBridgeWindows, OnDocumentSelectionChanged) { + ExpectWinEventFromAXEvent( + 1, ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED, + ax::mojom::Event::kDocumentSelectionChanged); +} + } // namespace testing } // namespace flutter