diff options
Diffstat (limited to 'chromium/content/browser/accessibility')
9 files changed, 95 insertions, 98 deletions
diff --git a/chromium/content/browser/accessibility/browser_accessibility.h b/chromium/content/browser/accessibility/browser_accessibility.h index 7016c3f3e7d..a1d4afc6aa1 100644 --- a/chromium/content/browser/accessibility/browser_accessibility.h +++ b/chromium/content/browser/accessibility/browser_accessibility.h @@ -91,8 +91,6 @@ class CONTENT_EXPORT BrowserAccessibility : public ui::AXPlatformNodeDelegate { // its data changes. virtual void OnDataChanged() {} - virtual void OnSubtreeWillBeDeleted() {} - // Called when the location changed. virtual void OnLocationChanged() {} diff --git a/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm b/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm index a2927a31d6b..4889a5c2f5d 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/chromium/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -38,6 +38,8 @@ using BrowserAccessibilityPositionInstance = content::BrowserAccessibilityPosition::AXPositionInstance; +using SerializedPosition = + content::BrowserAccessibilityPosition::SerializedPosition; using AXPlatformRange = ui::AXRange<BrowserAccessibilityPositionInstance::element_type>; using AXTextMarkerRangeRef = CFTypeRef; @@ -54,6 +56,10 @@ using content::OneShotAccessibilityTreeSearch; using ui::AXNodeData; using ui::AXTreeIDRegistry; +static_assert( + std::is_trivially_copyable<SerializedPosition>::value, + "SerializedPosition must be POD because it's used to back an AXTextMarker"); + namespace { // Private WebKit accessibility attributes. @@ -172,21 +178,24 @@ AXTextMarkerRef AXTextMarkerRangeCopyEndMarker( // AXTextMarkerCreate copies from data buffer given to it. id CreateTextMarker(BrowserAccessibilityPositionInstance position) { + SerializedPosition serialized = position->Serialize(); AXTextMarkerRef text_marker = AXTextMarkerCreate( - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(position.get()), - sizeof(BrowserAccessibilityPosition)); + kCFAllocatorDefault, reinterpret_cast<const UInt8*>(&serialized), + sizeof(SerializedPosition)); return [static_cast<id>(text_marker) autorelease]; } // |range| is destructed at the end of this method. |anchor| and |focus| are // copied into the individual text markers. id CreateTextMarkerRange(const AXPlatformRange range) { + SerializedPosition serialized_anchor = range.anchor()->Serialize(); + SerializedPosition serialized_focus = range.focus()->Serialize(); base::ScopedCFTypeRef<AXTextMarkerRef> start_marker(AXTextMarkerCreate( - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(range.anchor()), - sizeof(BrowserAccessibilityPosition))); + kCFAllocatorDefault, reinterpret_cast<const UInt8*>(&serialized_anchor), + sizeof(SerializedPosition))); base::ScopedCFTypeRef<AXTextMarkerRef> end_marker(AXTextMarkerCreate( - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(range.focus()), - sizeof(BrowserAccessibilityPosition))); + kCFAllocatorDefault, reinterpret_cast<const UInt8*>(&serialized_focus), + sizeof(SerializedPosition))); AXTextMarkerRangeRef marker_range = AXTextMarkerRangeCreate(kCFAllocatorDefault, start_marker, end_marker); return [static_cast<id>(marker_range) autorelease]; @@ -195,22 +204,15 @@ id CreateTextMarkerRange(const AXPlatformRange range) { BrowserAccessibilityPositionInstance CreatePositionFromTextMarker( AXTextMarkerRef text_marker) { DCHECK(text_marker); - if (AXTextMarkerGetLength(text_marker) != - sizeof(BrowserAccessibilityPosition)) + if (AXTextMarkerGetLength(text_marker) != sizeof(SerializedPosition)) return BrowserAccessibilityPosition::CreateNullPosition(); + const UInt8* source_buffer = AXTextMarkerGetBytePtr(text_marker); if (!source_buffer) return BrowserAccessibilityPosition::CreateNullPosition(); - UInt8* destination_buffer = new UInt8[sizeof(BrowserAccessibilityPosition)]; - std::memcpy(destination_buffer, source_buffer, - sizeof(BrowserAccessibilityPosition)); - BrowserAccessibilityPosition::AXPositionInstance position( - reinterpret_cast< - BrowserAccessibilityPosition::AXPositionInstance::pointer>( - destination_buffer)); - if (!position) - return BrowserAccessibilityPosition::CreateNullPosition(); - return position; + + return BrowserAccessibilityPosition::Unserialize( + *reinterpret_cast<const SerializedPosition*>(source_buffer)); } AXPlatformRange CreateRangeFromTextMarkerRange( diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager.cc b/chromium/content/browser/accessibility/browser_accessibility_manager.cc index 1e07bc2e39c..7ffe23034a6 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_manager.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_manager.cc @@ -1213,11 +1213,7 @@ void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree, } void BrowserAccessibilityManager::OnSubtreeWillBeDeleted(ui::AXTree* tree, - ui::AXNode* node) { - DCHECK(node); - if (BrowserAccessibility* wrapper = GetFromAXNode(node)) - wrapper->OnSubtreeWillBeDeleted(); -} + ui::AXNode* node) {} void BrowserAccessibilityManager::OnNodeCreated(ui::AXTree* tree, ui::AXNode* node) { diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.cc index ef4b81e43f4..428610edbec 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.cc @@ -234,20 +234,20 @@ static void EstablishEmbeddedRelationship(AtkObject* document_object) { document_platform_node->SetEmbeddingWindow(window); } -void BrowserAccessibilityManagerAuraLinux::OnStateChanged( +void BrowserAccessibilityManagerAuraLinux::OnNodeDataWillChange( ui::AXTree* tree, - ui::AXNode* node, - ax::mojom::State state, - bool new_value) { + const ui::AXNodeData& old_node_data, + const ui::AXNodeData& new_node_data) { DCHECK_EQ(ax_tree(), tree); // Since AuraLinux needs to send the children-changed::remove event with the // index in parent, the event must be fired before the node becomes ignored. // children-changed:add is handled with the generated Event::IGNORED_CHANGED. - if (state == ax::mojom::State::kIgnored && new_value) { - DCHECK(!node->data().HasState(ax::mojom::State::kIgnored)); - BrowserAccessibility* obj = GetFromAXNode(node); + if (!old_node_data.HasState(ax::mojom::State::kIgnored) && + new_node_data.HasState(ax::mojom::State::kIgnored)) { + BrowserAccessibility* obj = GetFromID(old_node_data.id); if (obj && obj->IsNative() && obj->GetParent()) { + DCHECK(!obj->HasState(ax::mojom::State::kIgnored)); g_signal_emit_by_name(obj->GetParent(), "children-changed::remove", obj->GetIndexInParent(), obj->GetNativeViewAccessible()); @@ -258,7 +258,6 @@ void BrowserAccessibilityManagerAuraLinux::OnStateChanged( void BrowserAccessibilityManagerAuraLinux::OnSubtreeWillBeDeleted( ui::AXTree* tree, ui::AXNode* node) { - BrowserAccessibilityManager::OnSubtreeWillBeDeleted(tree, node); // Sending events on load/destruction would create a lot of spam, avoid that. if (!GetTreeData().loaded) return; diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.h b/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.h index 4f002468799..3826fd5334c 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.h +++ b/chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.h @@ -42,10 +42,9 @@ class CONTENT_EXPORT BrowserAccessibilityManagerAuraLinux protected: // AXTreeObserver methods. - void OnStateChanged(ui::AXTree* tree, - ui::AXNode* node, - ax::mojom::State state, - bool new_value) override; + void OnNodeDataWillChange(ui::AXTree* tree, + const ui::AXNodeData& old_node_data, + const ui::AXNodeData& new_node_data) override; void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override; void OnAtomicUpdateFinished( ui::AXTree* tree, diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc b/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc index d444d88d857..7bbfed5a507 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_manager_win.cc @@ -75,19 +75,6 @@ HWND BrowserAccessibilityManagerWin::GetParentHWND() { return delegate->AccessibilityGetAcceleratedWidget(); } -void BrowserAccessibilityManagerWin::OnSubtreeWillBeDeleted(ui::AXTree* tree, - ui::AXNode* node) { - BrowserAccessibilityManager::OnSubtreeWillBeDeleted(tree, node); - - 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() { if (GetRoot()) FireWinAccessibilityEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot()); @@ -576,6 +563,20 @@ gfx::Rect BrowserAccessibilityManagerWin::GetViewBounds() { return gfx::Rect(); } +void BrowserAccessibilityManagerWin::OnSubtreeWillBeDeleted(ui::AXTree* tree, + ui::AXNode* node) { + BrowserAccessibility* obj = GetFromAXNode(node); + DCHECK(obj); + if (obj) { + FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, obj); + FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, obj); + if (obj->GetRole() == ax::mojom::Role::kMenu) { + FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPEND, obj); + FireUiaAccessibilityEvent(UIA_MenuClosedEventId, obj); + } + } +} + void BrowserAccessibilityManagerWin::OnAtomicUpdateFinished( ui::AXTree* tree, bool root_changed, diff --git a/chromium/content/browser/accessibility/browser_accessibility_manager_win.h b/chromium/content/browser/accessibility/browser_accessibility_manager_win.h index bb2457badef..9b8a9387207 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_manager_win.h +++ b/chromium/content/browser/accessibility/browser_accessibility_manager_win.h @@ -43,9 +43,6 @@ class CONTENT_EXPORT BrowserAccessibilityManagerWin // Get the closest containing HWND. HWND GetParentHWND(); - // AXEventGenerator methods - void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override; - // BrowserAccessibilityManager methods void UserIsReloading() override; BrowserAccessibility* GetFocus() const override; @@ -82,6 +79,7 @@ class CONTENT_EXPORT BrowserAccessibilityManagerWin protected: // AXTreeObserver methods. + void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override; void OnAtomicUpdateFinished( ui::AXTree* tree, bool root_changed, diff --git a/chromium/content/browser/accessibility/browser_accessibility_unittest.cc b/chromium/content/browser/accessibility/browser_accessibility_unittest.cc index bab809c51d1..eff14f455d4 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_unittest.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_unittest.cc @@ -210,63 +210,63 @@ TEST_F(BrowserAccessibilityTest, TestGetDescendants) { TEST_F(BrowserAccessibilityTest, PlatformChildIterator) { // (i) => node is ignored - // 0 + // 1 // |__________ // | | | - // 1(i) 2 3 + // 2(i) 3 4 // |_______________________ // | | | | - // 4 5 6(i) 7(i) + // 5 6 7(i) 8(i) // | | |________ // | | | | - // 8 9(i) 10(i) 11 + // 9 10(i) 11(i) 12 // | |____ // | | | - // 12(i) 13 14 + // 13(i) 14 15 ui::AXTreeUpdate tree_update; - tree_update.root_id = 0; + tree_update.root_id = 1; tree_update.nodes.resize(15); - tree_update.nodes[0].id = 0; - tree_update.nodes[0].child_ids = {1, 2, 3}; + tree_update.nodes[0].id = 1; + tree_update.nodes[0].child_ids = {2, 3, 4}; - tree_update.nodes[1].id = 1; - tree_update.nodes[1].child_ids = {4, 5, 6, 7}; + tree_update.nodes[1].id = 2; + tree_update.nodes[1].child_ids = {5, 6, 7, 8}; tree_update.nodes[1].AddState(ax::mojom::State::kIgnored); - tree_update.nodes[2].id = 2; - tree_update.nodes[3].id = 3; + tree_update.nodes[2].id = 3; + tree_update.nodes[3].id = 4; - tree_update.nodes[4].id = 4; - tree_update.nodes[4].child_ids = {8}; + tree_update.nodes[4].id = 5; + tree_update.nodes[4].child_ids = {9}; - tree_update.nodes[5].id = 5; - tree_update.nodes[5].child_ids = {9}; + tree_update.nodes[5].id = 6; + tree_update.nodes[5].child_ids = {10}; - tree_update.nodes[6].id = 6; - tree_update.nodes[6].child_ids = {10, 11}; + tree_update.nodes[6].id = 7; + tree_update.nodes[6].child_ids = {11, 12}; tree_update.nodes[6].AddState(ax::mojom::State::kIgnored); - tree_update.nodes[7].id = 7; + tree_update.nodes[7].id = 8; tree_update.nodes[7].AddState(ax::mojom::State::kIgnored); - tree_update.nodes[8].id = 8; + tree_update.nodes[8].id = 9; - tree_update.nodes[9].id = 9; - tree_update.nodes[9].child_ids = {12}; + tree_update.nodes[9].id = 10; + tree_update.nodes[9].child_ids = {13}; tree_update.nodes[9].AddState(ax::mojom::State::kIgnored); - tree_update.nodes[10].id = 10; - tree_update.nodes[10].child_ids = {13, 14}; + tree_update.nodes[10].id = 11; + tree_update.nodes[10].child_ids = {14, 15}; tree_update.nodes[10].AddState(ax::mojom::State::kIgnored); - tree_update.nodes[11].id = 11; + tree_update.nodes[11].id = 12; - tree_update.nodes[12].id = 12; + tree_update.nodes[12].id = 13; tree_update.nodes[12].AddState(ax::mojom::State::kIgnored); - tree_update.nodes[13].id = 13; + tree_update.nodes[13].id = 14; - tree_update.nodes[14].id = 14; + tree_update.nodes[14].id = 15; std::unique_ptr<BrowserAccessibilityManager> manager( BrowserAccessibilityManager::Create( @@ -275,61 +275,61 @@ TEST_F(BrowserAccessibilityTest, PlatformChildIterator) { BrowserAccessibility* root_obj = manager->GetRoot(); // Test traversal - // PlatformChildren(root_obj) = {4, 5, 13, 14, 11, 2, 3} + // PlatformChildren(root_obj) = {5, 6, 14, 15, 12, 3, 4} BrowserAccessibility::PlatformChildIterator platform_iterator = root_obj->PlatformChildrenBegin(); - EXPECT_EQ(4, platform_iterator->GetId()); - - ++platform_iterator; EXPECT_EQ(5, platform_iterator->GetId()); ++platform_iterator; - EXPECT_EQ(13, platform_iterator->GetId()); + EXPECT_EQ(6, platform_iterator->GetId()); ++platform_iterator; EXPECT_EQ(14, platform_iterator->GetId()); - --platform_iterator; - EXPECT_EQ(13, platform_iterator->GetId()); + ++platform_iterator; + EXPECT_EQ(15, platform_iterator->GetId()); --platform_iterator; - EXPECT_EQ(5, platform_iterator->GetId()); + EXPECT_EQ(14, platform_iterator->GetId()); - ++platform_iterator; - EXPECT_EQ(13, platform_iterator->GetId()); + --platform_iterator; + EXPECT_EQ(6, platform_iterator->GetId()); ++platform_iterator; EXPECT_EQ(14, platform_iterator->GetId()); ++platform_iterator; - EXPECT_EQ(11, platform_iterator->GetId()); + EXPECT_EQ(15, platform_iterator->GetId()); ++platform_iterator; - EXPECT_EQ(2, platform_iterator->GetId()); + EXPECT_EQ(12, platform_iterator->GetId()); ++platform_iterator; EXPECT_EQ(3, platform_iterator->GetId()); ++platform_iterator; + EXPECT_EQ(4, platform_iterator->GetId()); + + ++platform_iterator; EXPECT_EQ(root_obj->PlatformChildrenEnd(), platform_iterator); // test empty list // PlatformChildren(2) = {} - BrowserAccessibility* node2 = manager->GetFromID(2); + BrowserAccessibility* node2 = manager->GetFromID(3); platform_iterator = node2->PlatformChildrenBegin(); EXPECT_EQ(node2->PlatformChildrenEnd(), platform_iterator); // empty list from ignored node // PlatformChildren(7) = {} - BrowserAccessibility* node7 = manager->GetFromID(7); + BrowserAccessibility* node7 = manager->GetFromID(8); platform_iterator = node7->PlatformChildrenBegin(); EXPECT_EQ(node7->PlatformChildrenEnd(), platform_iterator); // non-empty list from ignored node - // PlatformChildren(10) = {13, 14} - BrowserAccessibility* node10 = manager->GetFromID(10); + // PlatformChildren(10) = {14, 15} + BrowserAccessibility* node10 = manager->GetFromID(11); platform_iterator = node10->PlatformChildrenBegin(); - EXPECT_EQ(13, platform_iterator->GetId()); + EXPECT_EQ(14, platform_iterator->GetId()); // Two UnignoredChildIterators from the same parent at the same position // should be equivalent, even in end position. diff --git a/chromium/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/chromium/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index db623358e04..3ed0354ecca 100644 --- a/chromium/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/chromium/content/browser/accessibility/dump_accessibility_tree_browsertest.cc @@ -2043,6 +2043,10 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, RunHtmlTest(FILE_PATH_LITERAL("button-with-listbox-popup.html")); } +IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, DeleteSelectionCrash) { + RunHtmlTest(FILE_PATH_LITERAL("delete-selection-crash.html")); +} + // // Regression tests. These don't test a specific web platform feature, // they test a specific web page that crashed or had some bad behavior |