0

Implement scroll to global point action in PDFiumEngine

This change adds the following
- Adds name PP_PDF_SCROLL_TO_GLOBAL_POINT in PP_PdfAccessibilityAction
  action enum.
- Handle PP_PDF_SCROLL_TO_GLOBAL_POINT action in PDFiumEngine.
  The action is used by certain screen readers to
  scroll content in viewport during continuous read operation.

Bug: 811233
Change-Id: I725a5295f42049af139856ce9815799cf67c0088
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1954800
Commit-Queue: Virender Singh <virens@microsoft.com>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Kevin Babbitt <kbabbitt@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#724911}
This commit is contained in:
Virender Singh
2019-12-14 04:18:41 +00:00
committed by Commit Bot
parent 025f4202ec
commit 9ee0969926
5 changed files with 44 additions and 2 deletions

@ -337,6 +337,28 @@ TEST_F(AccessibilityTest, TestScrollToNearestEdge) {
ComparePoint({-199, -199}, client.GetScrollRequestPoints());
}
TEST_F(AccessibilityTest, TestScrollToGlobalPoint) {
ScrollEnabledTestClient client;
std::unique_ptr<PDFiumEngine> engine = InitializeEngine(
&client, FILE_PATH_LITERAL("rectangles_multi_pages.pdf"));
ASSERT_TRUE(engine);
engine->PluginSizeUpdated({400, 400});
PP_PdfAccessibilityActionData action_data;
action_data.action = PP_PdfAccessibilityAction::PP_PDF_SCROLL_TO_GLOBAL_POINT;
// Scroll up if global point is below the target rect
action_data.target_rect = {{201, 201}, {10, 10}};
action_data.target_point = {230, 230};
engine->HandleAccessibilityAction(action_data);
ComparePoint({-29, -29}, client.GetScrollRequestPoints());
// Scroll down if global point is above the target rect
action_data.target_rect = {{230, 230}, {10, 10}};
action_data.target_point = {201, 201};
engine->HandleAccessibilityAction(action_data);
ComparePoint({29, 29}, client.GetScrollRequestPoints());
}
// This class is required to just override the NavigateTo
// functionality for testing in a specific way. It will
// keep the TestClient class clean for extension by others.

@ -2024,6 +2024,10 @@ void PDFiumEngine::HandleAccessibilityAction(
}
break;
}
case PP_PdfAccessibilityAction::PP_PDF_SCROLL_TO_GLOBAL_POINT: {
ScrollToGlobalPoint(action_data.target_rect, action_data.target_point);
break;
}
default:
NOTREACHED();
break;
@ -2197,6 +2201,12 @@ void PDFiumEngine::ScrollBasedOnScrollAlignment(
client_->ScrollBy(scroll_offset);
}
void PDFiumEngine::ScrollToGlobalPoint(const pp::Rect& target_rect,
const pp::Point& global_point) {
pp::Point scroll_offset = GetScreenRect(target_rect).point();
client_->ScrollBy(scroll_offset - global_point);
}
base::Optional<PDFEngine::NamedDestination> PDFiumEngine::GetNamedDestination(
const std::string& destination) {
// Look for the destination.

@ -536,6 +536,11 @@ class PDFiumEngine : public PDFEngine,
const PP_PdfAccessibilityScrollAlignment& horizontal_scroll_alignment,
const PP_PdfAccessibilityScrollAlignment& vertical_scroll_alignment);
// Scrolls top left of a rect in page |target_rect| to |global_point|.
// Global point is point relative to viewport in screen.
void ScrollToGlobalPoint(const pp::Rect& target_rect,
const pp::Point& global_point);
// Set if the document has any local edits.
void SetEditMode(bool edit_mode);

@ -67,8 +67,10 @@ typedef enum {
PP_PDF_SCROLL_TO_MAKE_VISIBLE = 1,
// Invokes default action on a node.
PP_PDF_DO_DEFAULT_ACTION = 2,
// Action specifying a command to scroll to the global point.
PP_PDF_SCROLL_TO_GLOBAL_POINT = 3,
// Last enum value marker.
PP_PDF_ACCESSIBILITYACTION_LAST = PP_PDF_DO_DEFAULT_ACTION
PP_PDF_ACCESSIBILITYACTION_LAST = PP_PDF_SCROLL_TO_GLOBAL_POINT
} PP_PdfAccessibilityAction;
PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_PdfAccessibilityAction, 4);
@ -108,6 +110,8 @@ struct PP_PdfAccessibilityActionData {
PP_PdfAccessibilityAction action;
// Annotation type on which the action is to be performed.
PP_PdfAccessibilityAnnotationType annotation_type;
// Target point on which the action is to be performed.
struct PP_Point target_point;
// Target rect on which the action is to be performed.
struct PP_Rect target_rect;
// Index of annotation in page.
@ -119,7 +123,7 @@ struct PP_PdfAccessibilityActionData {
// Vertical scroll alignment with respect to the viewport
PP_PdfAccessibilityScrollAlignment vertical_scroll_alignment;
};
PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_PdfAccessibilityActionData, 40);
PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_PdfAccessibilityActionData, 48);
struct PPP_Pdf_1_1 {
// Returns an absolute URL if the position is over a link.

@ -237,6 +237,7 @@ IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(PP_PdfAccessibilityActionData)
IPC_STRUCT_TRAITS_MEMBER(action)
IPC_STRUCT_TRAITS_MEMBER(annotation_type)
IPC_STRUCT_TRAITS_MEMBER(target_point)
IPC_STRUCT_TRAITS_MEMBER(target_rect)
IPC_STRUCT_TRAITS_MEMBER(annotation_index)
IPC_STRUCT_TRAITS_MEMBER(page_index)