PDF a11y: Move PdfAccessibilityTreeBuilder class into file

Move the PdfAccessibilityTreeBuilder class and relevant helper
functions from pdf_accessibility_tree.h/cc to a separate file. Also move
the LineHelper class along with PdfAccessibilityTreeBuilder as they are
related.

This CL is a pure refactoring and does not change any behaviors.

AX-Relnotes: n/a.
Bug: 338260679
Test: ./out/Debug/components_browsertests --gtest_filter=*PdfAccessibilityTreeTest.*
Test: Deploy this change to chromebook DUT and test it manually.
Change-Id: I6cb8542511c75824f7ef56bdfcd23503b427a1d6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5512684
Reviewed-by: Andy Phan <[email protected]>
Reviewed-by: David Tseng <[email protected]>
Commit-Queue: Kyungjun Lee <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1296404}
diff --git a/components/pdf/renderer/pdf_accessibility_tree_builder.h b/components/pdf/renderer/pdf_accessibility_tree_builder.h
new file mode 100644
index 0000000..2c816ad28
--- /dev/null
+++ b/components/pdf/renderer/pdf_accessibility_tree_builder.h
@@ -0,0 +1,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(
+      base::WeakPtr<PdfAccessibilityTree> pdf_accessibility_tree,
+      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
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+      ,
+      PdfOcrHelper* ocr_helper,
+      bool has_accessible_text
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  );
+
+  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* CreateParagraphNode(float font_size);
+  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);
+  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);
+
+  base::WeakPtr<PdfAccessibilityTree> pdf_accessibility_tree_;
+  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;
+
+#if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+  raw_ptr<PdfOcrHelper> ocr_helper_ = nullptr;
+  const bool has_accessible_text_;
+#endif  // BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
+};
+
+}  // namespace pdf
+
+#endif  // COMPONENTS_PDF_RENDERER_PDF_ACCESSIBILITY_TREE_BUILDER_H_