[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}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
5c23f1c1d1
commit
6d9638366a
@@ -852,9 +852,9 @@ void PdfViewWebPlugin::SetFormTextFieldInFocus(bool in_focus) {
|
|||||||
|
|
||||||
void PdfViewWebPlugin::SetAccessibilityDocInfo(
|
void PdfViewWebPlugin::SetAccessibilityDocInfo(
|
||||||
const AccessibilityDocInfo& doc_info) {
|
const AccessibilityDocInfo& doc_info) {
|
||||||
if (!pdf_accessibility_data_handler_)
|
base::ThreadTaskRunnerHandle::Get()->PostTask(
|
||||||
return;
|
FROM_HERE, base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityDocInfo,
|
||||||
pdf_accessibility_data_handler_->SetAccessibilityDocInfo(doc_info);
|
weak_factory_.GetWeakPtr(), doc_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PdfViewWebPlugin::SetAccessibilityPageInfo(
|
void PdfViewWebPlugin::SetAccessibilityPageInfo(
|
||||||
@@ -862,16 +862,15 @@ void PdfViewWebPlugin::SetAccessibilityPageInfo(
|
|||||||
std::vector<AccessibilityTextRunInfo> text_runs,
|
std::vector<AccessibilityTextRunInfo> text_runs,
|
||||||
std::vector<AccessibilityCharInfo> chars,
|
std::vector<AccessibilityCharInfo> chars,
|
||||||
AccessibilityPageObjects page_objects) {
|
AccessibilityPageObjects page_objects) {
|
||||||
if (!pdf_accessibility_data_handler_)
|
base::ThreadTaskRunnerHandle::Get()->PostTask(
|
||||||
return;
|
FROM_HERE, base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityPageInfo,
|
||||||
pdf_accessibility_data_handler_->SetAccessibilityPageInfo(
|
weak_factory_.GetWeakPtr(),
|
||||||
page_info, text_runs, chars, page_objects);
|
std::move(page_info), std::move(text_runs),
|
||||||
|
std::move(chars), std::move(page_objects)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PdfViewWebPlugin::SetAccessibilityViewportInfo(
|
void PdfViewWebPlugin::SetAccessibilityViewportInfo(
|
||||||
const AccessibilityViewportInfo& viewport_info) {
|
const AccessibilityViewportInfo& viewport_info) {
|
||||||
// The accessibility tree cannot be updated within the scope of
|
|
||||||
// `UpdateGeometry`.
|
|
||||||
base::ThreadTaskRunnerHandle::Get()->PostTask(
|
base::ThreadTaskRunnerHandle::Get()->PostTask(
|
||||||
FROM_HERE,
|
FROM_HERE,
|
||||||
base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityViewportInfo,
|
base::BindOnce(&PdfViewWebPlugin::OnSetAccessibilityViewportInfo,
|
||||||
@@ -1053,11 +1052,32 @@ void PdfViewWebPlugin::OnInvokePrintDialog(int32_t /*result*/) {
|
|||||||
client_->Print(Container()->GetElement());
|
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(
|
void PdfViewWebPlugin::OnSetAccessibilityViewportInfo(
|
||||||
const AccessibilityViewportInfo& viewport_info) {
|
AccessibilityViewportInfo viewport_info) {
|
||||||
if (!pdf_accessibility_data_handler_)
|
if (!pdf_accessibility_data_handler_)
|
||||||
return;
|
return;
|
||||||
pdf_accessibility_data_handler_->SetAccessibilityViewportInfo(viewport_info);
|
pdf_accessibility_data_handler_->SetAccessibilityViewportInfo(viewport_info);
|
||||||
|
// `this` may be deleted. Don't do anything else.
|
||||||
}
|
}
|
||||||
|
|
||||||
pdf::mojom::PdfService* PdfViewWebPlugin::GetPdfService() {
|
pdf::mojom::PdfService* PdfViewWebPlugin::GetPdfService() {
|
||||||
|
@@ -338,10 +338,21 @@ class PdfViewWebPlugin final : public PdfViewPluginBase,
|
|||||||
// the plugin are moved off the main thread.
|
// the plugin are moved off the main thread.
|
||||||
void OnInvokePrintDialog(int32_t /*result*/);
|
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.
|
// asynchronously.
|
||||||
void OnSetAccessibilityViewportInfo(
|
void OnSetAccessibilityDocInfo(AccessibilityDocInfo doc_info);
|
||||||
const AccessibilityViewportInfo& viewport_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.
|
// May be null in unit tests.
|
||||||
pdf::mojom::PdfService* GetPdfService();
|
pdf::mojom::PdfService* GetPdfService();
|
||||||
|
Reference in New Issue
Block a user