| // Copyright 2017 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef UI_ACCESSIBILITY_AX_MODE_H_ |
| #define UI_ACCESSIBILITY_AX_MODE_H_ |
| |
| #include <stdint.h> |
| |
| #include <ostream> |
| #include <string> |
| |
| #include "ui/accessibility/ax_base_export.h" |
| |
| namespace ax::mojom { |
| class AXModeDataView; |
| } |
| |
| namespace mojo { |
| template <typename DataViewType, typename T> |
| struct StructTraits; |
| } |
| |
| namespace ui { |
| |
| class AX_BASE_EXPORT AXMode { |
| public: |
| // LINT.IfChange |
| // No modes set (default). |
| static constexpr uint32_t kNone = 0; |
| |
| static constexpr uint32_t kFirstModeFlag = 1 << 0; |
| |
| // Native accessibility APIs, specific to each platform, are enabled. |
| // When this mode is set that indicates the presence of a third-party |
| // client accessing Chrome via accessibility APIs. However, unless one |
| // of the modes below is set, the contents of web pages will not be |
| // accessible. |
| static constexpr uint32_t kNativeAPIs = 1 << 0; |
| |
| // The renderer process will generate an accessibility tree containing |
| // basic information about all nodes, including role, name, value, |
| // state, and location. This is the minimum mode required in order for |
| // web contents to be accessible, and the remaining modes are meaningless |
| // unless this one is set. |
| // |
| // Note that sometimes this mode will be set when kNativeAPI is not, when the |
| // content layer embedder is providing accessibility support via some other |
| // mechanism other than what's implemented in content/browser. |
| static constexpr uint32_t kWebContents = 1 << 1; |
| |
| // The accessibility tree will contain inline text boxes, which are |
| // necessary to expose information about line breaks and word boundaries. |
| // Without this mode, you can retrieve the plaintext value of a text field |
| // but not the information about how it's broken down into lines. |
| // |
| // Note that when this mode is off it's still possible to request inline |
| // text boxes for a specific node on-demand, asynchronously. |
| static constexpr uint32_t kInlineTextBoxes = 1 << 2; |
| |
| // The accessibility tree will contain extra accessibility |
| // attributes typically only needed by screen readers and other |
| // assistive technology for blind users. Examples include text style |
| // attributes, table cell information, live region properties, range |
| // values, and relationship attributes. Note that the HTML tag, ID, class, and |
| // display attributes will also be included. |
| static constexpr uint32_t kExtendedProperties = 1 << 3; |
| |
| // The accessibility tree will contain all the HTML attributes for all |
| // accessibility nodes that come from web content. This effectively dumps all |
| // the HTML attributes as found in the HTML source, or as created by |
| // Javascript, in the accessibility tree, potentially taking up a lot of |
| // memory. |
| static constexpr uint32_t kHTML = 1 << 4; |
| |
| // The accessibility tree will contain some metadata from the |
| // HTML HEAD, such as <meta> tags, in AXTreeData. Only supported |
| // when doing a tree snapshot, there's no support for keeping these |
| // in sync if a page changes them dynamically. |
| static constexpr uint32_t kHTMLMetadata = 1 << 5; |
| |
| // The accessibility tree will contain automatic image annotations. |
| static constexpr uint32_t kLabelImages = 1 << 6; |
| |
| // The accessibility tree will contain enough information to export |
| // an accessible PDF when printing to PDF. |
| static constexpr uint32_t kPDFPrinting = 1 << 7; |
| |
| // The accessibility tree will have the main node annotated. |
| static constexpr uint32_t kAnnotateMainNode = 1 << 8; |
| |
| // Indicates that the bundle containing this and other flags is being applied |
| // in response to an interaction with the platform's accessibility |
| // integration. This meta-flag, which must always be used in combination with |
| // one or more other flags and is never sent to renderers, is used to |
| // selectively suppress or permit accessibility modes that are set due to |
| // interactions from accessibility tools. |
| static constexpr uint32_t kFromPlatform = 1 << 9; |
| |
| // The accessibility tree will contain content and properties only needed by |
| // actual screen readers. This mode is only present when a known screen reader |
| // is detected, e.g. ChromeVox, Talkback, JAWS, NVDA, Narrator, etc. |
| static constexpr uint32_t kScreenReader = 1 << 10; |
| |
| // Update this to include the last supported mode flag. If you add |
| // another, be sure to update the stream insertion operator for |
| // logging and debugging, as well as AccessibilityModeFlagEnum (and |
| // related metrics callsites, see: |ModeFlagHistogramValue|). |
| static constexpr uint32_t kLastModeFlag = 1 << 10; |
| // LINT.ThenChange(//chrome/browser/metrics/accessibility_state_provider.cc,//chrome/browser/performance_manager/metrics/metrics_provider_common.cc,//chrome/browser/resources/accessibility/accessibility.ts,//tools/metrics/histograms/enums.xml,//ui/accessibility/ax_mode_histogram_logger.cc) |
| |
| constexpr AXMode() : flags_(kNone), filter_flags_(kNone) {} |
| constexpr AXMode(uint32_t flags) : flags_(flags), filter_flags_(kNone) {} |
| constexpr AXMode(uint32_t flags, uint32_t filter_flags) |
| : flags_(flags), filter_flags_(filter_flags) {} |
| |
| constexpr bool has_mode(uint32_t flag) const { |
| return (flags_ & flag) == flag; |
| } |
| |
| constexpr void set_mode(uint32_t flag, bool value) { |
| flags_ = value ? (flags_ | flag) : (flags_ & ~flag); |
| } |
| |
| constexpr uint32_t flags() const { return flags_; } |
| |
| constexpr uint32_t filter_flags() const { return filter_flags_; } |
| |
| constexpr bool is_mode_off() const { return !flags_ && !filter_flags_; } |
| |
| constexpr AXMode& operator|=(const AXMode& rhs) { |
| flags_ |= rhs.flags_; |
| filter_flags_ |= rhs.filter_flags_; |
| return *this; |
| } |
| |
| constexpr AXMode& operator&=(const AXMode& rhs) { |
| flags_ &= rhs.flags_; |
| filter_flags_ &= rhs.filter_flags_; |
| return *this; |
| } |
| |
| constexpr AXMode operator~() const { return {~flags_, ~filter_flags_}; } |
| |
| bool HasFilterFlags(uint32_t filter_flag) const; |
| void SetFilterFlags(uint32_t filter_flag, bool value); |
| |
| std::string ToString() const; |
| |
| friend constexpr bool operator==(const AXMode&, const AXMode&) = default; |
| |
| // IMPORTANT! |
| // These values are written to logs. Do not renumber or delete |
| // existing items; add new entries to the end of the list. |
| enum class ModeFlagHistogramValue { |
| UMA_AX_MODE_NATIVE_APIS = 0, |
| UMA_AX_MODE_WEB_CONTENTS = 1, |
| UMA_AX_MODE_INLINE_TEXT_BOXES = 2, |
| UMA_AX_MODE_EXTENDED_PROPERTIES = 3, |
| UMA_AX_MODE_HTML = 4, |
| UMA_AX_MODE_HTML_METADATA = 5, |
| UMA_AX_MODE_LABEL_IMAGES = 6, |
| UMA_AX_MODE_PDF = 7, |
| UMA_AX_MODE_PDF_OCR = 8, // Deprecated. |
| UMA_AX_MODE_ANNOTATE_MAIN_NODE = 9, |
| UMA_AX_MODE_FROM_PLATFORM = 10, |
| UMA_AX_MODE_SCREEN_READER = 11, |
| |
| // This must always be the last enum. It's okay for its value to |
| // increase, but none of the other enum values may change. |
| UMA_AX_MODE_MAX |
| }; |
| |
| // IMPORTANT! |
| // These values are written to logs. Do not renumber or delete |
| // existing items; add new entries to the end of the list. |
| // |
| // LINT.IfChange |
| enum class BundleHistogramValue { |
| // The unnamed bucket is a catch all for modes that do not match one of the |
| // named sets. |
| kUnnamed = 0, |
| // See static constants below for a description of each context. |
| kBasic = 1, |
| kWebContentsOnly = 2, |
| kComplete = 3, |
| kCompleteNoHTML = 4, |
| kFormControls = 5, |
| |
| // This must always be the last enum. It's okay for its value to |
| // increase, but none of the other enum values may change. |
| kMaxValue = 5 |
| }; |
| // LINT.ThenChange(/tools/metrics/histograms/metadata/accessibility/enums.xml:AccessibilityModeBundleEnum) |
| |
| // Filter Flags |
| // These are defined separately from the base flags to avoid conflating |
| // flags that are additive from flags that remove information. |
| static constexpr uint32_t kFilterFirstFlag = 1 << 0; |
| // kFormsAndLabelsOnly filters out everything except for forms and labels |
| // necessary for password managers to operate. |
| static constexpr uint32_t kFormsAndLabelsOnly = 1 << 0; |
| // This flag filters all nodes that are not on-screen. This is guarded behind |
| // a feature flag. Please see kAccessibilityOnScreenMode. |
| static constexpr uint32_t kOnScreenOnly = 1 << 1; |
| static constexpr uint32_t kFilterLastFlag = 1 << 1; |
| |
| private: |
| friend struct mojo::StructTraits<ax::mojom::AXModeDataView, AXMode>; |
| |
| // The core flags_ are in a bit field and can be added together to enable more |
| // accessibility properties to be computed and exposed. |
| uint32_t flags_ = 0U; |
| // The filter_flags_ are also in a bit field but they are subtractive. They |
| // represent the idea that nodes or properties may be removed for performance. |
| uint32_t filter_flags_ = 0U; |
| }; |
| |
| constexpr AXMode operator|(const AXMode& lhs, const AXMode& rhs) { |
| return {lhs.flags() | rhs.flags(), lhs.filter_flags() | rhs.filter_flags()}; |
| } |
| |
| constexpr AXMode operator&(const AXMode& lhs, const AXMode& rhs) { |
| return {lhs.flags() & rhs.flags(), lhs.filter_flags() & rhs.filter_flags()}; |
| } |
| |
| // Used when an AT that only require basic accessibility information, such as |
| // a dictation tool, is present. |
| inline constexpr AXMode kAXModeBasic(AXMode::kNativeAPIs | |
| AXMode::kWebContents); |
| |
| // Used when complete accessibility access is desired but a third-party AT is |
| // not present. |
| inline constexpr AXMode kAXModeWebContentsOnly(AXMode::kWebContents | |
| AXMode::kInlineTextBoxes | |
| AXMode::kExtendedProperties); |
| |
| // Used when an AT that requires full accessibility access, such as a screen |
| // reader, is present. |
| inline constexpr AXMode kAXModeComplete(AXMode::kNativeAPIs | |
| AXMode::kWebContents | |
| AXMode::kInlineTextBoxes | |
| AXMode::kExtendedProperties); |
| |
| // Used for DOM Inspector. |
| // TODO(accessibility) Inspector should not need kInlineTextBoxes. |
| inline constexpr AXMode kAXModeInspector(AXMode::kWebContents | |
| AXMode::kInlineTextBoxes | |
| AXMode::kExtendedProperties | |
| AXMode::kScreenReader); |
| |
| // The default for tests is to include kScreenReader mode, ensuring that the |
| // entire tree is built, rather than the default for API consumers, which |
| // assumes there is no screen reader present, enabling optimizations such as |
| // removal of AXNodes that are not currently relevant. |
| inline constexpr AXMode kAXModeDefaultForTests( |
| AXMode::kNativeAPIs | AXMode::kWebContents | AXMode::kInlineTextBoxes | |
| AXMode::kExtendedProperties | AXMode::kHTML | AXMode::kScreenReader); |
| |
| // Used when tools that only need autofill functionality are present. |
| inline constexpr AXMode kAXModeFormControls(AXMode::kNativeAPIs | |
| AXMode::kWebContents, |
| AXMode::kFormsAndLabelsOnly); |
| |
| // If adding a new named set of mode flags, please update BundleHistogramValue. |
| inline constexpr AXMode kAXModeOnScreen(AXMode::kNativeAPIs | |
| AXMode::kWebContents | |
| AXMode::kInlineTextBoxes | |
| AXMode::kExtendedProperties, |
| AXMode::kOnScreenOnly); |
| |
| // For debugging, test assertions, etc. |
| AX_BASE_EXPORT std::ostream& operator<<(std::ostream& stream, |
| const AXMode& mode); |
| |
| } // namespace ui |
| |
| #endif // UI_ACCESSIBILITY_AX_MODE_H_ |