Commit 9c43aeef authored by Dominic Mazzoni's avatar Dominic Mazzoni Committed by Commit Bot

Re-land: Simplify parsing code in ax_enum_util

Original: http://crrev.com/c/2404164
Reverted: http://crrev.com/c/2416357 due to issue with death test.

Replace the hand-written code to parse each enum from ax_enums with a
templatized function that builds a map from string to attribute value
on-demand.

This saves a little bit of manual effort each time someone updates an enum.

Note that these parsing functions are only used by the automation API.

Bug: None
Change-Id: Ib710f15f2596b04d30ca177b8141b2dc953ed5c1
AX-Relnotes: N/A
Tbr: dtseng@chromium.org
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2418850Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808468}
parent 9c4e8465
...@@ -208,7 +208,7 @@ void AccessibilityNodeInfoDataWrapper::PopulateAXRole( ...@@ -208,7 +208,7 @@ void AccessibilityNodeInfoDataWrapper::PopulateAXRole(
std::string chrome_role; std::string chrome_role;
if (GetProperty(AXStringProperty::CHROME_ROLE, &chrome_role)) { if (GetProperty(AXStringProperty::CHROME_ROLE, &chrome_role)) {
ax::mojom::Role role_value = ui::ParseRole(chrome_role.c_str()); auto role_value = ui::ParseAXEnum<ax::mojom::Role>(chrome_role.c_str());
if (role_value != ax::mojom::Role::kNone) { if (role_value != ax::mojom::Role::kNone) {
// The webView and rootWebArea roles differ between Android and Chrome. In // The webView and rootWebArea roles differ between Android and Chrome. In
// particular, Android includes far fewer attributes which leads to // particular, Android includes far fewer attributes which leads to
......
...@@ -21,14 +21,6 @@ var allTests = [ ...@@ -21,14 +21,6 @@ var allTests = [
chrome.test.succeed(); chrome.test.succeed();
}, },
function detectedLanguageForInvalidAttribute() {
var item = rootNode.children[2].children[0];
var langAnnotation =
item.languageAnnotationForStringAttribute('invalid attribute');
assertEq(0, langAnnotation.length);
chrome.test.succeed();
},
function detectedLanguageCharacter() { function detectedLanguageCharacter() {
var item = rootNode.children[2].children[0]; var item = rootNode.children[2].children[0];
var langAnnotation = item.languageAnnotationForStringAttribute('name'); var langAnnotation = item.languageAnnotationForStringAttribute('name');
......
...@@ -381,8 +381,8 @@ AutomationInternalPerformActionFunction::ConvertToAXActionData( ...@@ -381,8 +381,8 @@ AutomationInternalPerformActionFunction::ConvertToAXActionData(
params->opt_args.additional_properties, &hit_test_params)); params->opt_args.additional_properties, &hit_test_params));
action->action = ax::mojom::Action::kHitTest; action->action = ax::mojom::Action::kHitTest;
action->target_point = gfx::Point(hit_test_params.x, hit_test_params.y); action->target_point = gfx::Point(hit_test_params.x, hit_test_params.y);
action->hit_test_event_to_fire = action->hit_test_event_to_fire = ui::ParseAXEnum<ax::mojom::Event>(
ui::ParseEvent(hit_test_params.event_to_fire.c_str()); hit_test_params.event_to_fire.c_str());
if (action->hit_test_event_to_fire == ax::mojom::Event::kNone) if (action->hit_test_event_to_fire == ax::mojom::Event::kNone)
return RespondNow(NoArguments()); return RespondNow(NoArguments());
break; break;
......
...@@ -483,8 +483,8 @@ class NodeIDPlusEventWrapper ...@@ -483,8 +483,8 @@ class NodeIDPlusEventWrapper
ui::AXTreeID tree_id = ui::AXTreeID tree_id =
ui::AXTreeID::FromString(*v8::String::Utf8Value(isolate, args[0])); ui::AXTreeID::FromString(*v8::String::Utf8Value(isolate, args[0]));
int node_id = args[1].As<v8::Int32>()->Value(); int node_id = args[1].As<v8::Int32>()->Value();
ax::mojom::Event event_type = auto event_type = ui::ParseAXEnum<ax::mojom::Event>(
ui::ParseEvent(*v8::String::Utf8Value(isolate, args[2])); *v8::String::Utf8Value(isolate, args[2]));
AutomationAXTreeWrapper* tree_wrapper = AutomationAXTreeWrapper* tree_wrapper =
automation_bindings_->GetAutomationAXTreeWrapperFromTreeID(tree_id); automation_bindings_->GetAutomationAXTreeWrapperFromTreeID(tree_id);
...@@ -999,8 +999,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -999,8 +999,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::StringAttribute attribute = auto attribute =
ui::ParseStringAttribute(attribute_name.c_str()); ui::ParseAXEnum<ax::mojom::StringAttribute>(attribute_name.c_str());
const char* attr_value; const char* attr_value;
if (attribute == ax::mojom::StringAttribute::kFontFamily || if (attribute == ax::mojom::StringAttribute::kFontFamily ||
attribute == ax::mojom::StringAttribute::kLanguage) { attribute == ax::mojom::StringAttribute::kLanguage) {
...@@ -1019,8 +1019,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1019,8 +1019,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::BoolAttribute attribute = auto attribute =
ui::ParseBoolAttribute(attribute_name.c_str()); ui::ParseAXEnum<ax::mojom::BoolAttribute>(attribute_name.c_str());
bool attr_value; bool attr_value;
if (!node->data().GetBoolAttribute(attribute, &attr_value)) if (!node->data().GetBoolAttribute(attribute, &attr_value))
return; return;
...@@ -1032,8 +1032,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1032,8 +1032,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::IntAttribute attribute = auto attribute =
ui::ParseIntAttribute(attribute_name.c_str()); ui::ParseAXEnum<ax::mojom::IntAttribute>(attribute_name.c_str());
int attr_value; int attr_value;
if (attribute == ax::mojom::IntAttribute::kPosInSet && if (attribute == ax::mojom::IntAttribute::kPosInSet &&
...@@ -1053,8 +1053,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1053,8 +1053,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::IntAttribute attribute = auto attribute =
ui::ParseIntAttribute(attribute_name.c_str()); ui::ParseAXEnum<ax::mojom::IntAttribute>(attribute_name.c_str());
std::set<int32_t> ids = std::set<int32_t> ids =
tree->GetReverseRelations(attribute, node->id()); tree->GetReverseRelations(attribute, node->id());
v8::Local<v8::Context> context = isolate->GetCurrentContext(); v8::Local<v8::Context> context = isolate->GetCurrentContext();
...@@ -1073,8 +1073,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1073,8 +1073,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::FloatAttribute attribute = auto attribute =
ui::ParseFloatAttribute(attribute_name.c_str()); ui::ParseAXEnum<ax::mojom::FloatAttribute>(attribute_name.c_str());
float attr_value; float attr_value;
if (!node->data().GetFloatAttribute(attribute, &attr_value)) if (!node->data().GetFloatAttribute(attribute, &attr_value))
...@@ -1091,8 +1091,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1091,8 +1091,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::IntListAttribute attribute = auto attribute = ui::ParseAXEnum<ax::mojom::IntListAttribute>(
ui::ParseIntListAttribute(attribute_name.c_str()); attribute_name.c_str());
if (!node->data().HasIntListAttribute(attribute)) if (!node->data().HasIntListAttribute(attribute))
return; return;
const std::vector<int32_t>& attr_value = const std::vector<int32_t>& attr_value =
...@@ -1113,8 +1113,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1113,8 +1113,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::IntListAttribute attribute = auto attribute = ui::ParseAXEnum<ax::mojom::IntListAttribute>(
ui::ParseIntListAttribute(attribute_name.c_str()); attribute_name.c_str());
std::set<int32_t> ids = std::set<int32_t> ids =
tree->GetReverseRelations(attribute, node->id()); tree->GetReverseRelations(attribute, node->id());
v8::Local<v8::Context> context = isolate->GetCurrentContext(); v8::Local<v8::Context> context = isolate->GetCurrentContext();
...@@ -1278,8 +1278,8 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1278,8 +1278,8 @@ void AutomationInternalCustomBindings::AddRoutes() {
[](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result, [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
ui::AXTree* tree, ui::AXNode* node, ui::AXTree* tree, ui::AXNode* node,
const std::string& attribute_name) { const std::string& attribute_name) {
ax::mojom::StringAttribute attr = auto attr =
ui::ParseStringAttribute(attribute_name.c_str()); ui::ParseAXEnum<ax::mojom::StringAttribute>(attribute_name.c_str());
if (attr == ax::mojom::StringAttribute::kNone) { if (attr == ax::mojom::StringAttribute::kNone) {
// Set result as empty array. // Set result as empty array.
result.Set(v8::Array::New(isolate, 0)); result.Set(v8::Array::New(isolate, 0));
...@@ -1383,7 +1383,7 @@ void AutomationInternalCustomBindings::AddRoutes() { ...@@ -1383,7 +1383,7 @@ void AutomationInternalCustomBindings::AddRoutes() {
// spin button. // spin button.
const std::string& role_string = const std::string& role_string =
node->GetStringAttribute(ax::mojom::StringAttribute::kRole); node->GetStringAttribute(ax::mojom::StringAttribute::kRole);
ax::mojom::Role role = ui::ParseRole(role_string.c_str()); auto role = ui::ParseAXEnum<ax::mojom::Role>(role_string.c_str());
if (role == ax::mojom::Role::kSlider || if (role == ax::mojom::Role::kSlider ||
role == ax::mojom::Role::kSpinButton) { role == ax::mojom::Role::kSpinButton) {
standard_actions.push_back( standard_actions.push_back(
......
This diff is collapsed.
...@@ -5,8 +5,13 @@ ...@@ -5,8 +5,13 @@
#ifndef UI_ACCESSIBILITY_AX_ENUM_UTIL_H_ #ifndef UI_ACCESSIBILITY_AX_ENUM_UTIL_H_
#define UI_ACCESSIBILITY_AX_ENUM_UTIL_H_ #define UI_ACCESSIBILITY_AX_ENUM_UTIL_H_
#include <map>
#include <string> #include <string>
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/notreached.h"
#include "base/stl_util.h"
#include "ui/accessibility/ax_base_export.h" #include "ui/accessibility/ax_base_export.h"
#include "ui/accessibility/ax_enums.mojom-forward.h" #include "ui/accessibility/ax_enums.mojom-forward.h"
...@@ -14,24 +19,18 @@ namespace ui { ...@@ -14,24 +19,18 @@ namespace ui {
// ax::mojom::Event // ax::mojom::Event
AX_BASE_EXPORT const char* ToString(ax::mojom::Event event); AX_BASE_EXPORT const char* ToString(ax::mojom::Event event);
AX_BASE_EXPORT ax::mojom::Event ParseEvent(const char* event);
// ax::mojom::Role // ax::mojom::Role
AX_BASE_EXPORT const char* ToString(ax::mojom::Role role); AX_BASE_EXPORT const char* ToString(ax::mojom::Role role);
AX_BASE_EXPORT ax::mojom::Role ParseRole(const char* role);
// ax::mojom::State // ax::mojom::State
AX_BASE_EXPORT const char* ToString(ax::mojom::State state); AX_BASE_EXPORT const char* ToString(ax::mojom::State state);
AX_BASE_EXPORT ax::mojom::State ParseState(const char* state);
// ax::mojom::Action // ax::mojom::Action
AX_BASE_EXPORT const char* ToString(ax::mojom::Action action); AX_BASE_EXPORT const char* ToString(ax::mojom::Action action);
AX_BASE_EXPORT ax::mojom::Action ParseAction(const char* action);
// ax::mojom::ActionFlags // ax::mojom::ActionFlags
AX_BASE_EXPORT const char* ToString(ax::mojom::ActionFlags action_flags); AX_BASE_EXPORT const char* ToString(ax::mojom::ActionFlags action_flags);
AX_BASE_EXPORT ax::mojom::ActionFlags ParseActionFlags(
const char* action_flags);
// ax::mojom::DefaultActionVerb // ax::mojom::DefaultActionVerb
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
...@@ -41,156 +40,129 @@ AX_BASE_EXPORT const char* ToString( ...@@ -41,156 +40,129 @@ AX_BASE_EXPORT const char* ToString(
AX_BASE_EXPORT std::string ToLocalizedString( AX_BASE_EXPORT std::string ToLocalizedString(
ax::mojom::DefaultActionVerb action_verb); ax::mojom::DefaultActionVerb action_verb);
AX_BASE_EXPORT ax::mojom::DefaultActionVerb ParseDefaultActionVerb(
const char* default_action_verb);
// ax::mojom::Mutation // ax::mojom::Mutation
AX_BASE_EXPORT const char* ToString(ax::mojom::Mutation mutation); AX_BASE_EXPORT const char* ToString(ax::mojom::Mutation mutation);
AX_BASE_EXPORT ax::mojom::Mutation ParseMutation(const char* mutation);
// ax::mojom::StringAttribute // ax::mojom::StringAttribute
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
ax::mojom::StringAttribute string_attribute); ax::mojom::StringAttribute string_attribute);
AX_BASE_EXPORT ax::mojom::StringAttribute ParseStringAttribute(
const char* string_attribute);
// ax::mojom::IntAttribute // ax::mojom::IntAttribute
AX_BASE_EXPORT const char* ToString(ax::mojom::IntAttribute int_attribute); AX_BASE_EXPORT const char* ToString(ax::mojom::IntAttribute int_attribute);
AX_BASE_EXPORT ax::mojom::IntAttribute ParseIntAttribute(
const char* int_attribute);
// ax::mojom::FloatAttribute // ax::mojom::FloatAttribute
AX_BASE_EXPORT const char* ToString(ax::mojom::FloatAttribute float_attribute); AX_BASE_EXPORT const char* ToString(ax::mojom::FloatAttribute float_attribute);
AX_BASE_EXPORT ax::mojom::FloatAttribute ParseFloatAttribute(
const char* float_attribute);
// ax::mojom::BoolAttribute // ax::mojom::BoolAttribute
AX_BASE_EXPORT const char* ToString(ax::mojom::BoolAttribute bool_attribute); AX_BASE_EXPORT const char* ToString(ax::mojom::BoolAttribute bool_attribute);
AX_BASE_EXPORT ax::mojom::BoolAttribute ParseBoolAttribute(
const char* bool_attribute);
// ax::mojom::IntListAttribute // ax::mojom::IntListAttribute
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
ax::mojom::IntListAttribute int_list_attribute); ax::mojom::IntListAttribute int_list_attribute);
AX_BASE_EXPORT ax::mojom::IntListAttribute ParseIntListAttribute(
const char* int_list_attribute);
// ax::mojom::StringListAttribute // ax::mojom::StringListAttribute
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
ax::mojom::StringListAttribute string_list_attribute); ax::mojom::StringListAttribute string_list_attribute);
AX_BASE_EXPORT ax::mojom::StringListAttribute ParseStringListAttribute(
const char* string_list_attribute);
// ax::mojom::ListStyle // ax::mojom::ListStyle
AX_BASE_EXPORT const char* ToString(ax::mojom::ListStyle list_style); AX_BASE_EXPORT const char* ToString(ax::mojom::ListStyle list_style);
AX_BASE_EXPORT ax::mojom::ListStyle ParseListStyle(const char* list_style);
// ax::mojom::MarkerType // ax::mojom::MarkerType
AX_BASE_EXPORT const char* ToString(ax::mojom::MarkerType marker_type); AX_BASE_EXPORT const char* ToString(ax::mojom::MarkerType marker_type);
AX_BASE_EXPORT ax::mojom::MarkerType ParseMarkerType(const char* marker_type);
// ax::mojom::MoveDirection // ax::mojom::MoveDirection
AX_BASE_EXPORT const char* ToString(ax::mojom::MoveDirection move_direction); AX_BASE_EXPORT const char* ToString(ax::mojom::MoveDirection move_direction);
AX_BASE_EXPORT ax::mojom::MoveDirection ParseMoveDirection(
const char* move_direction);
// ax::mojom::Command // ax::mojom::Command
AX_BASE_EXPORT const char* ToString(ax::mojom::Command command); AX_BASE_EXPORT const char* ToString(ax::mojom::Command command);
AX_BASE_EXPORT ax::mojom::Command ParseCommand(const char* command);
// ax::mojom::TextBoundary // ax::mojom::TextBoundary
AX_BASE_EXPORT const char* ToString(ax::mojom::TextBoundary text_boundary); AX_BASE_EXPORT const char* ToString(ax::mojom::TextBoundary text_boundary);
AX_BASE_EXPORT ax::mojom::TextBoundary ParseTextBoundary(
const char* text_boundary);
// ax:mojom::TextDecorationStyle // ax:mojom::TextDecorationStyle
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
ax::mojom::TextDecorationStyle text_decoration_style); ax::mojom::TextDecorationStyle text_decoration_style);
AX_BASE_EXPORT ax::mojom::TextDecorationStyle ParseTextDecorationStyle(
const char* text_decoration_style);
// ax::mojom::TextAlign // ax::mojom::TextAlign
AX_BASE_EXPORT const char* ToString(ax::mojom::TextAlign text_align); AX_BASE_EXPORT const char* ToString(ax::mojom::TextAlign text_align);
AX_BASE_EXPORT ax::mojom::TextAlign ParseTextAlign(const char* text_align);
// ax::mojom::WritingDirection // ax::mojom::WritingDirection
AX_BASE_EXPORT const char* ToString(ax::mojom::WritingDirection text_direction); AX_BASE_EXPORT const char* ToString(ax::mojom::WritingDirection text_direction);
AX_BASE_EXPORT ax::mojom::WritingDirection ParseTextDirection(
const char* text_direction);
// ax::mojom::TextPosition // ax::mojom::TextPosition
AX_BASE_EXPORT const char* ToString(ax::mojom::TextPosition text_position); AX_BASE_EXPORT const char* ToString(ax::mojom::TextPosition text_position);
AX_BASE_EXPORT ax::mojom::TextPosition ParseTextPosition(
const char* text_position);
// ax::mojom::TextStyle // ax::mojom::TextStyle
AX_BASE_EXPORT const char* ToString(ax::mojom::TextStyle text_style); AX_BASE_EXPORT const char* ToString(ax::mojom::TextStyle text_style);
AX_BASE_EXPORT ax::mojom::TextStyle ParseTextStyle(const char* text_style);
// ax::mojom::AriaCurrentState // ax::mojom::AriaCurrentState
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
ax::mojom::AriaCurrentState aria_current_state); ax::mojom::AriaCurrentState aria_current_state);
AX_BASE_EXPORT ax::mojom::AriaCurrentState ParseAriaCurrentState(
const char* aria_current_state);
// ax::mojom::HasPopup // ax::mojom::HasPopup
AX_BASE_EXPORT const char* ToString(ax::mojom::HasPopup has_popup); AX_BASE_EXPORT const char* ToString(ax::mojom::HasPopup has_popup);
AX_BASE_EXPORT ax::mojom::HasPopup ParseHasPopup(const char* has_popup);
// ax::mojom::InvalidState // ax::mojom::InvalidState
AX_BASE_EXPORT const char* ToString(ax::mojom::InvalidState invalid_state); AX_BASE_EXPORT const char* ToString(ax::mojom::InvalidState invalid_state);
AX_BASE_EXPORT ax::mojom::InvalidState ParseInvalidState(
const char* invalid_state);
// ax::mojom::Restriction // ax::mojom::Restriction
AX_BASE_EXPORT const char* ToString(ax::mojom::Restriction restriction); AX_BASE_EXPORT const char* ToString(ax::mojom::Restriction restriction);
AX_BASE_EXPORT ax::mojom::Restriction ParseRestriction(const char* restriction);
// ax::mojom::CheckedState // ax::mojom::CheckedState
AX_BASE_EXPORT const char* ToString(ax::mojom::CheckedState checked_state); AX_BASE_EXPORT const char* ToString(ax::mojom::CheckedState checked_state);
AX_BASE_EXPORT ax::mojom::CheckedState ParseCheckedState(
const char* checked_state);
// ax::mojom::SortDirection // ax::mojom::SortDirection
AX_BASE_EXPORT const char* ToString(ax::mojom::SortDirection sort_direction); AX_BASE_EXPORT const char* ToString(ax::mojom::SortDirection sort_direction);
AX_BASE_EXPORT ax::mojom::SortDirection ParseSortDirection(
const char* sort_direction);
// ax::mojom::NameFrom // ax::mojom::NameFrom
AX_BASE_EXPORT const char* ToString(ax::mojom::NameFrom name_from); AX_BASE_EXPORT const char* ToString(ax::mojom::NameFrom name_from);
AX_BASE_EXPORT ax::mojom::NameFrom ParseNameFrom(const char* name_from);
// ax::mojom::DescriptionFrom // ax::mojom::DescriptionFrom
AX_BASE_EXPORT const char* ToString( AX_BASE_EXPORT const char* ToString(
ax::mojom::DescriptionFrom description_from); ax::mojom::DescriptionFrom description_from);
AX_BASE_EXPORT ax::mojom::DescriptionFrom ParseDescriptionFrom(
const char* description_from);
// ax::mojom::EventFrom // ax::mojom::EventFrom
AX_BASE_EXPORT const char* ToString(ax::mojom::EventFrom event_from); AX_BASE_EXPORT const char* ToString(ax::mojom::EventFrom event_from);
AX_BASE_EXPORT ax::mojom::EventFrom ParseEventFrom(const char* event_from);
// ax::mojom::Gesture // ax::mojom::Gesture
AX_BASE_EXPORT const char* ToString(ax::mojom::Gesture gesture); AX_BASE_EXPORT const char* ToString(ax::mojom::Gesture gesture);
AX_BASE_EXPORT ax::mojom::Gesture ParseGesture(const char* gesture);
// ax::mojom::TextAffinity // ax::mojom::TextAffinity
AX_BASE_EXPORT const char* ToString(ax::mojom::TextAffinity text_affinity); AX_BASE_EXPORT const char* ToString(ax::mojom::TextAffinity text_affinity);
AX_BASE_EXPORT ax::mojom::TextAffinity ParseTextAffinity(
const char* text_affinity);
// ax::mojom::TreeOrder // ax::mojom::TreeOrder
AX_BASE_EXPORT const char* ToString(ax::mojom::TreeOrder tree_order); AX_BASE_EXPORT const char* ToString(ax::mojom::TreeOrder tree_order);
AX_BASE_EXPORT ax::mojom::TreeOrder ParseTreeOrder(const char* tree_order);
// ax::mojom::ImageAnnotationStatus // ax::mojom::ImageAnnotationStatus
AX_BASE_EXPORT const char* ToString(ax::mojom::ImageAnnotationStatus status); AX_BASE_EXPORT const char* ToString(ax::mojom::ImageAnnotationStatus status);
AX_BASE_EXPORT ax::mojom::ImageAnnotationStatus ParseImageAnnotationStatus(
const char* status);
// ax::mojom::Dropeffect // ax::mojom::Dropeffect
AX_BASE_EXPORT const char* ToString(ax::mojom::Dropeffect dropeffect); AX_BASE_EXPORT const char* ToString(ax::mojom::Dropeffect dropeffect);
AX_BASE_EXPORT ax::mojom::Dropeffect ParseDropeffect(const char* dropeffect);
// Convert from the string representation of an enum defined in ax_enums.mojom
// into the enum value. The first time this is called, builds up a map.
// Relies on the existence of ui::ToString(enum).
template <typename T>
T ParseAXEnum(const char* attribute) {
static base::NoDestructor<std::map<std::string, T>> attr_map;
if (attr_map->empty()) {
(*attr_map)[""] = T::kNone;
for (int i = static_cast<int>(T::kMinValue);
i <= static_cast<int>(T::kMaxValue); i++) {
auto attr = static_cast<T>(i);
std::string str = ui::ToString(attr);
if (!base::Contains(*attr_map, str))
(*attr_map)[str] = attr;
}
}
auto iter = attr_map->find(attribute);
if (iter != attr_map->end())
return iter->second;
LOG(ERROR) << "Could not parse: " << attribute;
NOTREACHED();
return T::kNone;
}
} // namespace ui } // namespace ui
......
...@@ -16,24 +16,27 @@ namespace ui { ...@@ -16,24 +16,27 @@ namespace ui {
// Templatized function that tests that for a mojom enum // Templatized function that tests that for a mojom enum
// such as ax::mojom::Role, ax::mojom::Event, etc. we can // such as ax::mojom::Role, ax::mojom::Event, etc. we can
// call ToString() on the enum to get a string, and then // call ToString() on the enum to get a string, and then
// ParseEnumName() on the string to get back the original // ParseAXEnum() on the string to get back the original
// value. Also tests what happens when we call ToString // value. Also tests what happens when we call ToString
// or ParseEnumName on a bogus value. // or ParseAXEnum on a bogus value.
template <typename T> template <typename T>
void TestEnumStringConversion( void TestEnumStringConversion(
T(ParseFunction)(const char*),
int32_t(step)(int32_t) = [](int32_t val) { return val + 1; }) { int32_t(step)(int32_t) = [](int32_t val) { return val + 1; }) {
// Check every valid enum value. // Check every valid enum value.
for (int i = static_cast<int>(T::kMinValue); for (int i = static_cast<int>(T::kMinValue);
i <= static_cast<int>(T::kMaxValue); i = step(i)) { i <= static_cast<int>(T::kMaxValue); i = step(i)) {
T src = static_cast<T>(i); T src = static_cast<T>(i);
std::string str = ToString(src); std::string str = ToString(src);
auto dst = ParseFunction(str.c_str()); auto dst = ParseAXEnum<T>(str.c_str());
EXPECT_EQ(src, dst); EXPECT_EQ(src, dst);
} }
// Parse a bogus string. // Trying to parse a bogus string should crash.
EXPECT_EQ(T::kNone, ParseFunction("bogus")); // TODO(http://crbug.com/1129919) - try to re-enable this death test.
// EXPECT_DEATH_IF_SUPPORTED(ParseAXEnum<T>("bogus"), "Check failed");
// Parse the empty string.
EXPECT_EQ(T::kNone, ParseAXEnum<T>(""));
// Convert a bogus value to a string. // Convert a bogus value to a string.
int out_of_range_value = static_cast<int>(T::kMaxValue) + 1; int out_of_range_value = static_cast<int>(T::kMaxValue) + 1;
...@@ -71,74 +74,72 @@ void TestAXNodeDataSetter(void (AXNodeData::*Setter)(T, U), U value) { ...@@ -71,74 +74,72 @@ void TestAXNodeDataSetter(void (AXNodeData::*Setter)(T, U), U value) {
} }
TEST(AXEnumUtilTest, Event) { TEST(AXEnumUtilTest, Event) {
TestEnumStringConversion<ax::mojom::Event>(ParseEvent); TestEnumStringConversion<ax::mojom::Event>();
} }
TEST(AXEnumUtilTest, Role) { TEST(AXEnumUtilTest, Role) {
TestEnumStringConversion<ax::mojom::Role>(ParseRole); TestEnumStringConversion<ax::mojom::Role>();
} }
TEST(AXEnumUtilTest, State) { TEST(AXEnumUtilTest, State) {
TestEnumStringConversion<ax::mojom::State>(ParseState); TestEnumStringConversion<ax::mojom::State>();
} }
TEST(AXEnumUtilTest, Action) { TEST(AXEnumUtilTest, Action) {
TestEnumStringConversion<ax::mojom::Action>(ParseAction); TestEnumStringConversion<ax::mojom::Action>();
} }
TEST(AXEnumUtilTest, ActionFlags) { TEST(AXEnumUtilTest, ActionFlags) {
TestEnumStringConversion<ax::mojom::ActionFlags>(ParseActionFlags); TestEnumStringConversion<ax::mojom::ActionFlags>();
} }
TEST(AXEnumUtilTest, DefaultActionVerb) { TEST(AXEnumUtilTest, DefaultActionVerb) {
TestEnumStringConversion<ax::mojom::DefaultActionVerb>( TestEnumStringConversion<ax::mojom::DefaultActionVerb>();
ParseDefaultActionVerb);
} }
TEST(AXEnumUtilTest, Mutation) { TEST(AXEnumUtilTest, Mutation) {
TestEnumStringConversion<ax::mojom::Mutation>(ParseMutation); TestEnumStringConversion<ax::mojom::Mutation>();
} }
TEST(AXEnumUtilTest, StringAttribute) { TEST(AXEnumUtilTest, StringAttribute) {
TestEnumStringConversion<ax::mojom::StringAttribute>(ParseStringAttribute); TestEnumStringConversion<ax::mojom::StringAttribute>();
TestAXNodeDataSetter<ax::mojom::StringAttribute>( TestAXNodeDataSetter<ax::mojom::StringAttribute>(
&AXNodeData::AddStringAttribute, std::string()); &AXNodeData::AddStringAttribute, std::string());
} }
TEST(AXEnumUtilTest, IntAttribute) { TEST(AXEnumUtilTest, IntAttribute) {
TestEnumStringConversion<ax::mojom::IntAttribute>(ParseIntAttribute); TestEnumStringConversion<ax::mojom::IntAttribute>();
TestAXNodeDataSetter<ax::mojom::IntAttribute>(&AXNodeData::AddIntAttribute, TestAXNodeDataSetter<ax::mojom::IntAttribute>(&AXNodeData::AddIntAttribute,
0); 0);
} }
TEST(AXEnumUtilTest, FloatAttribute) { TEST(AXEnumUtilTest, FloatAttribute) {
TestEnumStringConversion<ax::mojom::FloatAttribute>(ParseFloatAttribute); TestEnumStringConversion<ax::mojom::FloatAttribute>();
TestAXNodeDataSetter<ax::mojom::FloatAttribute>( TestAXNodeDataSetter<ax::mojom::FloatAttribute>(
&AXNodeData::AddFloatAttribute, 0.0f); &AXNodeData::AddFloatAttribute, 0.0f);
} }
TEST(AXEnumUtilTest, BoolAttribute) { TEST(AXEnumUtilTest, BoolAttribute) {
TestEnumStringConversion<ax::mojom::BoolAttribute>(ParseBoolAttribute); TestEnumStringConversion<ax::mojom::BoolAttribute>();
TestAXNodeDataSetter<ax::mojom::BoolAttribute>(&AXNodeData::AddBoolAttribute, TestAXNodeDataSetter<ax::mojom::BoolAttribute>(&AXNodeData::AddBoolAttribute,
false); false);
} }
TEST(AXEnumUtilTest, IntListAttribute) { TEST(AXEnumUtilTest, IntListAttribute) {
TestEnumStringConversion<ax::mojom::IntListAttribute>(ParseIntListAttribute); TestEnumStringConversion<ax::mojom::IntListAttribute>();
TestAXNodeDataSetter<ax::mojom::IntListAttribute>( TestAXNodeDataSetter<ax::mojom::IntListAttribute>(
&AXNodeData::AddIntListAttribute, std::vector<int32_t>()); &AXNodeData::AddIntListAttribute, std::vector<int32_t>());
} }
TEST(AXEnumUtilTest, StringListAttribute) { TEST(AXEnumUtilTest, StringListAttribute) {
TestEnumStringConversion<ax::mojom::StringListAttribute>( TestEnumStringConversion<ax::mojom::StringListAttribute>();
ParseStringListAttribute);
TestAXNodeDataSetter<ax::mojom::StringListAttribute>( TestAXNodeDataSetter<ax::mojom::StringListAttribute>(
&AXNodeData::AddStringListAttribute, std::vector<std::string>()); &AXNodeData::AddStringListAttribute, std::vector<std::string>());
} }
TEST(AXEnumUtilTest, MarkerType) { TEST(AXEnumUtilTest, MarkerType) {
TestEnumStringConversion<ax::mojom::MarkerType>( TestEnumStringConversion<ax::mojom::MarkerType>(
ParseMarkerType, [](int32_t val) { [](int32_t val) {
return val == 0 ? 1 : return val == 0 ? 1 :
// 8 (Composition) is // 8 (Composition) is
// explicitly skipped in // explicitly skipped in
...@@ -148,97 +149,95 @@ TEST(AXEnumUtilTest, MarkerType) { ...@@ -148,97 +149,95 @@ TEST(AXEnumUtilTest, MarkerType) {
} }
TEST(AXEnumUtilTest, Text_Decoration_Style) { TEST(AXEnumUtilTest, Text_Decoration_Style) {
TestEnumStringConversion<ax::mojom::TextDecorationStyle>( TestEnumStringConversion<ax::mojom::TextDecorationStyle>();
ParseTextDecorationStyle);
} }
TEST(AXEnumUtilTest, ListStyle) { TEST(AXEnumUtilTest, ListStyle) {
TestEnumStringConversion<ax::mojom::ListStyle>(ParseListStyle); TestEnumStringConversion<ax::mojom::ListStyle>();
} }
TEST(AXEnumUtilTest, MoveDirection) { TEST(AXEnumUtilTest, MoveDirection) {
TestEnumStringConversion<ax::mojom::MoveDirection>(ParseMoveDirection); TestEnumStringConversion<ax::mojom::MoveDirection>();
} }
TEST(AXEnumUtilTest, Command) { TEST(AXEnumUtilTest, Command) {
TestEnumStringConversion<ax::mojom::Command>(ParseCommand); TestEnumStringConversion<ax::mojom::Command>();
} }
TEST(AXEnumUtilTest, TextAlign) { TEST(AXEnumUtilTest, TextAlign) {
TestEnumStringConversion<ax::mojom::TextAlign>(ParseTextAlign); TestEnumStringConversion<ax::mojom::TextAlign>();
} }
TEST(AXEnumUtilTest, TextBoundary) { TEST(AXEnumUtilTest, TextBoundary) {
TestEnumStringConversion<ax::mojom::TextBoundary>(ParseTextBoundary); TestEnumStringConversion<ax::mojom::TextBoundary>();
} }
TEST(AXEnumUtilTest, TextDirection) { TEST(AXEnumUtilTest, TextDirection) {
TestEnumStringConversion<ax::mojom::WritingDirection>(ParseTextDirection); TestEnumStringConversion<ax::mojom::WritingDirection>();
} }
TEST(AXEnumUtilTest, TextPosition) { TEST(AXEnumUtilTest, TextPosition) {
TestEnumStringConversion<ax::mojom::TextPosition>(ParseTextPosition); TestEnumStringConversion<ax::mojom::TextPosition>();
} }
TEST(AXEnumUtilTest, TextStyle) { TEST(AXEnumUtilTest, TextStyle) {
TestEnumStringConversion<ax::mojom::TextStyle>(ParseTextStyle); TestEnumStringConversion<ax::mojom::TextStyle>();
} }
TEST(AXEnumUtilTest, AriaCurrentState) { TEST(AXEnumUtilTest, AriaCurrentState) {
TestEnumStringConversion<ax::mojom::AriaCurrentState>(ParseAriaCurrentState); TestEnumStringConversion<ax::mojom::AriaCurrentState>();
} }
TEST(AXEnumUtilTest, HasPopup) { TEST(AXEnumUtilTest, HasPopup) {
TestEnumStringConversion<ax::mojom::HasPopup>(ParseHasPopup); TestEnumStringConversion<ax::mojom::HasPopup>();
} }
TEST(AXEnumUtilTest, InvalidState) { TEST(AXEnumUtilTest, InvalidState) {
TestEnumStringConversion<ax::mojom::InvalidState>(ParseInvalidState); TestEnumStringConversion<ax::mojom::InvalidState>();
} }
TEST(AXEnumUtilTest, Restriction) { TEST(AXEnumUtilTest, Restriction) {
TestEnumStringConversion<ax::mojom::Restriction>(ParseRestriction); TestEnumStringConversion<ax::mojom::Restriction>();
} }
TEST(AXEnumUtilTest, CheckedState) { TEST(AXEnumUtilTest, CheckedState) {
TestEnumStringConversion<ax::mojom::CheckedState>(ParseCheckedState); TestEnumStringConversion<ax::mojom::CheckedState>();
} }
TEST(AXEnumUtilTest, SortDirection) { TEST(AXEnumUtilTest, SortDirection) {
TestEnumStringConversion<ax::mojom::SortDirection>(ParseSortDirection); TestEnumStringConversion<ax::mojom::SortDirection>();
} }
TEST(AXEnumUtilTest, NameFrom) { TEST(AXEnumUtilTest, NameFrom) {
TestEnumStringConversion<ax::mojom::NameFrom>(ParseNameFrom); TestEnumStringConversion<ax::mojom::NameFrom>();
} }
TEST(AXEnumUtilTest, DescriptionFrom) { TEST(AXEnumUtilTest, DescriptionFrom) {
TestEnumStringConversion<ax::mojom::DescriptionFrom>(ParseDescriptionFrom); TestEnumStringConversion<ax::mojom::DescriptionFrom>();
} }
TEST(AXEnumUtilTest, EventFrom) { TEST(AXEnumUtilTest, EventFrom) {
TestEnumStringConversion<ax::mojom::EventFrom>(ParseEventFrom); TestEnumStringConversion<ax::mojom::EventFrom>();
} }
TEST(AXEnumUtilTest, Gesture) { TEST(AXEnumUtilTest, Gesture) {
TestEnumStringConversion<ax::mojom::Gesture>(ParseGesture); TestEnumStringConversion<ax::mojom::Gesture>();
} }
TEST(AXEnumUtilTest, TextAffinity) { TEST(AXEnumUtilTest, TextAffinity) {
TestEnumStringConversion<ax::mojom::TextAffinity>(ParseTextAffinity); TestEnumStringConversion<ax::mojom::TextAffinity>();
} }
TEST(AXEnumUtilTest, TreeOrder) { TEST(AXEnumUtilTest, TreeOrder) {
TestEnumStringConversion<ax::mojom::TreeOrder>(ParseTreeOrder); TestEnumStringConversion<ax::mojom::TreeOrder>();
} }
TEST(AXEnumUtilTest, ImageAnnotationStatus) { TEST(AXEnumUtilTest, ImageAnnotationStatus) {
TestEnumStringConversion<ax::mojom::ImageAnnotationStatus>( TestEnumStringConversion<ax::mojom::ImageAnnotationStatus>();
ParseImageAnnotationStatus);
} }
TEST(AXEnumUtilTest, Dropeffect) { TEST(AXEnumUtilTest, Dropeffect) {
TestEnumStringConversion<ax::mojom::Dropeffect>(ParseDropeffect); TestEnumStringConversion<ax::mojom::Dropeffect>();
} }
} // namespace ui } // namespace ui
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