Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: cherry-pick 7fabaa4d from chromium #32808

Merged
merged 4 commits into from
Feb 22, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions patches/chromium/.patches
Original file line number Diff line number Diff line change
Expand Up @@ -114,5 +114,6 @@ fix_patch_out_permissions_checks_in_exclusive_access.patch
fix_aspect_ratio_with_max_size.patch
revert_do_not_display_grammar_error_if_there_it_overlaps_with_spell.patch
fix_crash_when_saving_edited_pdf_files.patch
m97_unseasoned-pdf_call_pdfviewwebplugin_a11y_methods_asyncly.patch
fire_iframe_onload_for_cross-origin-initiated_same-document.patch
do_not_select_vulkan_device_based_on_the_passed_in_gpu_info_on_linux.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Daniel Hosseinian <dhoss@chromium.org>
Date: Wed, 8 Dec 2021 00:32:35 +0000
Subject: Call PdfViewWebPlugin a11y methods asyncly

Calling a11y methods asyncly protects against the self-deletions they
may cause. The a11y methods call
content::RenderAccessibility::GenerateAXID() underneath, which may
cause a relayout which causes the PdfViewWebPlugin to be deleted.

Isolating the calls in posted tasks is a clean way to protect against
continuing control flow in the object after it is deleted.

(cherry picked from commit 6d9638366ae0f60f8d2db41857fcbc738c2514d4)

Bug: 1274376
Change-Id: Iffd610a95199826fea56d7f23cb8e344657631d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3313692
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Daniel Hosseinian <dhoss@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#948105}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3319376
Auto-Submit: Daniel Hosseinian <dhoss@chromium.org>
Cr-Commit-Position: refs/branch-heads/4692@{#799}
Cr-Branched-From: 038cd96142d384c0d2238973f1cb277725a62eba-refs/heads/main@{#938553}

diff --git a/pdf/pdf_view_web_plugin.cc b/pdf/pdf_view_web_plugin.cc
index 29f922ed74379e2d2327a896e4c8149692590de8..193ac2e1b3fed341ce460e736c107652369f87fd 100644
--- a/pdf/pdf_view_web_plugin.cc
+++ b/pdf/pdf_view_web_plugin.cc
@@ -802,9 +802,9 @@ void PdfViewWebPlugin::SetFormFieldInFocus(bool in_focus) {

void PdfViewWebPlugin::SetAccessibilityDocInfo(
const AccessibilityDocInfo& doc_info) {
- if (!pdf_accessibility_data_handler_)
- return;
- pdf_accessibility_data_handler_->SetAccessibilityDocInfo(doc_info);
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityDocInfo,
+ weak_factory_.GetWeakPtr(), doc_info));
}

void PdfViewWebPlugin::SetAccessibilityPageInfo(
@@ -812,16 +812,15 @@ void PdfViewWebPlugin::SetAccessibilityPageInfo(
std::vector<AccessibilityTextRunInfo> text_runs,
std::vector<AccessibilityCharInfo> chars,
AccessibilityPageObjects page_objects) {
- if (!pdf_accessibility_data_handler_)
- return;
- pdf_accessibility_data_handler_->SetAccessibilityPageInfo(
- page_info, text_runs, chars, page_objects);
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityPageInfo,
+ weak_factory_.GetWeakPtr(),
+ std::move(page_info), std::move(text_runs),
+ std::move(chars), std::move(page_objects)));
}

void PdfViewWebPlugin::SetAccessibilityViewportInfo(
const AccessibilityViewportInfo& viewport_info) {
- // The accessibility tree cannot be updated within the scope of
- // `UpdateGeometry`.
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE,
base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityViewportInfo,
@@ -1009,11 +1008,32 @@ void PdfViewWebPlugin::OnInvokePrintDialog(int32_t /*result*/) {
client_->Print(Container()->GetElement());
}

+void PdfViewWebPlugin::OnSetAccessibilityDocInfo(
+ AccessibilityDocInfo doc_info) {
+ if (!pdf_accessibility_data_handler_)
+ return;
+ pdf_accessibility_data_handler_->SetAccessibilityDocInfo(doc_info);
+ // `this` may be deleted. Don't do anything else.
+}
+
+void PdfViewWebPlugin::OnSetAccessibilityPageInfo(
+ AccessibilityPageInfo page_info,
+ std::vector<AccessibilityTextRunInfo> text_runs,
+ std::vector<AccessibilityCharInfo> chars,
+ AccessibilityPageObjects page_objects) {
+ if (!pdf_accessibility_data_handler_)
+ return;
+ pdf_accessibility_data_handler_->SetAccessibilityPageInfo(
+ page_info, text_runs, chars, page_objects);
+ // `this` may be deleted. Don't do anything else.
+}
+
void PdfViewWebPlugin::OnSetAccessibilityViewportInfo(
- const AccessibilityViewportInfo& viewport_info) {
+ AccessibilityViewportInfo viewport_info) {
if (!pdf_accessibility_data_handler_)
return;
pdf_accessibility_data_handler_->SetAccessibilityViewportInfo(viewport_info);
+ // `this` may be deleted. Don't do anything else.
}

pdf::mojom::PdfService* PdfViewWebPlugin::GetPdfService() {
diff --git a/pdf/pdf_view_web_plugin.h b/pdf/pdf_view_web_plugin.h
index f0c182f948ded59474e73bb03b89a3364d0b399e..f3eb489f6dc6553a67ab783814b111e2a64213fa 100644
--- a/pdf/pdf_view_web_plugin.h
+++ b/pdf/pdf_view_web_plugin.h
@@ -330,10 +330,21 @@ class PdfViewWebPlugin final : public PdfViewPluginBase,
// the plugin are moved off the main thread.
void OnInvokePrintDialog(int32_t /*result*/);

- // Callback to set the viewport information in accessibility tree
+ // Callback to set the document information in the accessibility tree
// asynchronously.
- void OnSetAccessibilityViewportInfo(
- const AccessibilityViewportInfo& viewport_info);
+ void OnSetAccessibilityDocInfo(AccessibilityDocInfo doc_info);
+
+ // Callback to set the page information in the accessibility tree
+ // asynchronously.
+ void OnSetAccessibilityPageInfo(
+ AccessibilityPageInfo page_info,
+ std::vector<AccessibilityTextRunInfo> text_runs,
+ std::vector<AccessibilityCharInfo> chars,
+ AccessibilityPageObjects page_objects);
+
+ // Callback to set the viewport information in the accessibility tree
+ // asynchronously.
+ void OnSetAccessibilityViewportInfo(AccessibilityViewportInfo viewport_info);

// May be null in unit tests.
pdf::mojom::PdfService* GetPdfService();