0

Tagged PDFs: Prepares the AccessibilityDocInfo struct to hold the structure tree

In https://crrev.com/c/6339009, the entire structure tree from the
PDF will be attached to the AccessibilityDocInfo struct.
Since the AccessibilityDocInfo struct will own, via an std::unique_ptr,
the structure tree's root, it should not have any copy constructors and
so they are deleted, and the struct is returned via a unique_ptr to
clearly indicate the ownership flow.

Design doc at:
https://docs.google.com/document/d/1ScD93clMA7AtViWINnaQgRTAK3vbpMshQZQXmWkfCyQ/edit?usp=sharing

AX-Relnotes: n/a.
Bug: 40707542
Change-Id: Ifc5934f5ab4a70a10777040eeb8057dfe1080ce6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6369795
Commit-Queue: Nektarios Paisios <nektar@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1436092}
This commit is contained in:
Nektarios Paisios
2025-03-21 09:27:07 -07:00
committed by Chromium LUCI CQ
parent baec5a1e35
commit e1e808ce8a
9 changed files with 175 additions and 112 deletions

@ -450,7 +450,8 @@ void PdfAccessibilityTree::DoSetAccessibilityViewportInfo(
}
void PdfAccessibilityTree::SetAccessibilityDocInfo(
chrome_pdf::AccessibilityDocInfo doc_info) {
std::unique_ptr<chrome_pdf::AccessibilityDocInfo> doc_info) {
CHECK(doc_info);
// This call may trigger layout, and ultimately self-deletion; see
// crbug.com/1274376 for details.
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
@ -460,15 +461,16 @@ void PdfAccessibilityTree::SetAccessibilityDocInfo(
}
void PdfAccessibilityTree::DoSetAccessibilityDocInfo(
const chrome_pdf::AccessibilityDocInfo& doc_info) {
std::unique_ptr<chrome_pdf::AccessibilityDocInfo> doc_info) {
CHECK(doc_info);
auto obj = GetPluginContainerAXObject();
if (!obj) {
return;
}
ClearAccessibilityNodes();
page_count_ = doc_info.page_count;
is_tagged_ = doc_info.is_tagged;
page_count_ = doc_info->page_count;
is_tagged_ = doc_info->is_tagged;
doc_node_ =
CreateNode(ax::mojom::Role::kPdfRoot, ax::mojom::Restriction::kReadOnly,

@ -90,7 +90,7 @@ class PdfAccessibilityTree : public ui::AXTreeSource<const ui::AXNode*,
void SetAccessibilityViewportInfo(
chrome_pdf::AccessibilityViewportInfo viewport_info) override;
void SetAccessibilityDocInfo(
chrome_pdf::AccessibilityDocInfo doc_info) override;
std::unique_ptr<chrome_pdf::AccessibilityDocInfo> doc_info) override;
void SetAccessibilityPageInfo(
chrome_pdf::AccessibilityPageInfo page_info,
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs,
@ -170,7 +170,7 @@ class PdfAccessibilityTree : public ui::AXTreeSource<const ui::AXNode*,
void DoSetAccessibilityViewportInfo(
const chrome_pdf::AccessibilityViewportInfo& viewport_info);
void DoSetAccessibilityDocInfo(
const chrome_pdf::AccessibilityDocInfo& doc_info);
std::unique_ptr<chrome_pdf::AccessibilityDocInfo> doc_info);
void DoSetAccessibilityPageInfo(
const chrome_pdf::AccessibilityPageInfo& page_info,
const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,

@ -360,10 +360,6 @@ class PdfAccessibilityTreeTest : public content::RenderViewTest {
viewport_info_.scale = 1.0;
viewport_info_.scroll = gfx::Point(0, 0);
viewport_info_.offset = gfx::Point(0, 0);
doc_info_.is_tagged = false;
doc_info_.text_accessible = true;
doc_info_.text_copyable = true;
doc_info_.page_count = 1u;
page_info_.page_index = 0u;
page_info_.text_run_count = 0u;
page_info_.char_count = 0u;
@ -401,6 +397,16 @@ class PdfAccessibilityTreeTest : public content::RenderViewTest {
}
protected:
std::unique_ptr<chrome_pdf::AccessibilityDocInfo> CreateAccessibilityDocInfo()
const {
auto doc_info = std::make_unique<chrome_pdf::AccessibilityDocInfo>();
doc_info->page_count = page_count_;
doc_info->is_tagged = false;
doc_info->text_accessible = true;
doc_info->text_copyable = true;
return doc_info;
}
chrome_pdf::AccessibilityImageInfo CreateMockInaccessibleImage() {
chrome_pdf::AccessibilityImageInfo image;
image.alt_text = "";
@ -410,7 +416,7 @@ class PdfAccessibilityTreeTest : public content::RenderViewTest {
}
chrome_pdf::AccessibilityViewportInfo viewport_info_;
chrome_pdf::AccessibilityDocInfo doc_info_;
uint32_t page_count_ = 1u;
chrome_pdf::AccessibilityPageInfo page_info_;
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs_;
std::vector<chrome_pdf::AccessibilityCharInfo> chars_;
@ -424,7 +430,8 @@ TEST_F(PdfAccessibilityTreeTest, TestEmptyPDFPage) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -439,7 +446,8 @@ TEST_F(PdfAccessibilityTreeTest, TestAccessibilityDisabledDuringPDFLoad) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
WaitForThreadTasks();
// Disable accessibility while the PDF is loading, make sure this
@ -466,7 +474,8 @@ TEST_F(PdfAccessibilityTreeTest, TestPdfAccessibilityTreeReload) {
page_info_.bounds = gfx::ToEnclosingRect(page_bounds);
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -526,7 +535,8 @@ TEST_F(PdfAccessibilityTreeTest, TestPdfAccessibilityTreeCreation) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -546,7 +556,7 @@ TEST_F(PdfAccessibilityTreeTest, TestPdfAccessibilityTreeCreation) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -618,7 +628,8 @@ TEST_F(PdfAccessibilityTreeTest, HeadingsDetectedByHeuristic) {
page_info_.text_run_count = text_runs_.size();
page_info_.char_count = chars_.size();
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
@ -628,7 +639,7 @@ TEST_F(PdfAccessibilityTreeTest, HeadingsDetectedByHeuristic) {
WaitForThreadDelayedTasks();
const ui::AXNode* pdf_root = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(pdf_root, doc_info_.page_count,
CheckRootAndStatusNodes(pdf_root, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -661,8 +672,6 @@ TEST_F(PdfAccessibilityTreeTest, HeadingsDetectedByHeuristic) {
TEST_F(PdfAccessibilityTreeTest, HeadingsDetectedFromTags) {
base::test::ScopedFeatureList pdf_tags;
pdf_tags.InitAndEnableFeature(chrome_pdf::features::kPdfTags);
doc_info_.is_tagged = true;
CreatePdfAccessibilityTree();
text_runs_ = {kFirstTextRun, kSecondTextRun};
text_runs_[0].tag_type = "H1";
@ -671,7 +680,10 @@ TEST_F(PdfAccessibilityTreeTest, HeadingsDetectedFromTags) {
chars_ = {std::begin(kDummyCharsData), std::end(kDummyCharsData)};
page_info_.text_run_count = text_runs_.size();
page_info_.char_count = chars_.size();
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
std::unique_ptr<chrome_pdf::AccessibilityDocInfo> doc_info =
CreateAccessibilityDocInfo();
doc_info->is_tagged = true;
pdf_accessibility_tree_->SetAccessibilityDocInfo(std::move(doc_info));
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
@ -681,7 +693,7 @@ TEST_F(PdfAccessibilityTreeTest, HeadingsDetectedFromTags) {
WaitForThreadDelayedTasks();
const ui::AXNode* pdf_root = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(pdf_root, doc_info_.page_count,
CheckRootAndStatusNodes(pdf_root, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -737,7 +749,8 @@ TEST_F(PdfAccessibilityTreeTest, TestOverlappingAnnots) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -755,7 +768,7 @@ TEST_F(PdfAccessibilityTreeTest, TestOverlappingAnnots) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -822,7 +835,8 @@ TEST_F(PdfAccessibilityTreeTest, TestHighlightCreation) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -841,7 +855,7 @@ TEST_F(PdfAccessibilityTreeTest, TestHighlightCreation) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -941,7 +955,8 @@ TEST_F(PdfAccessibilityTreeTest, TestTextFieldNodeCreation) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -961,7 +976,7 @@ TEST_F(PdfAccessibilityTreeTest, TestTextFieldNodeCreation) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -1096,7 +1111,8 @@ TEST_F(PdfAccessibilityTreeTest, TestButtonNodeCreation) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1118,7 +1134,7 @@ TEST_F(PdfAccessibilityTreeTest, TestButtonNodeCreation) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -1283,7 +1299,8 @@ TEST_F(PdfAccessibilityTreeTest, TestListboxNodeCreation) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1309,7 +1326,7 @@ TEST_F(PdfAccessibilityTreeTest, TestListboxNodeCreation) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -1476,7 +1493,8 @@ TEST_F(PdfAccessibilityTreeTest, TestComboboxNodeCreation) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1506,7 +1524,7 @@ TEST_F(PdfAccessibilityTreeTest, TestComboboxNodeCreation) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -1689,7 +1707,8 @@ TEST_F(PdfAccessibilityTreeTest, TestPreviousNextOnLine) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1711,7 +1730,7 @@ TEST_F(PdfAccessibilityTreeTest, TestPreviousNextOnLine) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -1810,7 +1829,8 @@ TEST_F(PdfAccessibilityTreeTest, TextRunsAndCharsMismatch) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1851,7 +1871,8 @@ TEST_F(PdfAccessibilityTreeTest, UnsortedLinkVector) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1883,7 +1904,8 @@ TEST_F(PdfAccessibilityTreeTest, OutOfBoundLink) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1922,7 +1944,8 @@ TEST_F(PdfAccessibilityTreeTest, UnsortedImageVector) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1952,7 +1975,8 @@ TEST_F(PdfAccessibilityTreeTest, OutOfBoundImage) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -1995,7 +2019,8 @@ TEST_F(PdfAccessibilityTreeTest, UnsortedHighlightVector) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2027,7 +2052,8 @@ TEST_F(PdfAccessibilityTreeTest, OutOfBoundHighlight) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2044,7 +2070,8 @@ TEST_F(PdfAccessibilityTreeTest, TestActionDataConversion) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2104,7 +2131,8 @@ TEST_F(PdfAccessibilityTreeTest, TestScrollToGlobalPointDataConversion) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2163,7 +2191,8 @@ TEST_F(PdfAccessibilityTreeTest, TestClickActionDataConversion) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2171,7 +2200,7 @@ TEST_F(PdfAccessibilityTreeTest, TestClickActionDataConversion) {
WaitForThreadDelayedTasks();
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -2216,7 +2245,8 @@ TEST_F(PdfAccessibilityTreeTest, TestEmptyPdfAxActions) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2254,7 +2284,8 @@ TEST_F(PdfAccessibilityTreeTest, TestZoomAndScaleChanges) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2270,7 +2301,7 @@ TEST_F(PdfAccessibilityTreeTest, TestZoomAndScaleChanges) {
WaitForThreadTasks();
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
ASSERT_GT(root_node->GetChildCount(), 1u);
@ -2310,7 +2341,8 @@ TEST_F(PdfAccessibilityTreeTest, TestSelectionActionDataConversion) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2318,7 +2350,7 @@ TEST_F(PdfAccessibilityTreeTest, TestSelectionActionDataConversion) {
WaitForThreadDelayedTasks();
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
ASSERT_GT(root_node->GetChildCount(), 1u);
@ -2417,7 +2449,8 @@ TEST_F(PdfAccessibilityTreeTest, TestShowContextMenuAction) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -2449,7 +2482,8 @@ TEST_F(PdfAccessibilityTreeTest, StitchChildTreeAction) {
fake_image.text_run_index = 1u;
fake_image.page_object_index = 0u;
page_objects_.images.push_back(fake_image);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
ui::AXNode fake_root(&pdf_accessibility_tree_->tree_for_testing(),
@ -2481,7 +2515,7 @@ TEST_F(PdfAccessibilityTreeTest, StitchChildTreeAction) {
WaitForThreadDelayedTasks();
ui::AXNode* pdf_root = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(pdf_root, doc_info_.page_count,
CheckRootAndStatusNodes(pdf_root, page_count_,
/*is_pdf_ocr_test=*/false, /*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -2606,7 +2640,7 @@ class PdfOcrHelperTest : public PdfAccessibilityTreeTest,
bool is_ocr_helper_started_before_pdf_loads,
bool create_empty_results) {
ASSERT_TRUE(pdf_accessibility_tree_);
doc_info_.page_count = page_count;
page_count_ = page_count;
chrome_pdf::AccessibilityImageInfo image = CreateMockInaccessibleImage();
ASSERT_EQ(0u, image.text_run_index)
@ -2621,13 +2655,14 @@ class PdfOcrHelperTest : public PdfAccessibilityTreeTest,
ASSERT_NE(nullptr, pdf_accessibility_tree_->ocr_helper_for_testing());
}
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
ASSERT_EQ(0u, text_runs_.size())
<< "OcrHelper won't run unless the PDF has no accessible text in it.";
ASSERT_EQ(0u, chars_.size())
<< "OcrHelper won't run unless the PDF has no accessible text in it.";
for (uint32_t i = 0; i < doc_info_.page_count; ++i) {
for (uint32_t i = 0; i < page_count_; ++i) {
page_info_.page_index = i;
// All pages are identical.
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
@ -2638,7 +2673,7 @@ class PdfOcrHelperTest : public PdfAccessibilityTreeTest,
WaitForThreadDelayedTasks();
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/true,
is_ocr_helper_started_before_pdf_loads,
create_empty_results);
@ -2867,7 +2902,7 @@ TEST_P(PdfOcrHelperTest, UMAMetrics) {
/*expected_count=*/1);
histograms.ExpectBucketCount("Accessibility.PdfOcr.InaccessiblePdfPageCount",
doc_info_.page_count,
page_count_,
/*expected_count=*/1);
histograms.ExpectTotalCount("Accessibility.PdfOcr.InaccessiblePdfPageCount",
/*expected_count=*/1);
@ -2922,7 +2957,7 @@ TEST_P(PdfOcrHelperTest, EmptyOCRResults) {
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
ASSERT_NE(nullptr, root_node);
ASSERT_EQ(ax::mojom::Role::kPdfRoot, root_node->GetRole());
uint32_t pages_plus_status_node_count = doc_info_.page_count + 1u;
uint32_t pages_plus_status_node_count = page_count_ + 1u;
ASSERT_EQ(pages_plus_status_node_count, root_node->GetChildCount());
ui::AXNode* status_wrapper_node = root_node->GetChildAtIndex(0);
@ -2976,7 +3011,7 @@ TEST_P(PdfOcrHelperTest, OCRCompleteNotification) {
const ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
ASSERT_NE(nullptr, root_node);
ASSERT_EQ(ax::mojom::Role::kPdfRoot, root_node->GetRole());
const uint32_t pages_plus_status_node_count = doc_info_.page_count + 1u;
const uint32_t pages_plus_status_node_count = page_count_ + 1u;
ASSERT_EQ(pages_plus_status_node_count, root_node->GetChildCount());
const ui::AXNode* status_wrapper_node = root_node->GetChildAtIndex(0);
@ -3052,7 +3087,8 @@ TEST_F(PdfOcrTest, CheckLiveRegionPoliteStatus) {
ui::AXTree& tree = pdf_accessibility_tree_->tree_for_testing();
ui::AXEventGenerator event_generator(&tree);
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
WaitForThreadTasks();
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
@ -3102,7 +3138,7 @@ TEST_F(PdfOcrTest, CheckLiveRegionPoliteStatus) {
// Wait for `PdfAccessibilityTree::UnserializeNodes()`, a delayed task.
WaitForThreadDelayedTasks();
uint32_t pages_plus_status_node_count = doc_info_.page_count + 1u;
uint32_t pages_plus_status_node_count = page_count_ + 1u;
ASSERT_EQ(pages_plus_status_node_count, root_node->GetChildCount());
ui::AXNode* page_node = root_node->GetChildAtIndex(1);
@ -3140,7 +3176,8 @@ TEST_F(PdfOcrTest, CheckLiveRegionNotSetWhenInBackground) {
page_objects_.images.push_back(CreateMockInaccessibleImage());
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
WaitForThreadTasks();
const ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
@ -3179,7 +3216,8 @@ TEST_F(PdfOcrTest, FeatureNotificationOnInaccessiblePdf) {
// Get and use the underlying AXTree to create an AXEventGenerator. This
// event generator is usually instrumented in the test.
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
WaitForThreadTasks();
page_info_.page_index = 0;
@ -3190,7 +3228,7 @@ TEST_F(PdfOcrTest, FeatureNotificationOnInaccessiblePdf) {
WaitForThreadDelayedTasks();
const ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/true,
/*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -3207,7 +3245,8 @@ TEST_F(PdfOcrTest, NoFeatureNotificationOnAccessiblePdf) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -3217,7 +3256,7 @@ TEST_F(PdfOcrTest, NoFeatureNotificationOnAccessiblePdf) {
const ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
// `is_pdf_ocr_test` needs to be set to false below, as it shouldn't announce
// the PDF OCR feature notification in this case.
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/false,
/*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -3300,7 +3339,8 @@ TEST_P(PdfOcrRotationTest, TestTransformFromOnOcrDataReceived) {
CreatePdfAccessibilityTree();
pdf_accessibility_tree_->SetAccessibilityViewportInfo(viewport_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(doc_info_);
pdf_accessibility_tree_->SetAccessibilityDocInfo(
CreateAccessibilityDocInfo());
pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info_, text_runs_,
chars_, page_objects_);
WaitForThreadTasks();
@ -3318,7 +3358,7 @@ TEST_P(PdfOcrRotationTest, TestTransformFromOnOcrDataReceived) {
*/
ui::AXNode* root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/true,
/*is_ocr_completed=*/false,
/*create_empty_ocr_results=*/false);
@ -3383,7 +3423,7 @@ TEST_P(PdfOcrRotationTest, TestTransformFromOnOcrDataReceived) {
*/
root_node = pdf_accessibility_tree_->GetRoot();
CheckRootAndStatusNodes(root_node, doc_info_.page_count,
CheckRootAndStatusNodes(root_node, page_count_,
/*is_pdf_ocr_test=*/true,
/*is_ocr_completed=*/true,
/*create_empty_ocr_results=*/false);

@ -81,6 +81,10 @@ AccessibilityImageInfo::AccessibilityImageInfo(
AccessibilityImageInfo::~AccessibilityImageInfo() = default;
AccessibilityDocInfo::AccessibilityDocInfo() = default;
AccessibilityDocInfo::~AccessibilityDocInfo() = default;
bool AccessibilityDocInfo::operator==(const AccessibilityDocInfo& other) const {
return page_count == other.page_count && is_tagged == other.is_tagged &&
text_accessible == other.text_accessible &&

@ -128,6 +128,11 @@ struct AccessibilityImageInfo {
};
struct AccessibilityDocInfo {
AccessibilityDocInfo();
AccessibilityDocInfo(const AccessibilityDocInfo&) = delete;
AccessibilityDocInfo& operator=(const AccessibilityDocInfo&) = delete;
~AccessibilityDocInfo();
bool operator==(const AccessibilityDocInfo& other) const;
bool operator!=(const AccessibilityDocInfo& other) const;

@ -5,6 +5,7 @@
#ifndef PDF_PDF_ACCESSIBILITY_DATA_HANDLER_H_
#define PDF_PDF_ACCESSIBILITY_DATA_HANDLER_H_
#include <memory>
#include <vector>
#include "services/screen_ai/buildflags/buildflags.h"
@ -24,7 +25,9 @@ class PdfAccessibilityDataHandler {
virtual void SetAccessibilityViewportInfo(
AccessibilityViewportInfo viewport_info) = 0;
virtual void SetAccessibilityDocInfo(AccessibilityDocInfo doc_info) = 0;
// `doc_info` must be non-nullptr.
virtual void SetAccessibilityDocInfo(
std::unique_ptr<AccessibilityDocInfo> doc_info) = 0;
virtual void SetAccessibilityPageInfo(
AccessibilityPageInfo page_info,
std::vector<AccessibilityTextRunInfo> text_runs,

@ -2824,15 +2824,16 @@ gfx::Point PdfViewWebPlugin::FrameToPdfCoordinates(
gfx::Vector2d(available_area_.x(), 0);
}
AccessibilityDocInfo PdfViewWebPlugin::GetAccessibilityDocInfo() const {
AccessibilityDocInfo doc_info;
doc_info.page_count = engine_->GetNumberOfPages();
std::unique_ptr<AccessibilityDocInfo>
PdfViewWebPlugin::GetAccessibilityDocInfo() const {
auto doc_info = std::make_unique<AccessibilityDocInfo>();
doc_info->page_count = engine_->GetNumberOfPages();
if (base::FeatureList::IsEnabled(chrome_pdf::features::kPdfTags)) {
doc_info.is_tagged = engine_->IsPDFDocTagged();
doc_info->is_tagged = engine_->IsPDFDocTagged();
}
doc_info.text_accessible =
doc_info->text_accessible =
engine_->HasPermission(DocumentPermission::kCopyAccessible);
doc_info.text_copyable = engine_->HasPermission(DocumentPermission::kCopy);
doc_info->text_copyable = engine_->HasPermission(DocumentPermission::kCopy);
return doc_info;
}

@ -459,7 +459,8 @@ class PdfViewWebPlugin final : public PDFiumEngineClient,
return GetContentRestrictions();
}
AccessibilityDocInfo GetAccessibilityDocInfoForTesting() const {
std::unique_ptr<AccessibilityDocInfo> GetAccessibilityDocInfoForTesting()
const {
return GetAccessibilityDocInfo();
}
@ -698,7 +699,8 @@ class PdfViewWebPlugin final : public PDFiumEngineClient,
gfx::Point FrameToPdfCoordinates(const gfx::PointF& frame_coordinates) const;
// Gets the accessibility doc info based on the information from `engine_`.
AccessibilityDocInfo GetAccessibilityDocInfo() const;
// The return value is never nullptr.
std::unique_ptr<AccessibilityDocInfo> GetAccessibilityDocInfo() const;
// Sets the accessibility information about the given `page_index` in the
// renderer.

@ -222,7 +222,7 @@ class MockPdfAccessibilityDataHandler : public PdfAccessibilityDataHandler {
(override));
MOCK_METHOD(void,
SetAccessibilityDocInfo,
(AccessibilityDocInfo),
(std::unique_ptr<AccessibilityDocInfo>),
(override));
MOCK_METHOD(void,
SetAccessibilityPageInfo,
@ -1022,24 +1022,26 @@ TEST_F(PdfViewWebPluginTest, GetContentRestrictionsWithCopyAndPrintAllowed) {
}
TEST_F(PdfViewWebPluginTest, GetAccessibilityDocInfoWithNoPermissions) {
AccessibilityDocInfo doc_info = plugin_->GetAccessibilityDocInfoForTesting();
std::unique_ptr<AccessibilityDocInfo> doc_info =
plugin_->GetAccessibilityDocInfoForTesting();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
EXPECT_FALSE(doc_info.is_tagged);
EXPECT_FALSE(doc_info.text_accessible);
EXPECT_FALSE(doc_info.text_copyable);
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info->page_count);
EXPECT_FALSE(doc_info->is_tagged);
EXPECT_FALSE(doc_info->text_accessible);
EXPECT_FALSE(doc_info->text_copyable);
}
TEST_F(PdfViewWebPluginTest, GetAccessibilityDocInfoWithPDFDocTagged) {
base::test::ScopedFeatureList scoped_feature_list(features::kPdfTags);
EXPECT_CALL(*engine_ptr_, IsPDFDocTagged).WillRepeatedly(Return(true));
AccessibilityDocInfo doc_info = plugin_->GetAccessibilityDocInfoForTesting();
std::unique_ptr<AccessibilityDocInfo> doc_info =
plugin_->GetAccessibilityDocInfoForTesting();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
EXPECT_TRUE(doc_info.is_tagged);
EXPECT_FALSE(doc_info.text_accessible);
EXPECT_FALSE(doc_info.text_copyable);
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info->page_count);
EXPECT_TRUE(doc_info->is_tagged);
EXPECT_FALSE(doc_info->text_accessible);
EXPECT_FALSE(doc_info->text_copyable);
}
TEST_F(PdfViewWebPluginTest, GetAccessibilityDocInfoWithCopyAccessibleAllowed) {
@ -1047,12 +1049,13 @@ TEST_F(PdfViewWebPluginTest, GetAccessibilityDocInfoWithCopyAccessibleAllowed) {
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kCopyAccessible))
.WillRepeatedly(Return(true));
AccessibilityDocInfo doc_info = plugin_->GetAccessibilityDocInfoForTesting();
std::unique_ptr<AccessibilityDocInfo> doc_info =
plugin_->GetAccessibilityDocInfoForTesting();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
EXPECT_FALSE(doc_info.is_tagged);
EXPECT_TRUE(doc_info.text_accessible);
EXPECT_FALSE(doc_info.text_copyable);
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info->page_count);
EXPECT_FALSE(doc_info->is_tagged);
EXPECT_TRUE(doc_info->text_accessible);
EXPECT_FALSE(doc_info->text_copyable);
}
TEST_F(PdfViewWebPluginTest, GetAccessibilityDocInfoWithCopyAllowed) {
@ -1060,12 +1063,13 @@ TEST_F(PdfViewWebPluginTest, GetAccessibilityDocInfoWithCopyAllowed) {
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kCopy))
.WillRepeatedly(Return(true));
AccessibilityDocInfo doc_info = plugin_->GetAccessibilityDocInfoForTesting();
std::unique_ptr<AccessibilityDocInfo> doc_info =
plugin_->GetAccessibilityDocInfoForTesting();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
EXPECT_FALSE(doc_info.is_tagged);
EXPECT_FALSE(doc_info.text_accessible);
EXPECT_TRUE(doc_info.text_copyable);
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info->page_count);
EXPECT_FALSE(doc_info->is_tagged);
EXPECT_FALSE(doc_info->text_accessible);
EXPECT_TRUE(doc_info->text_copyable);
}
TEST_F(PdfViewWebPluginTest,
@ -1076,12 +1080,13 @@ TEST_F(PdfViewWebPluginTest,
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kCopyAccessible))
.WillRepeatedly(Return(true));
AccessibilityDocInfo doc_info = plugin_->GetAccessibilityDocInfoForTesting();
std::unique_ptr<AccessibilityDocInfo> doc_info =
plugin_->GetAccessibilityDocInfoForTesting();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
EXPECT_FALSE(doc_info.is_tagged);
EXPECT_TRUE(doc_info.text_accessible);
EXPECT_TRUE(doc_info.text_copyable);
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info->page_count);
EXPECT_FALSE(doc_info->is_tagged);
EXPECT_TRUE(doc_info->text_accessible);
EXPECT_TRUE(doc_info->text_copyable);
}
TEST_F(
@ -1095,12 +1100,13 @@ TEST_F(
EXPECT_CALL(*engine_ptr_, HasPermission(DocumentPermission::kCopyAccessible))
.WillRepeatedly(Return(true));
AccessibilityDocInfo doc_info = plugin_->GetAccessibilityDocInfoForTesting();
std::unique_ptr<AccessibilityDocInfo> doc_info =
plugin_->GetAccessibilityDocInfoForTesting();
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info.page_count);
EXPECT_TRUE(doc_info.is_tagged);
EXPECT_TRUE(doc_info.text_accessible);
EXPECT_TRUE(doc_info.text_copyable);
EXPECT_EQ(TestPDFiumEngine::kPageNumber, doc_info->page_count);
EXPECT_TRUE(doc_info->is_tagged);
EXPECT_TRUE(doc_info->text_accessible);
EXPECT_TRUE(doc_info->text_copyable);
}
TEST_F(PdfViewWebPluginTest, UpdateGeometrySetsPluginRect) {