diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-08-30 10:22:43 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-08-30 12:36:28 +0000 |
commit | 271a6c3487a14599023a9106329505597638d793 (patch) | |
tree | e040d58ffc86c1480b79ca8528020ca9ec919bf8 /chromium/content/browser/accessibility/browser_accessibility_manager_win.cc | |
parent | 7b2ffa587235a47d4094787d72f38102089f402a (diff) | |
download | qtwebengine-chromium-271a6c3487a14599023a9106329505597638d793.tar.gz |
BASELINE: Update Chromium to 77.0.3865.59
Change-Id: I1e89a5f3b009a9519a6705102ad65c92fe736f21
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/content/browser/accessibility/browser_accessibility_manager_win.cc')
-rw-r--r-- | chromium/content/browser/accessibility/browser_accessibility_manager_win.cc | 124 |
1 files changed, 93 insertions, 31 deletions
diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc b/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc index 19fb7349481..d444d88d857 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc @@ -10,6 +10,7 @@ #include <vector> #include "base/command_line.h" +#include "base/stl_util.h" #include "base/win/scoped_variant.h" #include "base/win/windows_version.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" @@ -58,10 +59,9 @@ BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() { // static ui::AXTreeUpdate BrowserAccessibilityManagerWin::GetEmptyDocument() { ui::AXNodeData empty_document; - empty_document.id = 0; + empty_document.id = 1; empty_document.role = ax::mojom::Role::kRootWebArea; empty_document.AddBoolAttribute(ax::mojom::BoolAttribute::kBusy, true); - ui::AXTreeUpdate update; update.root_id = empty_document.id; update.nodes.push_back(empty_document); @@ -82,6 +82,10 @@ void BrowserAccessibilityManagerWin::OnSubtreeWillBeDeleted(ui::AXTree* tree, BrowserAccessibility* obj = GetFromAXNode(node); FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, obj); FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, obj); + if (obj && obj->GetRole() == ax::mojom::Role::kMenu) { + FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPEND, obj); + FireUiaAccessibilityEvent(UIA_MenuClosedEventId, obj); + } } void BrowserAccessibilityManagerWin::UserIsReloading() { @@ -186,10 +190,20 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( FireUiaPropertyChangedEvent(UIA_ToggleToggleStatePropertyId, node); aria_properties_events_.insert(node); break; - case ui::AXEventGenerator::Event::CHILDREN_CHANGED: - FireWinAccessibilityEvent(EVENT_OBJECT_REORDER, node); - FireUiaStructureChangedEvent(StructureChangeType_ChildrenReordered, node); + case ui::AXEventGenerator::Event::CHILDREN_CHANGED: { + // If this node is ignored, notify from the platform parent if available, + // since it will be unignored. + BrowserAccessibility* target_node = + node->GetData().HasState(ax::mojom::State::kIgnored) + ? node->PlatformGetParent() + : node; + if (target_node) { + FireWinAccessibilityEvent(EVENT_OBJECT_REORDER, target_node); + FireUiaStructureChangedEvent(StructureChangeType_ChildrenReordered, + target_node); + } break; + } case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED: FireUiaPropertyChangedEvent(UIA_ClassNamePropertyId, node); break; @@ -210,7 +224,7 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( break; case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: { // Fire the event on the object where the focus of the selection is. - int32_t focus_id = GetTreeData().sel_focus_object_id; + int32_t focus_id = ax_tree()->GetUnignoredSelection().focus_object_id; BrowserAccessibility* focus_object = GetFromID(focus_id); if (focus_object && focus_object->HasVisibleCaretOrSelection()) FireWinAccessibilityEvent(IA2_EVENT_TEXT_CARET_MOVED, focus_object); @@ -239,6 +253,15 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( FireUiaPropertyChangedEvent(UIA_LevelPropertyId, node); aria_properties_events_.insert(node); break; + case ui::AXEventGenerator::Event::IGNORED_CHANGED: + if (node->HasState(ax::mojom::State::kIgnored)) { + FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, node); + FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, node); + } else { + FireWinAccessibilityEvent(EVENT_OBJECT_SHOW, node); + FireUiaStructureChangedEvent(StructureChangeType_ChildAdded, node); + } + break; case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED: FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node); break; @@ -294,6 +317,10 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( break; case ui::AXEventGenerator::Event::NAME_CHANGED: FireUiaPropertyChangedEvent(UIA_NamePropertyId, node); + // Only fire name changes when the name comes from an attribute, otherwise + // name changes are redundant with text removed/inserted events. + if (node->GetData().GetNameFrom() != ax::mojom::NameFrom::kContents) + FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node); break; case ui::AXEventGenerator::Event::PLACEHOLDER_CHANGED: FireUiaPropertyChangedEvent(UIA_HelpTextPropertyId, node); @@ -343,6 +370,10 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( case ui::AXEventGenerator::Event::SUBTREE_CREATED: FireWinAccessibilityEvent(EVENT_OBJECT_SHOW, node); FireUiaStructureChangedEvent(StructureChangeType_ChildAdded, node); + if (node->GetRole() == ax::mojom::Role::kMenu) { + FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPSTART, node); + FireUiaAccessibilityEvent(UIA_MenuOpenedEventId, node); + } break; case ui::AXEventGenerator::Event::VALUE_CHANGED: FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, node); @@ -373,6 +404,7 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( break; case ui::AXEventGenerator::Event::AUTO_COMPLETE_CHANGED: case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: + case ui::AXEventGenerator::Event::FOCUS_CHANGED: case ui::AXEventGenerator::Event::LIVE_REGION_NODE_CHANGED: case ui::AXEventGenerator::Event::LOAD_START: case ui::AXEventGenerator::Event::MENU_ITEM_SELECTED: @@ -386,14 +418,6 @@ void BrowserAccessibilityManagerWin::FireGeneratedEvent( } } -void BrowserAccessibilityManagerWin::OnFocusLost(BrowserAccessibility* node) { - BrowserAccessibilityManager::OnFocusLost(node); - DCHECK(node); - - if (node->GetRole() == ax::mojom::Role::kMenu) - FireUiaAccessibilityEvent(UIA_MenuClosedEventId, node); -} - void BrowserAccessibilityManagerWin::FireWinAccessibilityEvent( LONG win_event_type, BrowserAccessibility* node) { @@ -401,6 +425,18 @@ void BrowserAccessibilityManagerWin::FireWinAccessibilityEvent( return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| except for related SHOW / HIDE + if (base::Contains(ignored_changed_nodes_, node)) { + switch (win_event_type) { + case EVENT_OBJECT_HIDE: + case EVENT_OBJECT_SHOW: + break; + default: + return; + } + } else if (node->HasState(ax::mojom::State::kIgnored)) { + return; + } HWND hwnd = GetParentHWND(); if (!hwnd) @@ -421,6 +457,10 @@ void BrowserAccessibilityManagerWin::FireUiaAccessibilityEvent( return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| + if (node->HasState(ax::mojom::State::kIgnored) || + base::Contains(ignored_changed_nodes_, node)) + return; ::UiaRaiseAutomationEvent(ToBrowserAccessibilityWin(node)->GetCOM(), uia_event); @@ -433,6 +473,10 @@ void BrowserAccessibilityManagerWin::FireUiaPropertyChangedEvent( return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| + if (node->HasState(ax::mojom::State::kIgnored) || + base::Contains(ignored_changed_nodes_, node)) + return; // The old value is not used by the system VARIANT old_value = {}; @@ -454,6 +498,18 @@ void BrowserAccessibilityManagerWin::FireUiaStructureChangedEvent( return; if (!ShouldFireEventForNode(node)) return; + // Suppress events when |IGNORED_CHANGED| except for related structure changes + if (base::Contains(ignored_changed_nodes_, node)) { + switch (change_type) { + case StructureChangeType_ChildRemoved: + case StructureChangeType_ChildAdded: + break; + default: + return; + } + } else if (node->HasState(ax::mojom::State::kIgnored)) { + return; + } auto* provider = ToBrowserAccessibilityWin(node); auto* provider_com = provider ? provider->GetCOM() : nullptr; @@ -527,21 +583,6 @@ void BrowserAccessibilityManagerWin::OnAtomicUpdateFinished( BrowserAccessibilityManager::OnAtomicUpdateFinished(tree, root_changed, changes); - if (root_changed && IsRootTree() && - switches::IsExperimentalAccessibilityPlatformUIAEnabled()) { - // If a fragment root has been created, inform it that the content root has - // changed. - BrowserAccessibilityDelegate* root_delegate = GetDelegateFromRootManager(); - if (root_delegate) { - ui::AXFragmentRootWin* fragment_root = - ui::AXFragmentRootWin::GetForAcceleratedWidget( - root_delegate->AccessibilityGetAcceleratedWidget()); - if (fragment_root) { - fragment_root->SetChild(ToBrowserAccessibilityWin(GetRoot())->GetCOM()); - } - } - } - // Do a sequence of Windows-specific updates on each node. Each one is // done in a single pass that must complete before the next step starts. // The nodes that need to be updated are all of the nodes that were changed, @@ -671,6 +712,25 @@ void BrowserAccessibilityManagerWin::HandleSelectedStateChanged( } } +void BrowserAccessibilityManagerWin::BeforeAccessibilityEvents() { + BrowserAccessibilityManager::BeforeAccessibilityEvents(); + + for (const auto& targeted_event : event_generator_) { + if (targeted_event.event_params.event == + ui::AXEventGenerator::Event::IGNORED_CHANGED) { + BrowserAccessibility* event_target = GetFromAXNode(targeted_event.node); + if (!event_target) + continue; + + const auto insert_pair = ignored_changed_nodes_.insert(event_target); + + // Expect that |IGNORED_CHANGED| only fires once for a given + // node in a given event frame. + DCHECK(insert_pair.second); + } + } +} + void BrowserAccessibilityManagerWin::FinalizeAccessibilityEvents() { BrowserAccessibilityManager::FinalizeAccessibilityEvents(); @@ -686,8 +746,9 @@ void BrowserAccessibilityManagerWin::FinalizeAccessibilityEvents() { // Count the number of selected items size_t selected_count = 0; BrowserAccessibility* first_selected_child = nullptr; - for (size_t i = 0; i < container->InternalChildCount(); ++i) { - auto* child = container->InternalGetChild(i); + for (auto it = container->InternalChildrenBegin(); + it != container->InternalChildrenEnd(); ++it) { + auto* child = it.get(); if (child->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) { if (!first_selected_child) first_selected_child = child; @@ -719,6 +780,7 @@ void BrowserAccessibilityManagerWin::FinalizeAccessibilityEvents() { } } selection_events_.clear(); + ignored_changed_nodes_.clear(); } BrowserAccessibilityManagerWin::SelectionEvents::SelectionEvents() = default; |