1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_ANDROID_H_
#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_ANDROID_H_
#include <stddef.h>
#include <stdint.h>
#include <string>
#include <vector>
#include "base/android/scoped_java_ref.h"
#include "content/common/content_export.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/accessibility/ax_node.h"
#include "ui/accessibility/platform/ax_platform_node.h"
#include "ui/accessibility/platform/browser_accessibility.h"
namespace content {
class CONTENT_EXPORT BrowserAccessibilityAndroid
: public ui::BrowserAccessibility {
public:
static BrowserAccessibilityAndroid* GetFromUniqueId(int32_t unique_id);
static void ResetLeafCache();
BrowserAccessibilityAndroid(const BrowserAccessibilityAndroid&) = delete;
BrowserAccessibilityAndroid& operator=(const BrowserAccessibilityAndroid&) =
delete;
~BrowserAccessibilityAndroid() override;
// BrowserAccessibility Overrides.
using BrowserAccessibility::GetUniqueId;
bool CanFireEvents() const override;
void OnDataChanged() override;
void OnLocationChanged() override;
std::u16string GetLocalizedStringForImageAnnotationStatus(
ax::mojom::ImageAnnotationStatus status) const override;
bool IsAndroidTextView() const;
bool IsCheckable() const;
bool IsChecked() const;
bool IsClickable() const override;
bool IsCollapsed() const;
// Android uses the term "collection" instead of "table". These methods are
// pass-through methods to the ax_role_properties IsTableLikeOnAndroid and
// IsTableItem. For example, a kList will return true for IsCollection and
// false for IsCollectionItem, whereas a kListItem will return the opposite.
bool IsCollection() const;
bool IsCollectionItem() const;
bool IsContentInvalid() const;
bool IsDisabledDescendant() const;
bool IsEnabled() const;
bool IsExpanded() const;
bool IsFocusable() const override;
bool IsFormDescendant() const;
bool IsHeading() const;
bool IsHierarchical() const;
bool IsMultiLine() const;
bool IsMultiselectable() const;
bool IsRangeControlWithoutAriaValueText() const;
bool IsReportingCheckable() const;
bool IsRequired() const;
bool IsScrollable() const;
bool IsSeekControl() const;
bool IsSelected() const;
bool IsSlider() const;
bool IsSubscript() const;
bool IsSuperscript() const;
bool IsTableHeader() const;
bool IsVisibleToUser() const;
bool ShouldUsePaneTitle() const;
// This returns true for all nodes that we should navigate to.
// Nodes that have a generic role, no accessible name, and aren't
// focusable or clickable aren't interesting.
bool IsInterestingOnAndroid() const;
// Is a heading whose only child is a link.
bool IsHeadingLink() const;
// If this node is interesting (IsInterestingOnAndroid() returns true),
// returns |this|. If not, it recursively checks all of the
// platform children of this node, and if just a single one is
// interesting, returns that one. If no descendants are interesting, or
// if more than one is interesting, returns nullptr.
const BrowserAccessibilityAndroid* GetSoleInterestingNodeFromSubtree() const;
// Returns true if the given subtree has inline text box data, or if there
// aren't any to load.
bool AreInlineTextBoxesLoaded() const;
// Returns a relative score of how likely a node is to be clickable.
int ClickableScore() const;
int ExpandedState() const;
bool CanOpenPopup() const;
bool HasAriaCurrent() const;
bool HasNonEmptyValue() const;
bool HasCharacterLocations() const;
bool HasImage() const;
const char* GetClassName() const;
bool IsChildOfLeaf() const override;
bool IsLeaf() const override;
bool IsLeafConsideringChildren() const;
std::u16string GetBrailleLabel() const;
std::u16string GetBrailleRoleDescription() const;
// Note: In the Android accessibility API, the word "text" is used where other
// platforms would use "name". The value returned here will appear in dump
// tree tests as "name" in the ...-android.txt files, but as "text" in the
// ...-android-external.txt files. On other platforms this may be ::GetName().
std::u16string GetTextContentUTF16() const override;
std::u16string GetValueForControl() const override;
int GetTextContentLengthUTF16() const override;
// This method firstly checks GetTextContentUTF16(). In the case of accessible
// name from kAttribute resulting in GetTextContentUTF16 is empty, it falls
// back to first non-empty GetContainerName(), GetContentDescription(), and
// GetSupplementalDescription().
std::u16string GetAccessibleNameUTF16() const;
typedef base::RepeatingCallback<bool(const std::u16string& partial)>
EarlyExitPredicate;
std::u16string GetSubstringTextContentUTF16(
std::optional<size_t> min_length) const;
static EarlyExitPredicate NonEmptyPredicate();
static EarlyExitPredicate LengthAtLeast(size_t length);
// This method maps to the Android API's "hint" attribute. For nodes that have
// chosen to expose their value in the name ("text") attribute, the hint must
// contain the text that would otherwise have been present. The hint includes
// the placeholder and describedby values for all nodes regardless of where
// the value is placed. These pieces of content are concatenated for Android.
std::u16string GetHint() const;
// This method maps to the Android API "TooltipText" attribute.
std::u16string GetTooltipText() const;
std::string GetRoleString() const;
std::u16string GetPaneTitle() const;
std::u16string GetDialogModalMessageText() const;
std::u16string GetContentInvalidErrorMessage() const;
std::u16string GetStateDescription() const;
std::u16string GetContainerTitle() const;
std::u16string GetContentDescription() const;
std::u16string GetSupplementalDescription() const;
std::u16string GetMultiselectableStateDescription() const;
std::u16string GetToggleStateDescription() const;
std::u16string GetCheckboxStateDescription() const;
std::u16string GetAriaCurrentStateDescription() const;
std::u16string GetRadioButtonStateDescription() const;
std::u16string GetComboboxExpandedText() const;
std::u16string GetComboboxExpandedTextFallback() const;
std::u16string GetRoleDescription() const;
std::string GetCSSDisplay() const;
// Various methods for text styling that are added to the Android
// accessibility tree as Spannables, we also include the subscript and
// superscript from the methods above.
float GetTextSize() const;
int GetTextStyle() const;
int GetTextColor() const;
int GetTextBackgroundColor() const;
std::string GetFontFamily() const;
int GetItemIndex() const;
int GetItemCount() const;
int GetSelectedItemCount() const;
int GetSelectionMode() const;
bool CanScrollForward() const;
bool CanScrollBackward() const;
bool CanScrollUp() const;
bool CanScrollDown() const;
bool CanScrollLeft() const;
bool CanScrollRight() const;
int GetScrollX() const;
int GetScrollY() const;
int GetMinScrollX() const;
int GetMinScrollY() const;
int GetMaxScrollX() const;
int GetMaxScrollY() const;
bool Scroll(int direction, bool is_page_scroll) const;
int GetChecked() const;
int GetTextChangeFromIndex() const;
int GetTextChangeAddedCount() const;
int GetTextChangeRemovedCount() const;
std::u16string GetTextChangeBeforeText() const;
int GetSelectionStart() const;
int GetSelectionEnd() const;
int GetEditableTextLength() const;
int AndroidInputType() const;
int AndroidLiveRegionType() const;
int AndroidRangeType() const;
int RowCount() const;
int ColumnCount() const;
int RowIndex() const;
int RowSpan() const;
int ColumnIndex() const;
int ColumnSpan() const;
float RangeMin() const;
float RangeMax() const;
float RangeCurrentValue() const;
// Calls GetLineBoundaries or GetWordBoundaries depending on the value
// of |granularity|, or fails if anything else is passed in |granularity|.
void GetGranularityBoundaries(int granularity,
std::vector<int32_t>* starts,
std::vector<int32_t>* ends,
int offset);
// Append line start and end indices for the text of this node
// (as returned by GetTextContentUTF16()), adding |offset| to each one.
void GetLineBoundaries(std::vector<int32_t>* line_starts,
std::vector<int32_t>* line_ends,
int offset);
// Append word start and end indices for the text of this node
// (as returned by GetTextContentUTF16()) to |word_starts| and |word_ends|,
// adding |offset| to each one.
void GetWordBoundaries(std::vector<int32_t>* word_starts,
std::vector<int32_t>* word_ends,
int offset);
// Return the target of a link or the source of an image.
std::u16string GetTargetUrl() const;
// On Android, spelling errors are returned as "suggestions". Retreive
// all of the suggestions for a given text field as vectors of start
// and end offsets.
void GetSuggestions(std::vector<int>* suggestion_starts,
std::vector<int>* suggestion_ends) const;
// Used for tree dumps, generate a string representation of the
// AccessibilityNodeInfo object for this node by calling through the
// manager to the web_contents_accessibility_android JNI.
std::u16string GenerateAccessibilityNodeInfoString() const;
protected:
BrowserAccessibilityAndroid(ui::BrowserAccessibilityManager* manager,
ui::AXNode* node);
std::u16string GetLocalizedString(int message_id) const override;
friend class BrowserAccessibility; // Needs access to our constructor.
private:
static size_t CommonPrefixLength(const std::u16string& a,
const std::u16string& b);
static size_t CommonSuffixLength(const std::u16string& a,
const std::u16string& b);
static size_t CommonEndLengths(const std::u16string& a,
const std::u16string& b);
// BrowserAccessibility overrides.
BrowserAccessibility* PlatformGetLowestPlatformAncestor() const override;
bool HasOnlyTextChildren() const;
bool HasOnlyTextAndImageChildren() const;
bool HasListMarkerChild() const;
// Returns true if the accessible name source (kNameFrom) comes from
// kAttribute.
bool IsAccessibleNameFromAttribute() const;
// This method determines if a node should expose its value as a name, which
// is placed in the Android API's "text" attribute. For controls that can take
// on a value (e.g. a date time, or combobox), we wish to expose the value
// that the user has chosen. When the value is exposed as the name, then the
// accessible name is added to the Android API's "hint" attribute instead.
bool ShouldExposeValueAsName(const std::u16string& value) const;
int CountChildrenWithRole(ax::mojom::Role role) const;
void AppendTextToString(std::u16string extra_text,
std::u16string* string) const;
// Returns true if the node has int attribute of kDefaultActionVerb and the
// default action verb is kSelect.
bool HasSelectActionVerb() const;
// Returns tree if any child has kSelect action verb.
bool HasSelectActionVerbChildren() const;
std::u16string cached_text_;
std::u16string old_value_;
std::u16string new_value_;
int32_t unique_id_;
};
} // namespace content
#endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_ANDROID_H_
|