summaryrefslogtreecommitdiff
path: root/chromium/content/browser/accessibility
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/accessibility')
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility.h2
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_cocoa.mm38
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_manager.cc6
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.cc15
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_manager_auralinux.h7
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_manager_win.cc27
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_manager_win.h4
-rw-r--r--chromium/content/browser/accessibility/browser_accessibility_unittest.cc90
-rw-r--r--chromium/content/browser/accessibility/dump_accessibility_tree_browsertest.cc4
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