Commit 8a681dbb authored by Alexander Surkov's avatar Alexander Surkov Committed by Commit Bot

Encapsulate line indexes to cocoa nodes conversion logic into a separate class

Bug: 1100991
Change-Id: I4051534404e0160a6b4415c137c2537849b047e5
AX-Relnotes: n/a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2339207
Commit-Queue: Alexander Surkov <asurkov@igalia.com>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795667}
parent 84fa2e8f
...@@ -335,6 +335,8 @@ source_set("browser") { ...@@ -335,6 +335,8 @@ source_set("browser") {
"accessibility/accessibility_tree_formatter_stub.cc", "accessibility/accessibility_tree_formatter_stub.cc",
"accessibility/accessibility_tree_formatter_uia_win.cc", "accessibility/accessibility_tree_formatter_uia_win.cc",
"accessibility/accessibility_tree_formatter_uia_win.h", "accessibility/accessibility_tree_formatter_uia_win.h",
"accessibility/accessibility_tree_formatter_utils_mac.h",
"accessibility/accessibility_tree_formatter_utils_mac.mm",
"accessibility/accessibility_tree_formatter_utils_win.cc", "accessibility/accessibility_tree_formatter_utils_win.cc",
"accessibility/accessibility_tree_formatter_utils_win.h", "accessibility/accessibility_tree_formatter_utils_win.h",
"accessibility/accessibility_tree_formatter_win.cc", "accessibility/accessibility_tree_formatter_win.cc",
......
...@@ -4,17 +4,14 @@ ...@@ -4,17 +4,14 @@
#include "content/browser/accessibility/accessibility_tree_formatter_base.h" #include "content/browser/accessibility/accessibility_tree_formatter_base.h"
#import <Cocoa/Cocoa.h>
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/json/json_writer.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/values.h" #include "base/values.h"
#include "content/browser/accessibility/accessibility_tree_formatter_blink.h" #include "content/browser/accessibility/accessibility_tree_formatter_blink.h"
#include "content/browser/accessibility/browser_accessibility_cocoa.h" #include "content/browser/accessibility/accessibility_tree_formatter_utils_mac.h"
#include "content/browser/accessibility/browser_accessibility_mac.h" #include "content/browser/accessibility/browser_accessibility_mac.h"
#include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/browser_accessibility_manager.h"
...@@ -27,6 +24,7 @@ using base::StringPrintf; ...@@ -27,6 +24,7 @@ using base::StringPrintf;
using base::SysNSStringToUTF8; using base::SysNSStringToUTF8;
using base::SysNSStringToUTF16; using base::SysNSStringToUTF16;
using std::string; using std::string;
using content::a11y::LineIndexesMap;
namespace content { namespace content {
...@@ -95,15 +93,9 @@ class AccessibilityTreeFormatterMac : public AccessibilityTreeFormatterBase { ...@@ -95,15 +93,9 @@ class AccessibilityTreeFormatterMac : public AccessibilityTreeFormatterBase {
const base::StringPiece& pattern) override; const base::StringPiece& pattern) override;
private: private:
using LineIndexesMap =
std::map<const gfx::NativeViewAccessible, base::string16>;
void RecursiveBuildAccessibilityTree(const BrowserAccessibilityCocoa* node, void RecursiveBuildAccessibilityTree(const BrowserAccessibilityCocoa* node,
const LineIndexesMap& line_indexes_map, const LineIndexesMap& line_indexes_map,
base::DictionaryValue* dict); base::DictionaryValue* dict);
void RecursiveBuildLineIndexesMap(const BrowserAccessibilityCocoa* node,
LineIndexesMap* line_indexes_map,
int* counter);
base::FilePath::StringType GetExpectedFileSuffix() override; base::FilePath::StringType GetExpectedFileSuffix() override;
const std::string GetAllowEmptyString() override; const std::string GetAllowEmptyString() override;
...@@ -164,9 +156,6 @@ class AccessibilityTreeFormatterMac : public AccessibilityTreeFormatterBase { ...@@ -164,9 +156,6 @@ class AccessibilityTreeFormatterMac : public AccessibilityTreeFormatterBase {
const LineIndexesMap& line_indexes_map) const; const LineIndexesMap& line_indexes_map) const;
std::string NodeToLineIndex(id, const LineIndexesMap&) const; std::string NodeToLineIndex(id, const LineIndexesMap&) const;
gfx::NativeViewAccessible LineIndexToNode(
const base::string16 line_index,
const LineIndexesMap& line_indexes_map) const;
base::string16 ProcessTreeForOutput( base::string16 ProcessTreeForOutput(
const base::DictionaryValue& node, const base::DictionaryValue& node,
...@@ -217,9 +206,7 @@ AccessibilityTreeFormatterMac::BuildAccessibilityTree( ...@@ -217,9 +206,7 @@ AccessibilityTreeFormatterMac::BuildAccessibilityTree(
BrowserAccessibilityCocoa* cocoa_root = ToBrowserAccessibilityCocoa(root); BrowserAccessibilityCocoa* cocoa_root = ToBrowserAccessibilityCocoa(root);
int counter = 0; LineIndexesMap line_indexes_map(cocoa_root);
LineIndexesMap line_indexes_map;
RecursiveBuildLineIndexesMap(cocoa_root, &line_indexes_map, &counter);
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
RecursiveBuildAccessibilityTree(cocoa_root, line_indexes_map, dict.get()); RecursiveBuildAccessibilityTree(cocoa_root, line_indexes_map, dict.get());
...@@ -264,18 +251,6 @@ void AccessibilityTreeFormatterMac::RecursiveBuildAccessibilityTree( ...@@ -264,18 +251,6 @@ void AccessibilityTreeFormatterMac::RecursiveBuildAccessibilityTree(
dict->Set(kChildrenDictAttr, std::move(children)); dict->Set(kChildrenDictAttr, std::move(children));
} }
void AccessibilityTreeFormatterMac::RecursiveBuildLineIndexesMap(
const BrowserAccessibilityCocoa* cocoa_node,
LineIndexesMap* line_indexes_map,
int* counter) {
const base::string16 line_index =
base::string16(1, ':') + base::NumberToString16(++(*counter));
line_indexes_map->insert({cocoa_node, line_index});
for (BrowserAccessibilityCocoa* cocoa_child in [cocoa_node children]) {
RecursiveBuildLineIndexesMap(cocoa_child, line_indexes_map, counter);
}
}
void AccessibilityTreeFormatterMac::AddProperties( void AccessibilityTreeFormatterMac::AddProperties(
const BrowserAccessibilityCocoa* cocoa_node, const BrowserAccessibilityCocoa* cocoa_node,
const LineIndexesMap& line_indexes_map, const LineIndexesMap& line_indexes_map,
...@@ -284,10 +259,8 @@ void AccessibilityTreeFormatterMac::AddProperties( ...@@ -284,10 +259,8 @@ void AccessibilityTreeFormatterMac::AddProperties(
BrowserAccessibility* node = [cocoa_node owner]; BrowserAccessibility* node = [cocoa_node owner];
dict->SetKey("id", base::Value(base::NumberToString16(node->GetId()))); dict->SetKey("id", base::Value(base::NumberToString16(node->GetId())));
base::string16 line_index = base::ASCIIToUTF16("-1"); base::string16 line_index =
if (line_indexes_map.find(cocoa_node) != line_indexes_map.end()) { base::UTF8ToUTF16(line_indexes_map.IndexBy(cocoa_node));
line_index = line_indexes_map.at(cocoa_node);
}
// Attributes // Attributes
for (NSString* supportedAttribute in for (NSString* supportedAttribute in
...@@ -426,8 +399,8 @@ AccessibilityTreeFormatterMac::PropertyNodeToUIElement( ...@@ -426,8 +399,8 @@ AccessibilityTreeFormatterMac::PropertyNodeToUIElement(
UIELEMENT_FAIL(propnode, "single argument is expected") UIELEMENT_FAIL(propnode, "single argument is expected")
} }
gfx::NativeViewAccessible uielement = gfx::NativeViewAccessible uielement = line_indexes_map.NodeBy(
LineIndexToNode(propnode.parameters[0].name_or_value, line_indexes_map); base::UTF16ToUTF8(propnode.parameters[0].name_or_value));
if (!uielement) { if (!uielement) {
UIELEMENT_FAIL(propnode, "no corresponding UIElement was found in the tree") UIELEMENT_FAIL(propnode, "no corresponding UIElement was found in the tree")
} }
...@@ -444,8 +417,8 @@ id AccessibilityTreeFormatterMac::DictNodeToTextMarker( ...@@ -444,8 +417,8 @@ id AccessibilityTreeFormatterMac::DictNodeToTextMarker(
TEXTMARKER_FAIL(dictnode, "wrong number of dictionary elements") TEXTMARKER_FAIL(dictnode, "wrong number of dictionary elements")
} }
BrowserAccessibilityCocoa* anchor_cocoa = BrowserAccessibilityCocoa* anchor_cocoa = line_indexes_map.NodeBy(
LineIndexToNode(dictnode.parameters[0].name_or_value, line_indexes_map); base::UTF16ToUTF8(dictnode.parameters[0].name_or_value));
if (!anchor_cocoa) { if (!anchor_cocoa) {
TEXTMARKER_FAIL(dictnode, "1st argument: wrong anchor") TEXTMARKER_FAIL(dictnode, "1st argument: wrong anchor")
} }
...@@ -664,24 +637,7 @@ base::Value AccessibilityTreeFormatterMac::PopulateArray( ...@@ -664,24 +637,7 @@ base::Value AccessibilityTreeFormatterMac::PopulateArray(
std::string AccessibilityTreeFormatterMac::NodeToLineIndex( std::string AccessibilityTreeFormatterMac::NodeToLineIndex(
id cocoa_node, id cocoa_node,
const LineIndexesMap& line_indexes_map) const { const LineIndexesMap& line_indexes_map) const {
std::string line_index = ":unknown"; return kConstValuePrefix + line_indexes_map.IndexBy(cocoa_node);
auto index_iterator = line_indexes_map.find(cocoa_node);
if (index_iterator != line_indexes_map.end()) {
line_index = base::UTF16ToUTF8(index_iterator->second);
}
return kConstValuePrefix + line_index;
}
gfx::NativeViewAccessible AccessibilityTreeFormatterMac::LineIndexToNode(
const base::string16 line_index,
const LineIndexesMap& line_indexes_map) const {
for (std::pair<const gfx::NativeViewAccessible, base::string16> item :
line_indexes_map) {
if (item.second == line_index) {
return item.first;
}
}
return nil;
} }
base::string16 AccessibilityTreeFormatterMac::ProcessTreeForOutput( base::string16 AccessibilityTreeFormatterMac::ProcessTreeForOutput(
......
// Copyright 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.
#ifndef CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_UTILS_MAC_H_
#define CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_UTILS_MAC_H_
#include "content/browser/accessibility/browser_accessibility_cocoa.h"
namespace content {
namespace a11y {
/**
* Converts cocoa node object to a line index in the formatted accessibility
* tree, the node is placed at, and vice versa.
*/
class LineIndexesMap {
public:
LineIndexesMap(const BrowserAccessibilityCocoa* cocoa_node);
~LineIndexesMap();
std::string IndexBy(const BrowserAccessibilityCocoa* cocoa_node) const;
gfx::NativeViewAccessible NodeBy(const std::string& index) const;
private:
void Build(const BrowserAccessibilityCocoa* cocoa_node, int* counter);
std::map<const gfx::NativeViewAccessible, std::string> map;
};
} // namespace a11y
} // namespace content
#endif
// Copyright 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/accessibility_tree_formatter_utils_mac.h"
namespace content {
namespace a11y {
LineIndexesMap::LineIndexesMap(const BrowserAccessibilityCocoa* cocoa_node) {
int counter = 0;
Build(cocoa_node, &counter);
}
LineIndexesMap::~LineIndexesMap() {}
std::string LineIndexesMap::IndexBy(
const BrowserAccessibilityCocoa* cocoa_node) const {
std::string line_index = ":unknown";
if (map.find(cocoa_node) != map.end()) {
line_index = map.at(cocoa_node);
}
return line_index;
}
gfx::NativeViewAccessible LineIndexesMap::NodeBy(
const std::string& line_index) const {
for (std::pair<const gfx::NativeViewAccessible, std::string> item : map) {
if (item.second == line_index) {
return item.first;
}
}
return nil;
}
void LineIndexesMap::Build(const BrowserAccessibilityCocoa* cocoa_node,
int* counter) {
const std::string line_index =
std::string(1, ':') + base::NumberToString(++(*counter));
map.insert({cocoa_node, line_index});
for (BrowserAccessibilityCocoa* cocoa_child in [cocoa_node children]) {
Build(cocoa_child, counter);
}
}
} // namespace a11y
} // namespace content
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