blob: eeaa5ee3b2cfb5e3f20d06a95626101861618af7 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_H_
#define UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_H_
#include <set>
#include <unordered_map>
#include "ui/accessibility/ax_enum_util.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_tree_update.h"
namespace ui {
struct AXNodeData;
struct AXTreeData;
class AXTreeID;
// These utility classes, help construct an AXTreeUpdate together with all of
// the updated nodes more easily. Only for use in tests for constructing /
// updating simple accessibility trees.
// Used to construct AXTreeUpdate node.
struct TestAXTreeUpdateNode final {
TestAXTreeUpdateNode() = delete;
~TestAXTreeUpdateNode();
TestAXTreeUpdateNode(const TestAXTreeUpdateNode&);
TestAXTreeUpdateNode(TestAXTreeUpdateNode&&);
TestAXTreeUpdateNode(ax::mojom::Role role,
const std::vector<TestAXTreeUpdateNode>& children);
TestAXTreeUpdateNode(ax::mojom::Role role,
ax::mojom::State state,
const std::vector<TestAXTreeUpdateNode>& children);
TestAXTreeUpdateNode(const std::string& text);
AXNodeData data;
std::vector<TestAXTreeUpdateNode> children;
};
// Used to construct an accessible tree from a hierarchical list of nodes
// {<node_properties>, {<node_children>}}. For example,
// {Role::kRootWebArea, {"text"}} will create the following tree:
// kRootWebArea
// ++kStaticText "text"
class TestAXTreeUpdate final : public AXTreeUpdate {
public:
TestAXTreeUpdate(const TestAXTreeUpdateNode& root);
// Returns an `AXTreeUpdate` from a tree structure string of the format:
// ++<id> <role> <name?>="<name>" <state?>=<state_value>,<state_value>
// Where the properties denoted with a `?` are optional.
// For example:
// ++++4 kTextField name="placeholder" state=kEditable,kFocusable
//
// Other supported properties are:
// * intAttribute=<intAttributeType>,<intAttributeValue>
// * stringAttribute=<stringAttributeType>,<stringAttributeValue>
// * boolAttribute=<boolAttributeType>,<boolAttributeValue>
//
// Some of the expectations this function makes are:
// * Roles and states are always valid.
// * Roles and states are prefixed by a 'k'.
// * The `name` property value passed in is surrounded by double quotes.
// * Properties that may have multiple possible values passed in have those
// values separated ONLY by a comma.
// * There is always a newline separating each node of the tree.
//
// LIMITATIONS:
// - Because the parsing uses newline characters to distinguish between lines
// (where each line is one node), names for nodes can't be newline characters.
// - For similar reasons, spaces, '+', '=', commas, and double quotes can't be
// used as or within node names.
// Follow up CLs will be made so alleviate these limitations.
TestAXTreeUpdate(const std::string& tree_structure);
TestAXTreeUpdate(const TestAXTreeUpdate&) = delete;
TestAXTreeUpdate& operator=(const TestAXTreeUpdate&) = delete;
private:
// Recursively creates the tree update structure.
AXNodeID SetSubtree(const TestAXTreeUpdateNode& node);
};
} // namespace ui
#endif // UI_ACCESSIBILITY_TEST_AX_TREE_UPDATE_H_