0

Reland "Add annotation structs for PDF accessibility"

This is a reland of 4389c2c30c

This change was reverted due to "Windows Deterministic" bot failing. These bots
seems to have a problem with any changes to ppapi/. I am suppressing the errors
in CL:1924340.

This is the exact same CL as the one that was reverted.

Original change's description:
> Add annotation structs for PDF accessibility
>
> This change adds new *AccessibilityAnnotInfo structs to transfer
> accessibility related PDF annotation data from the plugin process up to
> the mimehandler process via the pepper API. This annotation information
> is bundled along with links and images into the
> *AccessibilityPageObjects group of structs introduced as a part of
> http://crrev.com/c/1831957. It will be populated from within pdfium_page
> in a subsequent change.
>
> Bug: 1008775
> Change-Id: I89eabc8f56c135eac95c2c887d33854fbccbbcb7
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1837558
> Reviewed-by: Daniel Cheng <dcheng@chromium.org>
> Reviewed-by: Lei Zhang <thestig@chromium.org>
> Reviewed-by: Kevin Babbitt <kbabbitt@microsoft.com>
> Reviewed-by: Bill Budge <bbudge@chromium.org>
> Reviewed-by: Ian Prest <iapres@microsoft.com>
> Commit-Queue: Kalpak Tapas <katapas@microsoft.com>
> Cr-Commit-Position: refs/heads/master@{#716555}

TBR=dcheng@chromium.org,kbabbitt@microsoft.com,bbudge@chromium.org,
iapres@microsoft.com

Bug: 1008775
Change-Id: I6fa8d63e81076dae291ccc74cd9a32e5eb78078d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1926107
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Ankit Kumar 🌪️ <ankk@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#718075}
This commit is contained in:
Kalpak Tapas
2019-11-22 09:36:51 +00:00
committed by Commit Bot
parent 6809382184
commit decd58f2f3
8 changed files with 112 additions and 1 deletions

@ -191,6 +191,7 @@ bool GetAccessibilityInfo(
&page_objects->links);
GetAccessibilityImageInfo(engine, page_index, page_info->text_run_count,
&page_objects->images);
// TODO(crbug.com/1008775): Populate highlights
return true;
}

@ -149,7 +149,29 @@ struct PP_PrivateAccessibilityImageInfo {
struct PP_FloatRect bounds;
};
// Holds links and images within a PDF page so that IPC messages
// This holds text highlight information provided by the PDF and will be
// used in accessibility to expose it. Text highlights can have an associated
// popup note, the data of which is also captured here.
// Needs to stay in sync with C++ versions (PdfAccessibilityHighlightInfo and
// PrivateAccessibilityHighlightInfo).
struct PP_PrivateAccessibilityHighlightInfo {
// Represents the text of the associated popup note, if present.
const char* note_text;
uint32_t note_text_length;
// Index of the highlight in the page annotation list. Used to identify the
// annotation on which action needs to be performed.
uint32_t index_in_page;
// Highlights are annotations over existing page text. |text_run_index|
// denotes the index of the text run where the highlight starts and
// |text_run_count| denotes the number of text runs which the highlight spans
// across.
uint32_t text_run_index;
uint32_t text_run_count;
// Bounding box of the highlight.
struct PP_FloatRect bounds;
};
// Holds links, images and highlights within a PDF page so that IPC messages
// passing accessibility objects do not have too many parameters.
// Needs to stay in sync with C++ versions (PdfAccessibilityPageObjects and
// PrivateAccessibilityPageObjects).
@ -158,6 +180,8 @@ struct PP_PrivateAccessibilityPageObjects {
uint32_t link_count;
struct PP_PrivateAccessibilityImageInfo* images;
uint32_t image_count;
struct PP_PrivateAccessibilityHighlightInfo* highlights;
uint32_t highlight_count;
};
struct PPB_PDF {

@ -61,6 +61,17 @@ void ConvertPrivateAccessibilityImageInfo(
info->bounds = image.bounds;
}
void ConvertPrivateAccessibilityHighlightInfo(
const PDF::PrivateAccessibilityHighlightInfo& highlight,
PP_PrivateAccessibilityHighlightInfo* info) {
info->note_text = highlight.note_text.c_str();
info->note_text_length = highlight.note_text.size();
info->index_in_page = highlight.index_in_page;
info->text_run_index = highlight.text_run_index;
info->text_run_count = highlight.text_run_count;
info->bounds = highlight.bounds;
}
} // namespace
// static
@ -262,11 +273,22 @@ void PDF::SetAccessibilityPageInfo(
for (size_t i = 0; i < images.size(); ++i)
ConvertPrivateAccessibilityImageInfo(images[i], &image_info[i]);
const std::vector<PrivateAccessibilityHighlightInfo>& highlights =
page_objects.highlights;
std::vector<PP_PrivateAccessibilityHighlightInfo> highlight_info(
highlights.size());
for (size_t i = 0; i < highlights.size(); ++i) {
ConvertPrivateAccessibilityHighlightInfo(highlights[i],
&highlight_info[i]);
}
PP_PrivateAccessibilityPageObjects pp_page_objects;
pp_page_objects.links = link_info.data();
pp_page_objects.link_count = link_info.size();
pp_page_objects.images = image_info.data();
pp_page_objects.image_count = image_info.size();
pp_page_objects.highlights = highlight_info.data();
pp_page_objects.highlight_count = highlight_info.size();
get_interface<PPB_PDF>()->SetAccessibilityPageInfo(
instance.pp_instance(), page_info, text_run_info.data(), chars.data(),

@ -49,7 +49,10 @@ class PDF {
// Needs to stay in sync with the C version.
struct PrivateAccessibilityLinkInfo {
std::string url;
// Index of this link in the collection of links in the page.
uint32_t index_in_page;
// Index of the starting text run of this link in the collection of all
// text runs in the page.
uint32_t text_run_index;
uint32_t text_run_count;
FloatRect bounds;
@ -63,11 +66,25 @@ class PDF {
FloatRect bounds;
};
// C++ version of PP_PrivateAccessibilityHighlightInfo.
// Needs to stay in sync with the C version.
struct PrivateAccessibilityHighlightInfo {
std::string note_text;
// Index of this highlight in the collection of highlights in the page.
uint32_t index_in_page;
// Index of the starting text run of this highlight in the collection of all
// text runs in the page.
uint32_t text_run_index;
uint32_t text_run_count;
FloatRect bounds;
};
// C++ version of PP_PrivateAccessibilityPageObjects.
// Needs to stay in sync with the C version.
struct PrivateAccessibilityPageObjects {
std::vector<PrivateAccessibilityLinkInfo> links;
std::vector<PrivateAccessibilityImageInfo> images;
std::vector<PrivateAccessibilityHighlightInfo> highlights;
};
// Returns true if the required interface is available.

@ -236,10 +236,16 @@ void PDFResource::SetAccessibilityPageInfo(
for (size_t i = 0; i < page_objects->image_count; i++) {
image_vector.emplace_back(page_objects->images[i]);
}
std::vector<ppapi::PdfAccessibilityHighlightInfo> highlight_vector;
highlight_vector.reserve(page_objects->highlight_count);
for (size_t i = 0; i < page_objects->highlight_count; i++) {
highlight_vector.emplace_back(page_objects->highlights[i]);
}
ppapi::PdfAccessibilityPageObjects ppapi_page_objects;
ppapi_page_objects.links = std::move(link_vector);
ppapi_page_objects.images = std::move(image_vector);
ppapi_page_objects.highlights = std::move(highlight_vector);
Post(RENDERER,
PpapiHostMsg_PDF_SetAccessibilityPageInfo(

@ -314,9 +314,18 @@ IPC_STRUCT_TRAITS_BEGIN(ppapi::PdfAccessibilityImageInfo)
IPC_STRUCT_TRAITS_MEMBER(bounds)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(ppapi::PdfAccessibilityHighlightInfo)
IPC_STRUCT_TRAITS_MEMBER(note_text)
IPC_STRUCT_TRAITS_MEMBER(index_in_page)
IPC_STRUCT_TRAITS_MEMBER(text_run_index)
IPC_STRUCT_TRAITS_MEMBER(text_run_count)
IPC_STRUCT_TRAITS_MEMBER(bounds)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(ppapi::PdfAccessibilityPageObjects)
IPC_STRUCT_TRAITS_MEMBER(links)
IPC_STRUCT_TRAITS_MEMBER(images)
IPC_STRUCT_TRAITS_MEMBER(highlights)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(PP_URLComponent_Dev)

@ -60,6 +60,18 @@ PdfAccessibilityImageInfo::PdfAccessibilityImageInfo(
PdfAccessibilityImageInfo::~PdfAccessibilityImageInfo() = default;
PdfAccessibilityHighlightInfo::PdfAccessibilityHighlightInfo() = default;
PdfAccessibilityHighlightInfo::~PdfAccessibilityHighlightInfo() = default;
PdfAccessibilityHighlightInfo::PdfAccessibilityHighlightInfo(
const PP_PrivateAccessibilityHighlightInfo& highlight)
: note_text(std::string(highlight.note_text, highlight.note_text_length)),
index_in_page(highlight.index_in_page),
text_run_index(highlight.text_run_index),
text_run_count(highlight.text_run_count),
bounds(highlight.bounds) {}
PdfAccessibilityPageObjects::PdfAccessibilityPageObjects() = default;
PdfAccessibilityPageObjects::PdfAccessibilityPageObjects(
@ -73,6 +85,11 @@ PdfAccessibilityPageObjects::PdfAccessibilityPageObjects(
for (size_t i = 0; i < page_objects.image_count; i++) {
images.emplace_back(page_objects.images[i]);
}
highlights.reserve(page_objects.highlight_count);
for (size_t i = 0; i < page_objects.highlight_count; i++) {
highlights.emplace_back(page_objects.highlights[i]);
}
}
PdfAccessibilityPageObjects::~PdfAccessibilityPageObjects() = default;

@ -75,6 +75,20 @@ struct PPAPI_SHARED_EXPORT PdfAccessibilityImageInfo {
PP_FloatRect bounds;
};
// Needs to stay in sync with PP_PrivateAccessibilityHighlightInfo.
struct PPAPI_SHARED_EXPORT PdfAccessibilityHighlightInfo {
PdfAccessibilityHighlightInfo();
explicit PdfAccessibilityHighlightInfo(
const PP_PrivateAccessibilityHighlightInfo& highlight);
~PdfAccessibilityHighlightInfo();
std::string note_text;
uint32_t index_in_page;
uint32_t text_run_index;
uint32_t text_run_count;
PP_FloatRect bounds;
};
// Needs to stay in sync with PP_PrivateAccessibilityPageObjects.
struct PPAPI_SHARED_EXPORT PdfAccessibilityPageObjects {
PdfAccessibilityPageObjects();
@ -84,6 +98,7 @@ struct PPAPI_SHARED_EXPORT PdfAccessibilityPageObjects {
std::vector<PdfAccessibilityLinkInfo> links;
std::vector<PdfAccessibilityImageInfo> images;
std::vector<PdfAccessibilityHighlightInfo> highlights;
};
} // namespace ppapi