#ifndef PDF_ACCESSIBILITY_STRUCTS_H_
#define PDF_ACCESSIBILITY_STRUCTS_H_
#include <stdint.h>
#include <string>
#include <vector>
#include "base/containers/fixed_flat_map.h"
#include "base/memory/raw_ptr.h"
#include "pdf/page_character_index.h"
#include "pdf/pdf_accessibility_constants.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_f.h"
namespace chrome_pdf {
struct Selection {
PageCharacterIndex start;
PageCharacterIndex end;
};
enum class AccessibilityTextRenderMode {
kUnknown = -1,
kFill = 0,
kStroke = 1,
kFillStroke = 2,
kInvisible = 3,
kFillClip = 4,
kStrokeClip = 5,
kFillStrokeClip = 6,
kClip = 7,
kMaxValue = kClip,
};
struct AccessibilityTextStyleInfo {
AccessibilityTextStyleInfo();
AccessibilityTextStyleInfo(const std::string& font_name,
int font_weight,
AccessibilityTextRenderMode render_mode,
float font_size,
uint32_t fill_color,
uint32_t stroke_color,
bool is_italic,
bool is_bold);
AccessibilityTextStyleInfo(const AccessibilityTextStyleInfo& other);
~AccessibilityTextStyleInfo();
std::string font_name;
int font_weight = 0;
AccessibilityTextRenderMode render_mode =
AccessibilityTextRenderMode::kUnknown;
float font_size = 0.0f;
uint32_t fill_color = 0;
uint32_t stroke_color = 0;
bool is_italic = false;
bool is_bold = false;
};
enum class AccessibilityTextDirection {
kNone = 0,
kLeftToRight = 1,
kRightToLeft = 2,
kTopToBottom = 3,
kBottomToTop = 4,
kMaxValue = kBottomToTop,
};
struct AccessibilityTextRunInfo {
AccessibilityTextRunInfo();
AccessibilityTextRunInfo(uint32_t start_index,
uint32_t len,
const std::string& tag_type,
const gfx::RectF& bounds,
AccessibilityTextDirection direction,
const AccessibilityTextStyleInfo& style);
AccessibilityTextRunInfo(uint32_t start_index,
uint32_t len,
const std::string& tag_type,
const gfx::RectF& bounds,
AccessibilityTextDirection direction,
const AccessibilityTextStyleInfo& style,
bool is_searchified);
AccessibilityTextRunInfo(const AccessibilityTextRunInfo& other);
~AccessibilityTextRunInfo();
uint32_t start_index = 0;
uint32_t len = 0;
std::string tag_type;
gfx::RectF bounds;
AccessibilityTextDirection direction = AccessibilityTextDirection::kNone;
AccessibilityTextStyleInfo style;
bool is_searchified = false;
};
struct AccessibilityImageInfo {
AccessibilityImageInfo();
AccessibilityImageInfo(const std::string& alt_text,
uint32_t text_run_index,
const gfx::RectF& bounds,
int32_t page_object_index);
AccessibilityImageInfo(const AccessibilityImageInfo& other);
~AccessibilityImageInfo();
std::string alt_text;
uint32_t text_run_index = 0;
gfx::RectF bounds;
int32_t page_object_index;
};
struct AccessibilityStructureElement {
AccessibilityStructureElement();
AccessibilityStructureElement(const AccessibilityStructureElement&) = delete;
AccessibilityStructureElement& operator=(
const AccessibilityStructureElement&) = delete;
~AccessibilityStructureElement();
PdfTagType type = PdfTagType::kNone;
std::string language;
std::string alt_text;
std::string abbreviation_expansion;
std::string actual_text;
std::vector<raw_ptr<AccessibilityTextRunInfo, VectorExperimental>>
associated_text_runs_if_available;
std::unique_ptr<AccessibilityImageInfo> associated_image_if_available;
std::vector<std::unique_ptr<AccessibilityStructureElement>> children;
raw_ptr<AccessibilityStructureElement> parent = nullptr;
};
struct AccessibilityDocInfo {
AccessibilityDocInfo();
AccessibilityDocInfo(const AccessibilityDocInfo&) = delete;
AccessibilityDocInfo& operator=(const AccessibilityDocInfo&) = delete;
~AccessibilityDocInfo();
friend bool operator==(const AccessibilityDocInfo&,
const AccessibilityDocInfo&) = default;
uint32_t page_count = 0;
bool is_tagged = false;
std::unique_ptr<AccessibilityStructureElement> structure_tree_root;
bool text_accessible = false;
bool text_copyable = false;
};
struct AccessibilityPageInfo {
uint32_t page_index = 0;
gfx::Rect bounds;
uint32_t text_run_count = 0;
uint32_t char_count = 0;
bool is_searchified = false;
};
struct AccessibilityCharInfo {
uint32_t unicode_character = 0;
double char_width = 0.0;
};
struct AccessibilityTextRunRangeInfo {
size_t index = 0;
uint32_t count = 0;
};
struct AccessibilityLinkInfo {
AccessibilityLinkInfo();
AccessibilityLinkInfo(const std::string& url,
uint32_t index_in_page,
const gfx::RectF& bounds,
const AccessibilityTextRunRangeInfo& text_range);
AccessibilityLinkInfo(const AccessibilityLinkInfo& other);
~AccessibilityLinkInfo();
std::string url;
uint32_t index_in_page = 0;
gfx::RectF bounds;
AccessibilityTextRunRangeInfo text_range;
};
struct AccessibilityHighlightInfo {
AccessibilityHighlightInfo();
AccessibilityHighlightInfo(const std::string& note_text,
uint32_t index_in_page,
uint32_t color,
const gfx::RectF& bounds,
const AccessibilityTextRunRangeInfo& text_range);
AccessibilityHighlightInfo(const AccessibilityHighlightInfo& other);
~AccessibilityHighlightInfo();
std::string note_text;
uint32_t index_in_page = 0;
uint32_t color = 0;
gfx::RectF bounds;
AccessibilityTextRunRangeInfo text_range;
};
struct AccessibilityTextFieldInfo {
AccessibilityTextFieldInfo();
AccessibilityTextFieldInfo(const std::string& name,
const std::string& value,
bool is_read_only,
bool is_required,
bool is_password,
uint32_t index_in_page,
uint32_t text_run_index,
const gfx::RectF& bounds);
AccessibilityTextFieldInfo(const AccessibilityTextFieldInfo& other);
~AccessibilityTextFieldInfo();
std::string name;
std::string value;
bool is_read_only = false;
bool is_required = false;
bool is_password = false;
uint32_t index_in_page = 0;
uint32_t text_run_index = 0;
gfx::RectF bounds;
};
struct AccessibilityChoiceFieldOptionInfo {
std::string name;
bool is_selected = false;
gfx::RectF bounds;
};
enum class ChoiceFieldType {
kListBox = 0,
kComboBox = 1,
kMinValue = kListBox,
kMaxValue = kComboBox,
};
struct AccessibilityChoiceFieldInfo {
AccessibilityChoiceFieldInfo();
AccessibilityChoiceFieldInfo(
const std::string& name,
const std::vector<AccessibilityChoiceFieldOptionInfo>& options,
ChoiceFieldType type,
bool is_read_only,
bool is_multi_select,
bool has_editable_text_box,
uint32_t index_in_page,
uint32_t text_run_index,
const gfx::RectF& bounds);
AccessibilityChoiceFieldInfo(const AccessibilityChoiceFieldInfo& other);
~AccessibilityChoiceFieldInfo();
std::string name;
std::vector<AccessibilityChoiceFieldOptionInfo> options;
ChoiceFieldType type;
bool is_read_only = false;
bool is_multi_select = false;
bool has_editable_text_box = false;
uint32_t index_in_page = 0;
uint32_t text_run_index = 0;
gfx::RectF bounds;
};
enum class ButtonType {
kPushButton = 1,
kCheckBox = 2,
kRadioButton = 3,
kMinValue = kPushButton,
kMaxValue = kRadioButton,
};
struct AccessibilityButtonInfo {
AccessibilityButtonInfo();
AccessibilityButtonInfo(const std::string& name,
const std::string& value,
ButtonType type,
bool is_read_only,
bool is_checked,
uint32_t control_count,
uint32_t control_index,
uint32_t index_in_page,
uint32_t text_run_index,
const gfx::RectF& bounds);
AccessibilityButtonInfo(const AccessibilityButtonInfo& other);
~AccessibilityButtonInfo();
std::string name;
std::string value;
ButtonType type;
bool is_read_only = false;
bool is_checked = false;
uint32_t control_count = 0;
uint32_t control_index = 0;
uint32_t index_in_page = 0;
uint32_t text_run_index = 0;
gfx::RectF bounds;
};
struct AccessibilityFormFieldInfo {
AccessibilityFormFieldInfo();
AccessibilityFormFieldInfo(
const std::vector<AccessibilityTextFieldInfo>& text_fields,
const std::vector<AccessibilityChoiceFieldInfo>& choice_fields,
const std::vector<AccessibilityButtonInfo>& buttons);
AccessibilityFormFieldInfo(const AccessibilityFormFieldInfo& other);
~AccessibilityFormFieldInfo();
std::vector<AccessibilityTextFieldInfo> text_fields;
std::vector<AccessibilityChoiceFieldInfo> choice_fields;
std::vector<AccessibilityButtonInfo> buttons;
};
struct AccessibilityPageObjects {
AccessibilityPageObjects();
AccessibilityPageObjects(
const std::vector<AccessibilityLinkInfo>& links,
const std::vector<AccessibilityImageInfo>& images,
const std::vector<AccessibilityHighlightInfo>& highlights,
const AccessibilityFormFieldInfo& form_fields);
AccessibilityPageObjects(const AccessibilityPageObjects& other);
~AccessibilityPageObjects();
std::vector<AccessibilityLinkInfo> links;
std::vector<AccessibilityImageInfo> images;
std::vector<AccessibilityHighlightInfo> highlights;
AccessibilityFormFieldInfo form_fields;
};
enum class FocusObjectType {
kNone = 0,
kDocument = 1,
kLink = 2,
kHighlight = 3,
kTextField = 4,
kMaxValue = kTextField,
};
struct AccessibilityFocusInfo {
FocusObjectType focused_object_type = FocusObjectType::kNone;
uint32_t focused_object_page_index = 0;
uint32_t focused_annotation_index_in_page = 0;
};
struct AccessibilityViewportInfo {
AccessibilityViewportInfo();
AccessibilityViewportInfo(const AccessibilityViewportInfo& other);
~AccessibilityViewportInfo();
double zoom = 0.0;
double scale = 0.0;
gfx::Point scroll;
gfx::Point offset;
uint32_t orientation = 0;
Selection selection;
AccessibilityFocusInfo focus_info;
};
enum class AccessibilityAction {
kNone = 0,
kScrollToMakeVisible = 1,
kDoDefaultAction = 2,
kScrollToGlobalPoint = 3,
kSetSelection = 4,
kMaxValue = kSetSelection,
};
enum class AccessibilityAnnotationType {
kNone = 0,
kLink = 1,
kMaxValue = kLink,
};
enum class AccessibilityScrollAlignment {
kNone = 0,
kCenter,
kTop,
kBottom,
kLeft,
kRight,
kClosestToEdge,
kMaxValue = kClosestToEdge,
};
struct AccessibilityActionData {
AccessibilityActionData();
AccessibilityActionData(
AccessibilityAction action,
AccessibilityAnnotationType annotation_type,
const gfx::Point& target_point,
const gfx::Rect& target_rect,
uint32_t annotation_index,
uint32_t page_index,
AccessibilityScrollAlignment horizontal_scroll_alignment,
AccessibilityScrollAlignment vertical_scroll_alignment,
const PageCharacterIndex& selection_start_index,
const PageCharacterIndex& selection_end_index);
AccessibilityActionData(const AccessibilityActionData& other);
~AccessibilityActionData();
AccessibilityAction action = AccessibilityAction::kNone;
AccessibilityAnnotationType annotation_type =
AccessibilityAnnotationType::kNone;
gfx::Point target_point;
gfx::Rect target_rect;
uint32_t annotation_index = 0;
uint32_t page_index = 0;
AccessibilityScrollAlignment horizontal_scroll_alignment =
AccessibilityScrollAlignment::kNone;
AccessibilityScrollAlignment vertical_scroll_alignment =
AccessibilityScrollAlignment::kNone;
PageCharacterIndex selection_start_index;
PageCharacterIndex selection_end_index;
};
}
#endif