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
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_H_
#define COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_H_
#include <map>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "components/pdf/renderer/pdf_accessibility_tree.h"
#include "pdf/accessibility_structs.h"
#include "services/screen_ai/buildflags/buildflags.h"
#include "third_party/blink/public/web/web_ax_object.h"
#include "ui/accessibility/ax_enums.mojom-shared.h"
namespace blink {
class WebAXObject;
}
namespace ui {
struct AXNodeData;
}
namespace pdf {
class PdfAccessibilityTreeBuilder {
public:
PdfAccessibilityTreeBuilder(
bool mark_headings_using_heuristic,
const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
const chrome_pdf::AccessibilityPageObjects& page_objects,
const chrome_pdf::AccessibilityPageInfo& page_info,
uint32_t page_index,
ui::AXNodeData* root_node,
blink::WebAXObject* container_obj,
std::vector<std::unique_ptr<ui::AXNodeData>>* nodes,
std::map<int32_t, chrome_pdf::PageCharacterIndex>*
node_id_to_page_char_index,
std::map<int32_t, PdfAccessibilityTree::AnnotationInfo>*
node_id_to_annotation_info
);
PdfAccessibilityTreeBuilder(const PdfAccessibilityTreeBuilder&) = delete;
PdfAccessibilityTreeBuilder& operator=(const PdfAccessibilityTreeBuilder&) =
delete;
~PdfAccessibilityTreeBuilder();
void BuildPageTree();
private:
void AddWordStartsAndEnds(ui::AXNodeData* inline_text_box);
ui::AXNodeData* CreateAndAppendNode(ax::mojom::Role role,
ax::mojom::Restriction restriction);
ui::AXNodeData* CreateBlockLevelNode(const std::string& text_run_type,
float font_size);
ui::AXNodeData* CreateStaticTextNode();
ui::AXNodeData* CreateStaticTextNode(
const chrome_pdf::PageCharacterIndex& page_char_index);
ui::AXNodeData* CreateInlineTextBoxNode(
const chrome_pdf::AccessibilityTextRunInfo& text_run,
const chrome_pdf::PageCharacterIndex& page_char_index);
ui::AXNodeData* CreateLinkNode(const chrome_pdf::AccessibilityLinkInfo& link);
ui::AXNodeData* CreateImageNode(
const chrome_pdf::AccessibilityImageInfo& image);
ui::AXNodeData* CreateHighlightNode(
const chrome_pdf::AccessibilityHighlightInfo& highlight);
ui::AXNodeData* CreatePopupNoteNode(
const chrome_pdf::AccessibilityHighlightInfo& highlight);
ui::AXNodeData* CreateTextFieldNode(
const chrome_pdf::AccessibilityTextFieldInfo& text_field);
ui::AXNodeData* CreateButtonNode(
const chrome_pdf::AccessibilityButtonInfo& button);
ui::AXNodeData* CreateListboxOptionNode(
const chrome_pdf::AccessibilityChoiceFieldOptionInfo& choice_field_option,
ax::mojom::Restriction restriction);
ui::AXNodeData* CreateListboxNode(
const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
ui::AXNodeData* control_node);
ui::AXNodeData* CreateComboboxInputNode(
const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
ax::mojom::Restriction restriction);
ui::AXNodeData* CreateComboboxNode(
const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field);
ui::AXNodeData* CreateChoiceFieldNode(
const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field);
#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
ui::AXNodeData* CreateOcrWrapperNode(const gfx::PointF& position, bool start);
#endif
void AddTextToAXNode(size_t start_text_run_index,
uint32_t end_text_run_index,
ui::AXNodeData* ax_node,
ui::AXNodeData** previous_on_line_node);
void AddTextToObjectNode(size_t object_text_run_index,
uint32_t object_text_run_count,
ui::AXNodeData* object_node,
ui::AXNodeData* para_node,
ui::AXNodeData** previous_on_line_node,
size_t* text_run_index);
void AddLinkToParaNode(const chrome_pdf::AccessibilityLinkInfo& link,
ui::AXNodeData* para_node,
ui::AXNodeData** previous_on_line_node,
size_t* text_run_index);
void AddImageToParaNode(const chrome_pdf::AccessibilityImageInfo& image,
ui::AXNodeData* para_node,
size_t* text_run_index);
void AddHighlightToParaNode(
const chrome_pdf::AccessibilityHighlightInfo& highlight,
ui::AXNodeData* para_node,
ui::AXNodeData** previous_on_line_node,
size_t* text_run_index);
void AddTextFieldToParaNode(
const chrome_pdf::AccessibilityTextFieldInfo& text_field,
ui::AXNodeData* para_node,
size_t* text_run_index);
void AddButtonToParaNode(const chrome_pdf::AccessibilityButtonInfo& button,
ui::AXNodeData* para_node,
size_t* text_run_index);
void AddChoiceFieldToParaNode(
const chrome_pdf::AccessibilityChoiceFieldInfo& choice_field,
ui::AXNodeData* para_node,
size_t* text_run_index);
void AddRemainingAnnotations(ui::AXNodeData* para_node
#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
,
bool ocr_applied
#endif
);
const bool mark_headings_using_heuristic_;
std::vector<uint32_t> text_run_start_indices_;
const raw_ref<const std::vector<chrome_pdf::AccessibilityTextRunInfo>>
text_runs_;
const raw_ref<const std::vector<chrome_pdf::AccessibilityCharInfo>> chars_;
const raw_ref<const std::vector<chrome_pdf::AccessibilityLinkInfo>> links_;
uint32_t current_link_index_ = 0;
const raw_ref<const std::vector<chrome_pdf::AccessibilityImageInfo>> images_;
uint32_t current_image_index_ = 0;
const raw_ref<const std::vector<chrome_pdf::AccessibilityHighlightInfo>>
highlights_;
uint32_t current_highlight_index_ = 0;
const raw_ref<const std::vector<chrome_pdf::AccessibilityTextFieldInfo>>
text_fields_;
uint32_t current_text_field_index_ = 0;
const raw_ref<const std::vector<chrome_pdf::AccessibilityButtonInfo>>
buttons_;
uint32_t current_button_index_ = 0;
const raw_ref<const std::vector<chrome_pdf::AccessibilityChoiceFieldInfo>>
choice_fields_;
uint32_t current_choice_field_index_ = 0;
uint32_t page_index_;
raw_ptr<ui::AXNodeData> root_node_;
raw_ptr<ui::AXNodeData> page_node_;
raw_ptr<blink::WebAXObject> container_obj_;
raw_ptr<std::vector<std::unique_ptr<ui::AXNodeData>>> nodes_;
raw_ptr<std::map<int32_t, chrome_pdf::PageCharacterIndex>>
node_id_to_page_char_index_;
raw_ptr<std::map<int32_t, PdfAccessibilityTree::AnnotationInfo>>
node_id_to_annotation_info_;
float heading_font_size_threshold_ = 0;
float paragraph_spacing_threshold_ = 0;
};
} // namespace pdf
#endif // COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_H_
|