Commit ab247c78 authored by Alexander Surkov's avatar Alexander Surkov Committed by Commit Bot

dumpacctree testsuite: support object context selectors for

properties

Extend the properties call format to allow to indicate an object
the property should be called for. For example, :1.AXDOMIdentifier
to call AXDOMIdentifier property on an object placed on the first line
of a generated tree.

Bug: 1136957
Change-Id: Icf9c1467ed9c97d632a3dbcc80af6d1817d9e466
AX-Relnotes: n/a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2462839
Commit-Queue: Alexander Surkov <asurkov@igalia.com>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#816743}
parent dde482ee
......@@ -69,6 +69,7 @@ PropertyNode PropertyNode::FromPropertyFilter(
PropertyNode::PropertyNode() = default;
PropertyNode::PropertyNode(PropertyNode&& o)
: key(std::move(o.key)),
target(std::move(o.target)),
name_or_value(std::move(o.name_or_value)),
parameters(std::move(o.parameters)),
original_property(std::move(o.original_property)),
......@@ -77,6 +78,7 @@ PropertyNode::~PropertyNode() = default;
PropertyNode& PropertyNode::operator=(PropertyNode&& o) {
key = std::move(o.key);
target = std::move(o.target);
name_or_value = std::move(o.name_or_value);
parameters = std::move(o.parameters);
original_property = std::move(o.original_property);
......@@ -154,6 +156,10 @@ std::string PropertyNode::ToString() const {
if (!key.empty()) {
out += key + ": ";
}
if (!target.empty()) {
out += target + '.';
}
out += name_or_value;
if (parameters.size()) {
out += '(';
......@@ -172,15 +178,31 @@ std::string PropertyNode::ToString() const {
PropertyNode::PropertyNode(PropertyNode::iterator key_begin,
PropertyNode::iterator key_end,
const std::string& name_or_value)
: key(key_begin, key_end), name_or_value(name_or_value) {}
: key(key_begin, key_end) {
Set(name_or_value.begin(), name_or_value.end());
}
PropertyNode::PropertyNode(PropertyNode::iterator begin,
PropertyNode::iterator end)
: name_or_value(begin, end) {}
PropertyNode::iterator end) {
Set(begin, end);
}
PropertyNode::PropertyNode(PropertyNode::iterator key_begin,
PropertyNode::iterator key_end,
PropertyNode::iterator value_begin,
PropertyNode::iterator value_end)
: key(key_begin, key_end), name_or_value(value_begin, value_end) {}
: key(key_begin, key_end), name_or_value(value_begin, value_end) {
Set(value_begin, value_end);
}
void PropertyNode::Set(PropertyNode::iterator begin,
PropertyNode::iterator end) {
PropertyNode::iterator dot_operator = std::find(begin, end, '.');
if (dot_operator != end) {
target = std::string(begin, dot_operator);
name_or_value = std::string(dot_operator + 1, end);
} else {
name_or_value = std::string(begin, end);
}
}
// private static
PropertyNode::iterator PropertyNode::Parse(PropertyNode* node,
......
......@@ -49,6 +49,11 @@ class CONTENT_EXPORT PropertyNode final {
// Key name in case of { key: value } dictionary.
std::string key;
// An object the property should be called for, designated by a line number
// in accessible tree the object is located at. For example, :1 indicates
// that the property should be called for an object located at first line.
std::string target;
// Value or a property name, for example 3 or AXLineForIndex
std::string name_or_value;
......@@ -61,7 +66,7 @@ class CONTENT_EXPORT PropertyNode final {
std::string original_property;
// The list of line indexes of accessible objects the property is allowed to
// be called for.
// be called for, used if no property target is provided.
std::vector<std::string> line_indexes;
bool IsMatching(const std::string& pattern) const;
......@@ -88,6 +93,9 @@ class CONTENT_EXPORT PropertyNode final {
iterator value_begin,
iterator value_end);
// Helper to set context and name.
void Set(iterator begin, iterator end);
// Builds a property node struct for a string of NAME(ARG1, ..., ARGN) format,
// where each ARG is a scalar value or a string of the same format.
static iterator Parse(PropertyNode* node, iterator begin, iterator end);
......
......@@ -48,6 +48,26 @@ void ParseAndCheck(const char* input, const char* expected) {
EXPECT_EQ(got, expected);
}
struct ProperyNodeCheck {
std::string target;
std::string name_or_value;
std::vector<ProperyNodeCheck> parameters;
};
void Check(const PropertyNode& got, const ProperyNodeCheck& expected) {
EXPECT_EQ(got.target, expected.target);
EXPECT_EQ(got.name_or_value, expected.name_or_value);
EXPECT_EQ(got.parameters.size(), expected.parameters.size());
for (auto i = 0U;
i < std::min(expected.parameters.size(), got.parameters.size()); i++) {
Check(got.parameters[i], expected.parameters[i]);
}
}
void ParseAndCheck(const char* input, const ProperyNodeCheck& expected) {
Check(Parse(input), expected);
}
TEST_F(AccessibilityTreeFormatterBaseTest, ParseProperty) {
// Properties and methods.
ParseAndCheck("Role", "Role");
......@@ -75,6 +95,17 @@ TEST_F(AccessibilityTreeFormatterBaseTest, ParseProperty) {
// Line indexes filter.
ParseAndCheck(":3,:5;AXDOMClassList", ":3,:5;AXDOMClassList");
// Context object.
ParseAndCheck(":1.AXDOMClassList", ":1.AXDOMClassList");
ParseAndCheck(":1.AXDOMClassList", {":1", "AXDOMClassList"});
ParseAndCheck(":1.AXIndexForTextMarker(:1.AXTextMarkerForIndex(0))",
":1.AXIndexForTextMarker(:1.AXTextMarkerForIndex(0))");
ParseAndCheck(":1.AXIndexForTextMarker(:1.AXTextMarkerForIndex(0))",
{":1",
"AXIndexForTextMarker",
{{":1", "AXTextMarkerForIndex", {{"", "0"}}}}});
// Wrong format.
ParseAndCheck("Role(3", "Role(3)");
ParseAndCheck("TableFor(CellBy(id", "TableFor(CellBy(id))");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment