blob: 887fdec072654ac074b20ed724e112b9ef7e12f2 [file] [log] [blame]
// 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 <atk/atk.h>
#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<TestBrowserAccessibilityDelegate>
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<TestBrowserAccessibilityDelegate>();
}
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<BrowserAccessibilityManager> 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::AXPlatformNodeAuraLinux*>(
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