Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
ax_platform_node_delegate.h
Go to the documentation of this file.
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_H_
6#define UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_H_
7
8#include <cstdint>
9#include <map>
10#include <memory>
11#include <new>
12#include <ostream>
13#include <set>
14#include <string>
15#include <utility>
16#include <vector>
17
20#include "ax/ax_enums.h"
21#include "ax/ax_export.h"
22#include "ax/ax_node_position.h"
24#include "ax/ax_position.h"
25#include "ax/ax_tree.h"
26#include "ax/ax_tree_id.h"
27#include "ax_unique_id.h"
28#include "base/macros.h"
29#include "gfx/geometry/rect.h"
31
32namespace ui {
33
34struct AXActionData;
35struct AXNodeData;
36struct AXTreeData;
37class AXPlatformNode;
38
39using TextAttribute = std::pair<std::string, std::string>;
40using TextAttributeList = std::vector<TextAttribute>;
41
42// A TextAttributeMap is a map between the text offset in UTF-16 characters in
43// the node hypertext and the TextAttributeList that starts at that location.
44// An empty TextAttributeList signifies a return to the default node
45// TextAttributeList.
46using TextAttributeMap = std::map<int, TextAttributeList>;
47
48// An object that wants to be accessible should derive from this class.
49// AXPlatformNode subclasses use this interface to query all of the information
50// about the object in order to implement native accessibility APIs.
51//
52// Note that AXPlatformNode has support for accessibility trees where some
53// of the objects in the tree are not implemented using AXPlatformNode.
54// For example, you may have a native window with platform-native widgets
55// in it, but in that window you have custom controls that use AXPlatformNode
56// to provide accessibility. That's why GetParent, ChildAtIndex, HitTestSync,
57// and GetFocus all return a gfx::NativeViewAccessible - so you can return a
58// native accessible if necessary, and AXPlatformNode::GetNativeViewAccessible
59// otherwise.
61 public:
62 virtual ~AXPlatformNodeDelegate() = default;
63
64 virtual bool IsIAccessibleExEnabled() { return false; }
65
66 // Get the accessibility data that should be exposed for this node.
67 // Virtually all of the information is obtained from this structure
68 // (role, state, name, cursor position, etc.) - the rest of this interface
69 // is mostly to implement support for walking the accessibility tree.
70 virtual const AXNodeData& GetData() const = 0;
71
72 // Get the accessibility tree data for this node.
73 virtual const AXTreeData& GetTreeData() const = 0;
74
75 // Returns the text of this node and all descendant nodes; including text
76 // found in embedded objects.
77 //
78 // Only text displayed on screen is included. Text from ARIA and HTML
79 // attributes that is either not displayed on screen, or outside this node,
80 // e.g. aria-label and HTML title, is not returned.
81 virtual std::u16string GetInnerText() const = 0;
82
83 // Get the unignored selection from the tree
84 virtual const AXTree::Selection GetUnignoredSelection() const = 0;
85
86 // Creates a text position rooted at this object.
88 int offset) const = 0;
89
90 // Get the accessibility node for the NSWindow the node is contained in. This
91 // method is only meaningful on macOS.
93
94 // Get the node for this delegate, which may be an AXPlatformNode or it may
95 // be a native accessible object implemented by another class.
97
98 // Get the parent of the node, which may be an AXPlatformNode or it may
99 // be a native accessible object implemented by another class.
101
102 // Get the index in parent. Typically this is the AXNode's index_in_parent_.
103 // This should return -1 if the index in parent is unknown.
104 virtual int GetIndexInParent() = 0;
105
106 // Get the number of children of this node.
107 virtual int GetChildCount() const = 0;
108
109 // Get the child of a node given a 0-based index.
111
112 // Returns true if it has a modal dialog.
113 virtual bool HasModalDialog() const = 0;
114
115 // Gets the first child of a node, or nullptr if no children exist.
117
118 // Gets the last child of a node, or nullptr if no children exist.
120
121 // Gets the next sibling of a given node, or nullptr if no such node exists.
123
124 // Gets the previous sibling of a given node, or nullptr if no such node
125 // exists.
127
128 // Returns true if an ancestor of this node (not including itself) is a
129 // leaf node, meaning that this node is not actually exposed to any
130 // platform's accessibility layer.
131 virtual bool IsChildOfLeaf() const = 0;
132
133 // Returns true if this current node is editable and the root editable node is
134 // a plain text field.
135 virtual bool IsChildOfPlainTextField() const = 0;
136
137 // Returns true if this is a leaf node, meaning all its
138 // children should not be exposed to any platform's native accessibility
139 // layer.
140 virtual bool IsLeaf() const = 0;
141
142 // Returns true if this is a top-level browser window that doesn't have a
143 // parent accessible node, or its parent is the application accessible node on
144 // platforms that have one.
145 virtual bool IsToplevelBrowserWindow() = 0;
146
147 // If this object is exposed to the platform's accessibility layer, returns
148 // this object. Otherwise, returns the platform leaf under which this object
149 // is found.
151
153 public:
154 virtual ~ChildIterator() = default;
155 virtual bool operator==(const ChildIterator& rhs) const = 0;
156 virtual bool operator!=(const ChildIterator& rhs) const = 0;
157 virtual void operator++() = 0;
158 virtual void operator++(int) = 0;
159 virtual void operator--() = 0;
160 virtual void operator--(int) = 0;
162 virtual int GetIndexInParent() const = 0;
163 virtual AXPlatformNodeDelegate& operator*() const = 0;
164 virtual AXPlatformNodeDelegate* operator->() const = 0;
165 };
166 virtual std::unique_ptr<AXPlatformNodeDelegate::ChildIterator>
168 virtual std::unique_ptr<AXPlatformNodeDelegate::ChildIterator>
170
171 // Returns the accessible name for the node.
172 virtual std::string GetName() const = 0;
173
174 // Returns the text of this node and represent the text of descendant nodes
175 // with a special character in place of every embedded object. This represents
176 // the concept of text in ATK and IA2 APIs.
177 virtual std::u16string GetHypertext() const = 0;
178
179 // Set the selection in the hypertext of this node. Depending on the
180 // implementation, this may mean the new selection will span multiple nodes.
181 virtual bool SetHypertextSelection(int start_offset, int end_offset) = 0;
182
183 // Compute the text attributes map for the node associated with this
184 // delegate, given a set of default text attributes that apply to the entire
185 // node. A text attribute map associates a list of text attributes with a
186 // given hypertext offset in this node.
188 const TextAttributeList& default_attributes) const = 0;
189
190 // Get the inherited font family name for text attributes. We need this
191 // because inheritance works differently between the different delegate
192 // implementations.
193 virtual std::string GetInheritedFontFamilyName() const = 0;
194
195 // Return the bounds of this node in the coordinate system indicated. If the
196 // clipping behavior is set to clipped, clipping is applied. If an offscreen
197 // result address is provided, it will be populated depending on whether the
198 // returned bounding box is onscreen or offscreen.
200 const AXCoordinateSystem coordinate_system,
201 const AXClippingBehavior clipping_behavior,
202 AXOffscreenResult* offscreen_result = nullptr) const = 0;
203
205 AXOffscreenResult* offscreen_result = nullptr) const = 0;
206
207 // Return the bounds of the text range given by text offsets relative to
208 // GetHypertext in the coordinate system indicated. If the clipping behavior
209 // is set to clipped, clipping is applied. If an offscreen result address is
210 // provided, it will be populated depending on whether the returned bounding
211 // box is onscreen or offscreen.
213 const int start_offset,
214 const int end_offset,
215 const AXCoordinateSystem coordinate_system,
216 const AXClippingBehavior clipping_behavior,
217 AXOffscreenResult* offscreen_result = nullptr) const = 0;
218
219 // Return the bounds of the text range given by text offsets relative to
220 // GetInnerText in the coordinate system indicated. If the clipping behavior
221 // is set to clipped, clipping is applied. If an offscreen result address is
222 // provided, it will be populated depending on whether the returned bounding
223 // box is onscreen or offscreen.
225 const int start_offset,
226 const int end_offset,
227 const AXCoordinateSystem coordinate_system,
228 const AXClippingBehavior clipping_behavior,
229 AXOffscreenResult* offscreen_result = nullptr) const = 0;
230
231 // Do a *synchronous* hit test of the given location in global screen physical
232 // pixel coordinates, and the node within this node's subtree (inclusive)
233 // that's hit, if any.
234 //
235 // If the result is anything other than this object or NULL, it will be
236 // hit tested again recursively - that allows hit testing to work across
237 // implementation classes. It's okay to take advantage of this and return
238 // only an immediate child and not the deepest descendant.
239 //
240 // This function is mainly used by accessibility debugging software.
241 // Platforms with touch accessibility use a different asynchronous interface.
243 int screen_physical_pixel_x,
244 int screen_physical_pixel_y) const = 0;
245
246 // Return the node within this node's subtree (inclusive) that currently has
247 // focus, or return nullptr if this subtree is not connected to the top
248 // document through its ancestry chain.
250
251 // Get whether this node is offscreen.
252 virtual bool IsOffscreen() const = 0;
253
254 // Get whether this node is a minimized window.
255 virtual bool IsMinimized() const = 0;
256
257 // See AXNode::IsText().
258 virtual bool IsText() const = 0;
259
260 // Get whether this node is in web content.
261 virtual bool IsWebContent() const = 0;
262
263 // Returns true if the caret or selection is visible on this object.
264 virtual bool HasVisibleCaretOrSelection() const = 0;
265
266 // Get another node from this same tree.
267 virtual AXPlatformNode* GetFromNodeID(int32_t id) = 0;
268
269 // Get a node from a different tree using a tree ID and node ID.
270 // Note that this is only guaranteed to work if the other tree is of the
271 // same type, i.e. it won't work between web and views or vice-versa.
273 int32_t id) = 0;
274
275 // Given a node ID attribute (one where IsNodeIdIntAttribute is true), return
276 // a target nodes for which this delegate's node has that relationship
277 // attribute or NULL if there is no such relationship.
279 ax::mojom::IntAttribute attr) = 0;
280
281 // Given a node ID attribute (one where IsNodeIdIntListAttribute is true),
282 // return a vector of all target nodes for which this delegate's node has that
283 // relationship attribute.
284 virtual std::vector<AXPlatformNode*> GetTargetNodesForRelation(
286
287 // Given a node ID attribute (one where IsNodeIdIntAttribute is true), return
288 // a set of all source nodes that have that relationship attribute between
289 // them and this delegate's node.
290 virtual std::set<AXPlatformNode*> GetReverseRelations(
291 ax::mojom::IntAttribute attr) = 0;
292
293 // Given a node ID list attribute (one where IsNodeIdIntListAttribute is
294 // true), return a set of all source nodes that have that relationship
295 // attribute between them and this delegate's node.
296 virtual std::set<AXPlatformNode*> GetReverseRelations(
298
299 // Return the string representation of the unique ID assigned by the author,
300 // otherwise return an empty string. The author ID must be persistent across
301 // any instance of the application, regardless of locale. The author ID should
302 // be unique among sibling accessibility nodes and is best if unique across
303 // the application, however, not meeting this requirement is non-fatal.
304 virtual std::u16string GetAuthorUniqueId() const = 0;
305
306 virtual const AXUniqueId& GetUniqueId() const = 0;
307
308 // Finds the previous or next offset from the provided offset, that matches
309 // the provided boundary type.
310 //
311 // This method finds text boundaries in the text used for platform text APIs.
312 // Implementations may use side-channel data such as line or word indices to
313 // produce appropriate results. It may optionally return no value, indicating
314 // that the delegate does not have all the information required to calculate
315 // this value and it is the responsibility of the AXPlatformNode itself to
316 // calculate it.
317 virtual std::optional<int> FindTextBoundary(
319 int offset,
320 ax::mojom::MoveDirection direction,
321 ax::mojom::TextAffinity affinity) const = 0;
322
323 // Return a vector of all the descendants of this delegate's node. This method
324 // is only meaningful for Windows UIA.
325 virtual const std::vector<gfx::NativeViewAccessible> GetUIADescendants()
326 const = 0;
327
328 // Return a string representing the language code.
329 //
330 // For web content, this will consider the language declared in the DOM, and
331 // may eventually attempt to automatically detect the language from the text.
332 //
333 // This language code will be BCP 47.
334 //
335 // Returns empty string if no appropriate language was found or if this node
336 // uses the default interface language.
337 virtual std::string GetLanguage() const = 0;
338
339 //
340 // Tables. All of these should be called on a node that's a table-like
341 // role, otherwise they return nullopt.
342 //
343 virtual bool IsTable() const = 0;
344 virtual std::optional<int> GetTableColCount() const = 0;
345 virtual std::optional<int> GetTableRowCount() const = 0;
346 virtual std::optional<int> GetTableAriaColCount() const = 0;
347 virtual std::optional<int> GetTableAriaRowCount() const = 0;
348 virtual std::optional<int> GetTableCellCount() const = 0;
349 virtual std::optional<bool> GetTableHasColumnOrRowHeaderNode() const = 0;
350 virtual std::vector<int32_t> GetColHeaderNodeIds() const = 0;
351 virtual std::vector<int32_t> GetColHeaderNodeIds(int col_index) const = 0;
352 virtual std::vector<int32_t> GetRowHeaderNodeIds() const = 0;
353 virtual std::vector<int32_t> GetRowHeaderNodeIds(int row_index) const = 0;
354 virtual AXPlatformNode* GetTableCaption() const = 0;
355
356 // Table row-like nodes.
357 virtual bool IsTableRow() const = 0;
358 virtual std::optional<int> GetTableRowRowIndex() const = 0;
359
360 // Table cell-like nodes.
361 virtual bool IsTableCellOrHeader() const = 0;
362 virtual std::optional<int> GetTableCellIndex() const = 0;
363 virtual std::optional<int> GetTableCellColIndex() const = 0;
364 virtual std::optional<int> GetTableCellRowIndex() const = 0;
365 virtual std::optional<int> GetTableCellColSpan() const = 0;
366 virtual std::optional<int> GetTableCellRowSpan() const = 0;
367 virtual std::optional<int> GetTableCellAriaColIndex() const = 0;
368 virtual std::optional<int> GetTableCellAriaRowIndex() const = 0;
369 virtual std::optional<int32_t> GetCellId(int row_index,
370 int col_index) const = 0;
371 virtual std::optional<int32_t> CellIndexToId(int cell_index) const = 0;
372
373 // Helper methods to check if a cell is an ARIA-1.1+ 'cell' or 'gridcell'
374 virtual bool IsCellOrHeaderOfARIATable() const = 0;
375 virtual bool IsCellOrHeaderOfARIAGrid() const = 0;
376
377 // Ordered-set-like and item-like nodes.
378 virtual bool IsOrderedSetItem() const = 0;
379 virtual bool IsOrderedSet() const = 0;
380 virtual std::optional<int> GetPosInSet() const = 0;
381 virtual std::optional<int> GetSetSize() const = 0;
382
383 //
384 // Events.
385 //
386
387 // Return the platform-native GUI object that should be used as a target
388 // for accessibility events.
389 virtual gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() = 0;
390
391 //
392 // Actions.
393 //
394
395 // Perform an accessibility action, switching on the ax::mojom::Action
396 // provided in |data|.
397 virtual bool AccessibilityPerformAction(const AXActionData& data) = 0;
398
399 //
400 // Localized strings.
401 //
402
404 const = 0;
406 ax::mojom::ImageAnnotationStatus status) const = 0;
407 virtual std::u16string GetLocalizedStringForLandmarkType() const = 0;
408 virtual std::u16string GetLocalizedStringForRoleDescription() const = 0;
409 virtual std::u16string GetStyleNameAttributeAsLocalizedString() const = 0;
410
411 //
412 // Testing.
413 //
414
415 // Accessibility objects can have the "hot tracked" state set when
416 // the mouse is hovering over them, but this makes tests flaky because
417 // the test behaves differently when the mouse happens to be over an
418 // element. The default value should be false if not in testing mode.
420
421 // If this object is exposed to the platform's accessibility layer, returns
422 // this object. Otherwise, returns the platform leaf or lowest unignored
423 // ancestor under which this object is found.
424 //
425 // (An ignored node means that the node should not be exposed to platform
426 // APIs: See `IsIgnored`.)
428
429 // Creates a string representation of this delegate's data.
430 std::string ToString() { return GetData().ToString(); }
431
432 // Returns a string representation of the subtree of delegates rooted at this
433 // delegate.
434 std::string SubtreeToString() { return SubtreeToStringHelper(0u); }
435
436 friend std::ostream& operator<<(std::ostream& stream,
437 AXPlatformNodeDelegate& delegate) {
438 return stream << delegate.ToString();
439 }
440
441 protected:
443
444 virtual std::string SubtreeToStringHelper(size_t level) = 0;
445
446 private:
448};
449
450} // namespace ui
451
452#endif // UI_ACCESSIBILITY_PLATFORM_AX_PLATFORM_NODE_DELEGATE_H_
#define AX_EXPORT
Definition ax_export.h:29
virtual AXPlatformNodeDelegate * operator->() const =0
virtual gfx::NativeViewAccessible GetNativeViewAccessible() const =0
virtual bool operator!=(const ChildIterator &rhs) const =0
virtual AXPlatformNodeDelegate & operator*() const =0
virtual bool operator==(const ChildIterator &rhs) const =0
virtual gfx::NativeViewAccessible GetFocus()=0
virtual gfx::NativeViewAccessible GetLastChild()=0
virtual bool IsOrderedSetItem() const =0
virtual std::optional< int > GetTableCellRowSpan() const =0
virtual bool IsCellOrHeaderOfARIAGrid() const =0
virtual std::u16string GetInnerText() const =0
virtual gfx::Rect GetHypertextRangeBoundsRect(const int start_offset, const int end_offset, const AXCoordinateSystem coordinate_system, const AXClippingBehavior clipping_behavior, AXOffscreenResult *offscreen_result=nullptr) const =0
virtual std::optional< int > GetTableRowCount() const =0
virtual const std::vector< gfx::NativeViewAccessible > GetUIADescendants() const =0
virtual gfx::NativeViewAccessible HitTestSync(int screen_physical_pixel_x, int screen_physical_pixel_y) const =0
virtual std::optional< int32_t > GetCellId(int row_index, int col_index) const =0
virtual std::optional< int > FindTextBoundary(ax::mojom::TextBoundary boundary, int offset, ax::mojom::MoveDirection direction, ax::mojom::TextAffinity affinity) const =0
virtual bool IsTable() const =0
virtual std::vector< int32_t > GetRowHeaderNodeIds() const =0
virtual std::optional< int > GetTableCellIndex() const =0
virtual std::optional< int > GetTableCellAriaColIndex() const =0
virtual std::unique_ptr< AXPlatformNodeDelegate::ChildIterator > ChildrenEnd()=0
virtual std::vector< AXPlatformNode * > GetTargetNodesForRelation(ax::mojom::IntListAttribute attr)=0
virtual int GetIndexInParent()=0
virtual std::u16string GetAuthorUniqueId() const =0
friend std::ostream & operator<<(std::ostream &stream, AXPlatformNodeDelegate &delegate)
virtual std::optional< int > GetTableCellCount() const =0
virtual AXPlatformNode * GetTableCaption() const =0
virtual gfx::NativeViewAccessible GetNextSibling()=0
virtual gfx::NativeViewAccessible GetNativeViewAccessible()=0
virtual std::string GetName() const =0
virtual std::optional< int > GetSetSize() const =0
virtual const AXUniqueId & GetUniqueId() const =0
virtual bool IsChildOfPlainTextField() const =0
virtual std::optional< int > GetTableCellAriaRowIndex() const =0
virtual const AXTree::Selection GetUnignoredSelection() const =0
virtual gfx::NativeViewAccessible GetPreviousSibling()=0
virtual std::vector< int32_t > GetColHeaderNodeIds(int col_index) const =0
virtual std::u16string GetLocalizedStringForRoleDescription() const =0
virtual bool IsOrderedSet() const =0
virtual std::u16string GetLocalizedRoleDescriptionForUnlabeledImage() const =0
virtual AXPlatformNode * GetTargetNodeForRelation(ax::mojom::IntAttribute attr)=0
virtual AXPlatformNode * GetFromNodeID(int32_t id)=0
virtual bool AccessibilityPerformAction(const AXActionData &data)=0
virtual std::optional< int > GetTableCellRowIndex() const =0
virtual const AXNodeData & GetData() const =0
virtual bool IsToplevelBrowserWindow()=0
virtual std::unique_ptr< AXPlatformNodeDelegate::ChildIterator > ChildrenBegin()=0
virtual std::optional< int > GetTableColCount() const =0
virtual bool IsLeaf() const =0
virtual std::optional< int > GetPosInSet() const =0
virtual gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent()=0
virtual bool ShouldIgnoreHoveredStateForTesting()=0
virtual std::string GetInheritedFontFamilyName() const =0
virtual std::string GetLanguage() const =0
virtual std::u16string GetHypertext() const =0
virtual bool IsTableCellOrHeader() const =0
virtual gfx::Rect GetBoundsRect(const AXCoordinateSystem coordinate_system, const AXClippingBehavior clipping_behavior, AXOffscreenResult *offscreen_result=nullptr) const =0
virtual std::optional< int > GetTableRowRowIndex() const =0
virtual TextAttributeMap ComputeTextAttributeMap(const TextAttributeList &default_attributes) const =0
virtual bool IsTableRow() const =0
virtual std::optional< int > GetTableAriaColCount() const =0
virtual std::optional< int > GetTableCellColIndex() const =0
virtual bool IsCellOrHeaderOfARIATable() const =0
virtual gfx::Rect GetClippedScreenBoundsRect(AXOffscreenResult *offscreen_result=nullptr) const =0
virtual ~AXPlatformNodeDelegate()=default
virtual bool IsMinimized() const =0
virtual std::optional< int > GetTableCellColSpan() const =0
virtual gfx::NativeViewAccessible GetFirstChild()=0
virtual std::u16string GetLocalizedStringForLandmarkType() const =0
virtual bool IsText() const =0
virtual std::optional< bool > GetTableHasColumnOrRowHeaderNode() const =0
virtual std::set< AXPlatformNode * > GetReverseRelations(ax::mojom::IntListAttribute attr)=0
virtual std::u16string GetStyleNameAttributeAsLocalizedString() const =0
virtual AXPlatformNode * GetFromTreeIDAndNodeID(const ui::AXTreeID &ax_tree_id, int32_t id)=0
virtual gfx::NativeViewAccessible GetLowestPlatformAncestor() const =0
virtual std::string SubtreeToStringHelper(size_t level)=0
virtual std::vector< int32_t > GetRowHeaderNodeIds(int row_index) const =0
virtual bool HasVisibleCaretOrSelection() const =0
virtual bool HasModalDialog() const =0
virtual gfx::NativeViewAccessible GetClosestPlatformObject() const =0
virtual const AXTreeData & GetTreeData() const =0
virtual gfx::NativeViewAccessible ChildAtIndex(int index)=0
virtual std::vector< int32_t > GetColHeaderNodeIds() const =0
virtual bool IsWebContent() const =0
virtual std::set< AXPlatformNode * > GetReverseRelations(ax::mojom::IntAttribute attr)=0
virtual std::u16string GetLocalizedStringForImageAnnotationStatus(ax::mojom::ImageAnnotationStatus status) const =0
virtual bool IsChildOfLeaf() const =0
virtual std::optional< int > GetTableAriaRowCount() const =0
virtual bool IsOffscreen() const =0
virtual gfx::Rect GetInnerTextRangeBoundsRect(const int start_offset, const int end_offset, const AXCoordinateSystem coordinate_system, const AXClippingBehavior clipping_behavior, AXOffscreenResult *offscreen_result=nullptr) const =0
virtual int GetChildCount() const =0
virtual bool SetHypertextSelection(int start_offset, int end_offset)=0
virtual AXNodePosition::AXPositionInstance CreateTextPositionAt(int offset) const =0
virtual std::optional< int32_t > CellIndexToId(int cell_index) const =0
virtual gfx::NativeViewAccessible GetNSWindow()=0
virtual gfx::NativeViewAccessible GetParent()=0
std::unique_ptr< AXPosition< AXNodePosition, AXNode > > AXPositionInstance
ImageAnnotationStatus
Definition ax_enums.h:1171
UnimplementedNativeViewAccessible * NativeViewAccessible
std::pair< std::string, std::string > TextAttribute
std::vector< TextAttribute > TextAttributeList
std::map< int, TextAttributeList > TextAttributeMap
#define BASE_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:8