// Copyright (c) 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/accessibility/browser_accessibility_manager_auralinux.h" #include #include "content/browser/accessibility/browser_accessibility.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/test_browser_accessibility_delegate.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/platform/ax_platform_node.h" #include "ui/accessibility/platform/ax_platform_node_auralinux.h" namespace content { class BrowserAccessibilityManagerAuraLinuxTest : public testing::Test { public: BrowserAccessibilityManagerAuraLinuxTest() = default; ~BrowserAccessibilityManagerAuraLinuxTest() override = default; protected: std::unique_ptr test_browser_accessibility_delegate_; private: void SetUp() override; DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManagerAuraLinuxTest); }; void BrowserAccessibilityManagerAuraLinuxTest::SetUp() { ui::AXPlatformNode::NotifyAddAXModeFlags(ui::kAXModeComplete); test_browser_accessibility_delegate_ = std::make_unique(); } TEST_F(BrowserAccessibilityManagerAuraLinuxTest, TestEmitChildrenChanged) { ui::AXTreeUpdate initial_state; ui::AXTreeID tree_id = ui::AXTreeID::CreateNewAXTreeID(); initial_state.tree_data.tree_id = tree_id; initial_state.has_tree_data = true; initial_state.tree_data.loaded = true; initial_state.root_id = 1; initial_state.nodes.resize(3); initial_state.nodes[0].id = 1; initial_state.nodes[0].child_ids = {2}; initial_state.nodes[0].role = ax::mojom::Role::kRootWebArea; initial_state.nodes[1].id = 2; initial_state.nodes[1].child_ids = {3}; initial_state.nodes[1].role = ax::mojom::Role::kStaticText; initial_state.nodes[2].id = 3; initial_state.nodes[2].role = ax::mojom::Role::kInlineTextBox; std::unique_ptr manager( BrowserAccessibilityManager::Create( initial_state, test_browser_accessibility_delegate_.get())); AtkObject* atk_root = manager->GetRoot()->GetNativeViewAccessible(); ui::AXPlatformNodeAuraLinux* root_document_root_node = static_cast( ui::AXPlatformNode::FromNativeViewAccessible(atk_root)); g_signal_connect(atk_root, "children-changed::remove", G_CALLBACK(+[](AtkObject* obj, int index, gpointer child, gpointer user_data) { EXPECT_EQ(ATK_ROLE_DOCUMENT_WEB, atk_object_get_role(obj)); }), nullptr); g_signal_connect(atk_root, "children-changed::add", G_CALLBACK(+[](AtkObject* obj, int index, gpointer child, gpointer user_data) { EXPECT_EQ(ATK_ROLE_DOCUMENT_WEB, atk_object_get_role(obj)); }), nullptr); BrowserAccessibility* static_text_accessible = manager->GetRoot()->PlatformGetChild(0); // StaticText node triggers 'children-changed' event to the parent, // ATK_ROLE_DOCUMENT_WEB, when subtree is changed. BrowserAccessibilityManagerAuraLinux* aura_linux_manager = manager->ToBrowserAccessibilityManagerAuraLinux(); aura_linux_manager->FireSubtreeCreatedEvent(static_text_accessible); aura_linux_manager->OnSubtreeWillBeDeleted(manager->ax_tree(), static_text_accessible->node()); AtkObject* atk_object = root_document_root_node->ChildAtIndex(0); g_signal_connect(atk_object, "children-changed::remove", G_CALLBACK(+[](AtkObject*, int index, gpointer child, gpointer user_data) { EXPECT_TRUE(false) << "should not be reached."; }), nullptr); g_signal_connect(atk_object, "children-changed::add", G_CALLBACK(+[](AtkObject* obj, int index, gpointer child, gpointer user_data) { EXPECT_TRUE(false) << "should not be reached."; }), nullptr); BrowserAccessibility* inline_text_accessible = static_text_accessible->PlatformGetChild(0); // PlatformLeaf node such as InlineText should not trigger // 'children-changed' event to the parent when subtree is changed. aura_linux_manager->FireSubtreeCreatedEvent(inline_text_accessible); aura_linux_manager->OnSubtreeWillBeDeleted(manager->ax_tree(), inline_text_accessible->node()); } } // namespace content