chromium/ui/accessibility/platform/ax_event_intent_mac.h

// Copyright 2020 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_PLATFORM_AX_EVENT_INTENT_MAC_H_
#define UI_ACCESSIBILITY_PLATFORM_AX_EVENT_INTENT_MAC_H_

#include "base/component_export.h"
#include "ui/accessibility/ax_enums.mojom-forward.h"

namespace ui {

struct AXEventIntent;

// Describes the type of the AXTextStateChangeIntent, as defined by Mac's
// accessibility framework.
//
// Broadly, there are two types of intents that may be attached to accessibility
// events: an editing intent or a selection intent.
//
// The enumeration values are taken from the WebKit source code, but they are
// modified slightly to comply with Chromium's C++ Style Guide. Please do not
// renumber.
enum class AXTextStateChangeType {
  kUnknown = 0,
  kEdit = 1,
  kSelectionMove = 2,
  kSelectionExtend = 3,
  kSelectionBoundary = 4
};

// Describes the type of the editing intent, as defined by Mac's accessibility
// framework.
//
// The enumeration values are taken from the WebKit source code, but they are
// modified slightly to comply with Chromium's C++ Style Guide. Please do not
// renumber.
enum class AXTextEditType {
  kUnknown = 0,
  kDelete = 1,
  kInsert = 2,
  kTyping = 3,
  kDictation = 4,
  kCut = 5,
  kPaste = 6,
  kAttributesChange = 7  // Change font, style, alignment, color, etc.
};

// Describes the directionality of a selection intent, as defined by Mac's
// accessibility framework.
//
// The enumeration values are taken from the WebKit source code, but they are
// modified slightly to comply with Chromium's C++ Style Guide. Please do not
// renumber.
enum class AXTextSelectionDirection {
  kUnknown = 0,
  kBeginning = 1,
  kEnd = 2,
  kPrevious = 3,
  kNext = 4,
  kDiscontiguous = 5
};

// Describes the amount by which the selection has moved or has been extended
// by, as defined by Mac's accessibility framework.
//
// The enumeration values are taken from the WebKit source code, but they are
// modified slightly to comply with Chromium's C++ Style Guide. Please do not
// renumber.
enum class AXTextSelectionGranularity {
  kUnknown = 0,
  kCharacter = 1,
  kWord = 2,
  kLine = 3,
  kSentence = 4,
  kParagraph = 5,
  kPage = 6,
  kDocument = 7,

  // All granularity represents the action of selecting the whole document as a
  // single action. Extending selection by some other granularity until it
  // encompasses the whole document should not result in a all granularity
  // notification.
  kAll = 8
};

// Describes a selection operation in an AXTextStateChangeIntent.
struct AXTextSelection final {
  // Constructs a description of a selection operation, translating the given
  // direction and granularity from Chromium's internal representation to what
  // the Mac accessibility framework expects.
  static AXTextSelection FromDirectionAndGranularity(
      ax::mojom::TextBoundary text_boundary,
      ax::mojom::MoveDirection move_direction);

  // Constructs a description of a selection operation that has no extra
  // information, such as when the selection is set using the mouse and so its
  // granularity would be hard to ascertain.
  AXTextSelection();

  // Constructs a description of a selection operation for which extra
  // information can be provided.
  AXTextSelection(AXTextSelectionDirection direction,
                  AXTextSelectionGranularity granularity,
                  bool focus_change);

  AXTextSelection(const AXTextSelection& selection);

  virtual ~AXTextSelection();

  AXTextSelection& operator=(const AXTextSelection& selection);

  AXTextSelectionDirection direction = AXTextSelectionDirection::kUnknown;
  AXTextSelectionGranularity granularity = AXTextSelectionGranularity::kUnknown;
  bool focus_change = false;
};

// The equivalent of an accessibility event intent (AXEventIntent), as
// defined by Mac's accessibility framework.
struct COMPONENT_EXPORT(AX_PLATFORM) AXTextStateChangeIntent final {
  // Constructs an intent that is used when the selection is set to a different
  // iframe or control, and focus has move to that element.
  static AXTextStateChangeIntent DefaultFocusTextStateChangeIntent();

  // Constructs an intent that is used when the selection has moved to another
  // location within the same control, (i.e. browser focus hasn't moved), or
  // when the selection has been cleared.
  static AXTextStateChangeIntent DefaultSelectionChangeIntent();

  // Constructs an empty intent.
  AXTextStateChangeIntent();

  // Constructs a selection intent.
  AXTextStateChangeIntent(AXTextStateChangeType type,
                          AXTextSelection selection);

  // Constructs an editing intent.
  explicit AXTextStateChangeIntent(AXTextEditType edit);

  AXTextStateChangeIntent(const AXTextStateChangeIntent& intent);

  virtual ~AXTextStateChangeIntent();

  AXTextStateChangeIntent& operator=(const AXTextStateChangeIntent& intent);

  AXTextStateChangeType type = AXTextStateChangeType::kUnknown;
  AXTextEditType edit = AXTextEditType::kUnknown;
  AXTextSelection selection;
};

// Converts from Chromium's AXEventIntent to Mac's AXTextStateChangeIntent.
COMPONENT_EXPORT(AX_PLATFORM)
AXTextStateChangeIntent FromEventIntent(const AXEventIntent& event_intent);

}  // namespace ui

#endif  // UI_ACCESSIBILITY_PLATFORM_AX_EVENT_INTENT_MAC_H_