Skip to content

Commit 6d96383

Browse files
Daniel HosseinianChromium LUCI CQ
authored andcommitted
[unseasoned-pdf] 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. 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-Commit-Position: refs/heads/main@{#948105}
1 parent 5c23f1c commit 6d96383

File tree

2 files changed

+44
-13
lines changed

2 files changed

+44
-13
lines changed

pdf/pdf_view_web_plugin.cc

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -852,26 +852,25 @@ void PdfViewWebPlugin::SetFormTextFieldInFocus(bool in_focus) {
852852

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

860860
void PdfViewWebPlugin::SetAccessibilityPageInfo(
861861
AccessibilityPageInfo page_info,
862862
std::vector<AccessibilityTextRunInfo> text_runs,
863863
std::vector<AccessibilityCharInfo> chars,
864864
AccessibilityPageObjects page_objects) {
865-
if (!pdf_accessibility_data_handler_)
866-
return;
867-
pdf_accessibility_data_handler_->SetAccessibilityPageInfo(
868-
page_info, text_runs, chars, page_objects);
865+
base::ThreadTaskRunnerHandle::Get()->PostTask(
866+
FROM_HERE, base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityPageInfo,
867+
weak_factory_.GetWeakPtr(),
868+
std::move(page_info), std::move(text_runs),
869+
std::move(chars), std::move(page_objects)));
869870
}
870871

871872
void PdfViewWebPlugin::SetAccessibilityViewportInfo(
872873
const AccessibilityViewportInfo& viewport_info) {
873-
// The accessibility tree cannot be updated within the scope of
874-
// `UpdateGeometry`.
875874
base::ThreadTaskRunnerHandle::Get()->PostTask(
876875
FROM_HERE,
877876
base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityViewportInfo,
@@ -1053,11 +1052,32 @@ void PdfViewWebPlugin::OnInvokePrintDialog(int32_t /*result*/) {
10531052
client_->Print(Container()->GetElement());
10541053
}
10551054

1055+
void PdfViewWebPlugin::OnSetAccessibilityDocInfo(
1056+
AccessibilityDocInfo doc_info) {
1057+
if (!pdf_accessibility_data_handler_)
1058+
return;
1059+
pdf_accessibility_data_handler_->SetAccessibilityDocInfo(doc_info);
1060+
// `this` may be deleted. Don't do anything else.
1061+
}
1062+
1063+
void PdfViewWebPlugin::OnSetAccessibilityPageInfo(
1064+
AccessibilityPageInfo page_info,
1065+
std::vector<AccessibilityTextRunInfo> text_runs,
1066+
std::vector<AccessibilityCharInfo> chars,
1067+
AccessibilityPageObjects page_objects) {
1068+
if (!pdf_accessibility_data_handler_)
1069+
return;
1070+
pdf_accessibility_data_handler_->SetAccessibilityPageInfo(
1071+
page_info, text_runs, chars, page_objects);
1072+
// `this` may be deleted. Don't do anything else.
1073+
}
1074+
10561075
void PdfViewWebPlugin::OnSetAccessibilityViewportInfo(
1057-
const AccessibilityViewportInfo& viewport_info) {
1076+
AccessibilityViewportInfo viewport_info) {
10581077
if (!pdf_accessibility_data_handler_)
10591078
return;
10601079
pdf_accessibility_data_handler_->SetAccessibilityViewportInfo(viewport_info);
1080+
// `this` may be deleted. Don't do anything else.
10611081
}
10621082

10631083
pdf::mojom::PdfService* PdfViewWebPlugin::GetPdfService() {

pdf/pdf_view_web_plugin.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,21 @@ class PdfViewWebPlugin final : public PdfViewPluginBase,
338338
// the plugin are moved off the main thread.
339339
void OnInvokePrintDialog(int32_t /*result*/);
340340

341-
// Callback to set the viewport information in accessibility tree
341+
// Callback to set the document information in the accessibility tree
342342
// asynchronously.
343-
void OnSetAccessibilityViewportInfo(
344-
const AccessibilityViewportInfo& viewport_info);
343+
void OnSetAccessibilityDocInfo(AccessibilityDocInfo doc_info);
344+
345+
// Callback to set the page information in the accessibility tree
346+
// asynchronously.
347+
void OnSetAccessibilityPageInfo(
348+
AccessibilityPageInfo page_info,
349+
std::vector<AccessibilityTextRunInfo> text_runs,
350+
std::vector<AccessibilityCharInfo> chars,
351+
AccessibilityPageObjects page_objects);
352+
353+
// Callback to set the viewport information in the accessibility tree
354+
// asynchronously.
355+
void OnSetAccessibilityViewportInfo(AccessibilityViewportInfo viewport_info);
345356

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

0 commit comments

Comments
 (0)