0

Modify PDF accessibility interfaces to send data for links and images

This change modifies the existing PDF interfaces to send data for links
and images. This extends the existing pipeline to accommodate links and
images which is part of the larger effort to make links and images
accessible in PDF. This extends the messaging pipeline between plugin
process and mimehandler process to send links and images.

This doesn't have any changes pertaining to actual data being populated
in the structures. In future CL's the data will be populated in the
structures for links and images.

Bug: 981448
Change-Id: Iee0b1ffae36df57772a739937c240aec5e01dd02
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1703627
Commit-Queue: Kevin Babbitt <kbabbitt@microsoft.com>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Raymes Khoury <raymes@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Kevin Babbitt <kbabbitt@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#682921}
This commit is contained in:
Ankit Kumar 🌪️
2019-07-31 21:11:50 +00:00
committed by Commit Bot
parent ef44665f24
commit 17662bdc9b
17 changed files with 221 additions and 27 deletions

@ -278,7 +278,9 @@ int32_t PepperPDFHost::OnHostMsgSetAccessibilityPageInfo(
ppapi::host::HostMessageContext* context,
const PP_PrivateAccessibilityPageInfo& page_info,
const std::vector<PP_PrivateAccessibilityTextRunInfo>& text_run_info,
const std::vector<PP_PrivateAccessibilityCharInfo>& chars) {
const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
const std::vector<ppapi::PdfAccessibilityLinkInfo>& links,
const std::vector<ppapi::PdfAccessibilityImageInfo>& images) {
if (!host_->GetPluginInstance(pp_instance()))
return PP_ERROR_FAILED;
CreatePdfAccessibilityTreeIfNeeded();

@ -21,6 +21,7 @@
#include "ppapi/c/private/ppb_pdf.h"
#include "ppapi/host/resource_host.h"
#include "ppapi/proxy/serialized_structs.h"
#include "ppapi/shared_impl/pdf_accessibility_shared.h"
namespace blink {
class WebLocalFrame;
@ -117,7 +118,9 @@ class PepperPDFHost : public ppapi::host::ResourceHost,
ppapi::host::HostMessageContext* context,
const PP_PrivateAccessibilityPageInfo& page_info,
const std::vector<PP_PrivateAccessibilityTextRunInfo>& text_runs,
const std::vector<PP_PrivateAccessibilityCharInfo>& chars);
const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
const std::vector<ppapi::PdfAccessibilityLinkInfo>& links,
const std::vector<ppapi::PdfAccessibilityImageInfo>& images);
int32_t OnHostMsgSelectionChanged(ppapi::host::HostMessageContext* context,
const PP_FloatPoint& left,
int32_t left_height,

@ -14,7 +14,9 @@ bool GetAccessibilityInfo(
int32_t page_index,
PP_PrivateAccessibilityPageInfo* page_info,
std::vector<PP_PrivateAccessibilityTextRunInfo>* text_runs,
std::vector<PP_PrivateAccessibilityCharInfo>* chars) {
std::vector<PP_PrivateAccessibilityCharInfo>* chars,
std::vector<PP_PrivateAccessibilityLinkInfo>* links,
std::vector<PP_PrivateAccessibilityImageInfo>* images) {
int page_count = engine->GetNumberOfPages();
if (page_index < 0 || page_index >= page_count)
return false;
@ -70,6 +72,9 @@ bool GetAccessibilityInfo(
}
page_info->text_run_count = text_runs->size();
// TODO(crbug.com/981448): Populate |links| and |images|.
page_info->link_count = links->size();
page_info->image_count = images->size();
return true;
}

@ -10,6 +10,8 @@
#include <vector>
struct PP_PrivateAccessibilityCharInfo;
struct PP_PrivateAccessibilityImageInfo;
struct PP_PrivateAccessibilityLinkInfo;
struct PP_PrivateAccessibilityPageInfo;
struct PP_PrivateAccessibilityTextRunInfo;
@ -17,15 +19,18 @@ namespace chrome_pdf {
class PDFEngine;
// Retrieve |page_info|, |text_runs|, and |chars| from |engine| for the page at
// 0-indexed |page_index|. Returns true on success with all out parameters
// filled, or false on failure with all out parameters untouched.
// Retrieve |page_info|, |text_runs|, |chars|, |links| and |images| from
// |engine| for the page at 0-indexed |page_index|. Returns true on success with
// all out parameters filled, or false on failure with all out parameters
// untouched.
bool GetAccessibilityInfo(
PDFEngine* engine,
int32_t page_index,
PP_PrivateAccessibilityPageInfo* page_info,
std::vector<PP_PrivateAccessibilityTextRunInfo>* text_runs,
std::vector<PP_PrivateAccessibilityCharInfo>* chars);
std::vector<PP_PrivateAccessibilityCharInfo>* chars,
std::vector<PP_PrivateAccessibilityLinkInfo>* links,
std::vector<PP_PrivateAccessibilityImageInfo>* images);
} // namespace chrome_pdf

@ -952,13 +952,16 @@ void OutOfProcessInstance::SendNextAccessibilityPage(int32_t page_index) {
PP_PrivateAccessibilityPageInfo page_info;
std::vector<PP_PrivateAccessibilityTextRunInfo> text_runs;
std::vector<PP_PrivateAccessibilityCharInfo> chars;
std::vector<PP_PrivateAccessibilityLinkInfo> links;
std::vector<PP_PrivateAccessibilityImageInfo> images;
if (!GetAccessibilityInfo(engine_.get(), page_index, &page_info, &text_runs,
&chars)) {
&chars, &links, &images)) {
return;
}
pp::PDF::SetAccessibilityPageInfo(GetPluginInstance(), &page_info,
text_runs.data(), chars.data());
text_runs.data(), chars.data(),
links.data(), images.data());
// Schedule loading the next page.
pp::CompletionCallback callback = callback_factory_.NewCallback(

@ -76,8 +76,10 @@ TEST_F(AccessibilityTest, GetAccessibilityPage) {
PP_PrivateAccessibilityPageInfo page_info;
std::vector<PP_PrivateAccessibilityTextRunInfo> text_runs;
std::vector<PP_PrivateAccessibilityCharInfo> chars;
ASSERT_TRUE(
GetAccessibilityInfo(engine.get(), 0, &page_info, &text_runs, &chars));
std::vector<PP_PrivateAccessibilityLinkInfo> links;
std::vector<PP_PrivateAccessibilityImageInfo> images;
ASSERT_TRUE(GetAccessibilityInfo(engine.get(), 0, &page_info, &text_runs,
&chars, &links, &images));
EXPECT_EQ(0u, page_info.page_index);
EXPECT_EQ(5, page_info.bounds.point.x);
EXPECT_EQ(3, page_info.bounds.point.y);
@ -85,6 +87,10 @@ TEST_F(AccessibilityTest, GetAccessibilityPage) {
EXPECT_EQ(266, page_info.bounds.size.height);
EXPECT_EQ(text_runs.size(), page_info.text_run_count);
EXPECT_EQ(chars.size(), page_info.char_count);
// TODO(crbug.com/981448): Test the contents of |links| and |images| when
// populated.
EXPECT_EQ(links.size(), page_info.link_count);
EXPECT_EQ(images.size(), page_info.image_count);
#if defined(OS_CHROMEOS)
bool is_chromeos = base::SysInfo::IsRunningOnChromeOS();

@ -63,6 +63,8 @@ struct PP_PrivateAccessibilityPageInfo {
struct PP_Rect bounds;
uint32_t text_run_count;
uint32_t char_count;
uint32_t link_count;
uint32_t image_count;
};
struct PP_PrivateAccessibilityTextRunInfo {
@ -77,6 +79,41 @@ struct PP_PrivateAccessibilityCharInfo {
double char_width;
};
// This holds the link information provided by the PDF and will be used in
// accessibility to provide the link information.
struct PP_PrivateAccessibilityLinkInfo {
// URL of the link.
const char* url;
uint32_t url_length;
// Index of the link in the page. This will be used to identify the link on
// which action has to be performed in the page.
uint32_t index_in_page;
// Link can either be part of the page text or not. If the link is part of the
// page text, then |text_run_index| denotes the text run which contains the
// start_index of the link and the |text_run_count| equals the number of text
// runs the link spans in the page text. If the link is not part of the page
// text then |text_run_count| should be 0 and the |text_run_index| should
// contain the nearest char index to the bounding rectangle of the link.
uint32_t text_run_index;
uint32_t text_run_count;
// Bounding box of the link.
struct PP_FloatRect bounds;
};
// This holds the image information provided by the PDF and will be used in
// accessibility to provide the image information.
struct PP_PrivateAccessibilityImageInfo {
// Alternate text for the image provided by PDF.
const char* alt_text;
uint32_t alt_text_length;
// We anchor the image to a char index, this denotes the text run before
// which the image should be inserted in the accessibility tree. The text run
// at this index should contain the anchor char index.
uint32_t text_run_index;
// Bounding box of the image.
struct PP_FloatRect bounds;
};
struct PPB_PDF {
// Returns a resource identifying a font file corresponding to the given font
// request after applying the browser-specific fallback.
@ -159,7 +196,9 @@ struct PPB_PDF {
PP_Instance instance,
struct PP_PrivateAccessibilityPageInfo* page_info,
struct PP_PrivateAccessibilityTextRunInfo text_runs[],
struct PP_PrivateAccessibilityCharInfo chars[]);
struct PP_PrivateAccessibilityCharInfo chars[],
struct PP_PrivateAccessibilityLinkInfo links[],
struct PP_PrivateAccessibilityImageInfo images[]);
// Sends information about the PDF's URL and the embedder's URL.
void (*SetCrashData)(PP_Instance instance,

@ -204,10 +204,12 @@ void PDF::SetAccessibilityPageInfo(
const InstanceHandle& instance,
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[]) {
PP_PrivateAccessibilityCharInfo chars[],
PP_PrivateAccessibilityLinkInfo links[],
PP_PrivateAccessibilityImageInfo images[]) {
if (has_interface<PPB_PDF>()) {
get_interface<PPB_PDF>()->SetAccessibilityPageInfo(
instance.pp_instance(), page_info, text_runs, chars);
instance.pp_instance(), page_info, text_runs, chars, links, images);
}
}

@ -74,7 +74,9 @@ class PDF {
const InstanceHandle& instance,
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[]);
PP_PrivateAccessibilityCharInfo chars[],
PP_PrivateAccessibilityLinkInfo links[],
PP_PrivateAccessibilityImageInfo images[]);
static void SetCrashData(const InstanceHandle& instance,
const char* pdf_url,
const char* top_level_url);

@ -18,6 +18,7 @@
#include "ppapi/c/private/ppb_pdf.h"
#include "ppapi/proxy/plugin_globals.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/shared_impl/pdf_accessibility_shared.h"
#include "ppapi/shared_impl/var.h"
#include "third_party/icu/source/i18n/unicode/usearch.h"
@ -212,13 +213,31 @@ void PDFResource::SetAccessibilityViewportInfo(
void PDFResource::SetAccessibilityPageInfo(
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[]) {
PP_PrivateAccessibilityCharInfo chars[],
PP_PrivateAccessibilityLinkInfo links[],
PP_PrivateAccessibilityImageInfo images[]) {
std::vector<PP_PrivateAccessibilityTextRunInfo> text_run_vector(
text_runs, text_runs + page_info->text_run_count);
std::vector<PP_PrivateAccessibilityCharInfo> char_vector(
chars, chars + page_info->char_count);
// Pepper APIs require us to pass strings as char*, but IPC expects
// std::string. Convert information for links and images to meet these
// requirements.
std::vector<ppapi::PdfAccessibilityLinkInfo> link_vector;
link_vector.reserve(page_info->link_count);
for (size_t i = 0; i < page_info->link_count; i++) {
ppapi::PdfAccessibilityLinkInfo link(links[i]);
link_vector.emplace_back(link);
}
std::vector<ppapi::PdfAccessibilityImageInfo> image_vector;
image_vector.reserve(page_info->image_count);
for (size_t i = 0; i < page_info->image_count; i++) {
ppapi::PdfAccessibilityImageInfo image(images[i]);
image_vector.emplace_back(image);
}
Post(RENDERER, PpapiHostMsg_PDF_SetAccessibilityPageInfo(
*page_info, text_run_vector, char_vector));
*page_info, text_run_vector, char_vector, link_vector,
image_vector));
}
void PDFResource::SetCrashData(const char* pdf_url, const char* top_level_url) {

@ -63,7 +63,9 @@ class PPAPI_PROXY_EXPORT PDFResource
void SetAccessibilityPageInfo(
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[]) override;
PP_PrivateAccessibilityCharInfo chars[],
PP_PrivateAccessibilityLinkInfo links[],
PP_PrivateAccessibilityImageInfo images[]) override;
void SetCrashData(const char* pdf_url, const char* top_level_url) override;
void SelectionChanged(const PP_FloatPoint& left,
int32_t left_height,

@ -79,6 +79,7 @@
#include "ppapi/shared_impl/file_ref_create_info.h"
#include "ppapi/shared_impl/media_stream_audio_track_shared.h"
#include "ppapi/shared_impl/media_stream_video_track_shared.h"
#include "ppapi/shared_impl/pdf_accessibility_shared.h"
#include "ppapi/shared_impl/ppapi_nacl_plugin_args.h"
#include "ppapi/shared_impl/ppapi_preferences.h"
#include "ppapi/shared_impl/ppb_device_ref_shared.h"
@ -273,6 +274,22 @@ IPC_STRUCT_TRAITS_BEGIN(PP_PrivateAccessibilityPageInfo)
IPC_STRUCT_TRAITS_MEMBER(bounds)
IPC_STRUCT_TRAITS_MEMBER(text_run_count)
IPC_STRUCT_TRAITS_MEMBER(char_count)
IPC_STRUCT_TRAITS_MEMBER(link_count)
IPC_STRUCT_TRAITS_MEMBER(image_count)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(ppapi::PdfAccessibilityLinkInfo)
IPC_STRUCT_TRAITS_MEMBER(url)
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::PdfAccessibilityImageInfo)
IPC_STRUCT_TRAITS_MEMBER(alt_text)
IPC_STRUCT_TRAITS_MEMBER(text_run_index)
IPC_STRUCT_TRAITS_MEMBER(bounds)
IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(PP_URLComponent_Dev)
@ -2363,11 +2380,13 @@ IPC_MESSAGE_CONTROL1(
PP_PrivateAccessibilityDocInfo /* doc_info */)
// Send information about one page for accessibility support.
IPC_MESSAGE_CONTROL3(
IPC_MESSAGE_CONTROL5(
PpapiHostMsg_PDF_SetAccessibilityPageInfo,
PP_PrivateAccessibilityPageInfo /* page_info */,
std::vector<PP_PrivateAccessibilityTextRunInfo> /* text_runs */,
std::vector<PP_PrivateAccessibilityCharInfo> /* chars */)
std::vector<PP_PrivateAccessibilityCharInfo> /* chars */,
std::vector<ppapi::PdfAccessibilityLinkInfo> /* links */,
std::vector<ppapi::PdfAccessibilityImageInfo> /* images */)
// Send information about the selection coordinates.
IPC_MESSAGE_CONTROL4(PpapiHostMsg_PDF_SelectionChanged,

@ -48,6 +48,8 @@ jumbo_component("shared_impl") {
"media_stream_buffer_manager.h",
"media_stream_video_track_shared.cc",
"media_stream_video_track_shared.h",
"pdf_accessibility_shared.cc",
"pdf_accessibility_shared.h",
"platform_file.cc",
"platform_file.h",
"ppapi_constants.h",

@ -0,0 +1,39 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/shared_impl/pdf_accessibility_shared.h"
namespace ppapi {
PdfAccessibilityLinkInfo::PdfAccessibilityLinkInfo() = default;
PdfAccessibilityLinkInfo::PdfAccessibilityLinkInfo(
const PdfAccessibilityLinkInfo& other) = default;
PdfAccessibilityLinkInfo::~PdfAccessibilityLinkInfo() = default;
PdfAccessibilityLinkInfo::PdfAccessibilityLinkInfo(
const PP_PrivateAccessibilityLinkInfo& link) {
url = std::string(link.url, link.url_length);
index_in_page = link.index_in_page;
text_run_index = link.text_run_index;
text_run_count = link.text_run_count;
bounds = link.bounds;
}
PdfAccessibilityImageInfo::PdfAccessibilityImageInfo() = default;
PdfAccessibilityImageInfo::PdfAccessibilityImageInfo(
const PdfAccessibilityImageInfo& other) = default;
PdfAccessibilityImageInfo::~PdfAccessibilityImageInfo() = default;
PdfAccessibilityImageInfo::PdfAccessibilityImageInfo(
const PP_PrivateAccessibilityImageInfo& image) {
alt_text = std::string(image.alt_text, image.alt_text_length);
text_run_index = image.text_run_index;
bounds = image.bounds;
}
} // namespace ppapi

@ -0,0 +1,42 @@
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PPAPI_SHARED_IMPL_PDF_ACCESSIBILITY_SHARED_H_
#define PPAPI_SHARED_IMPL_PDF_ACCESSIBILITY_SHARED_H_
#include <string>
#include "ppapi/c/pp_rect.h"
#include "ppapi/c/private/ppb_pdf.h"
#include "ppapi/shared_impl/ppapi_shared_export.h"
namespace ppapi {
struct PPAPI_SHARED_EXPORT PdfAccessibilityLinkInfo {
PdfAccessibilityLinkInfo();
PdfAccessibilityLinkInfo(const PdfAccessibilityLinkInfo& other);
PdfAccessibilityLinkInfo(const PP_PrivateAccessibilityLinkInfo& link);
~PdfAccessibilityLinkInfo();
std::string url;
uint32_t index_in_page;
uint32_t text_run_index;
uint32_t text_run_count;
PP_FloatRect bounds;
};
struct PPAPI_SHARED_EXPORT PdfAccessibilityImageInfo {
PdfAccessibilityImageInfo();
PdfAccessibilityImageInfo(const PdfAccessibilityImageInfo& other);
PdfAccessibilityImageInfo(const PP_PrivateAccessibilityImageInfo& image);
~PdfAccessibilityImageInfo();
std::string alt_text;
uint32_t text_run_index;
PP_FloatRect bounds;
};
} // namespace ppapi
#endif // PPAPI_SHARED_IMPL_PDF_ACCESSIBILITY_SHARED_H_

@ -43,7 +43,9 @@ class PPB_PDF_API {
virtual void SetAccessibilityPageInfo(
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[]) = 0;
PP_PrivateAccessibilityCharInfo chars[],
PP_PrivateAccessibilityLinkInfo links[],
PP_PrivateAccessibilityImageInfo images[]) = 0;
virtual void SetCrashData(const char* pdf_url, const char* top_level_url) = 0;
virtual void SelectionChanged(const PP_FloatPoint& left,
int32_t left_height,

@ -171,15 +171,17 @@ void SetAccessibilityDocInfo(
enter.functions()->SetAccessibilityDocInfo(doc_info);
}
void SetAccessibilityPageInfo(
PP_Instance instance,
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[]) {
void SetAccessibilityPageInfo(PP_Instance instance,
PP_PrivateAccessibilityPageInfo* page_info,
PP_PrivateAccessibilityTextRunInfo text_runs[],
PP_PrivateAccessibilityCharInfo chars[],
PP_PrivateAccessibilityLinkInfo links[],
PP_PrivateAccessibilityImageInfo images[]) {
EnterInstanceAPI<PPB_PDF_API> enter(instance);
if (enter.failed())
return;
enter.functions()->SetAccessibilityPageInfo(page_info, text_runs, chars);
enter.functions()->SetAccessibilityPageInfo(page_info, text_runs, chars,
links, images);
}
void SetCrashData(PP_Instance instance,