Skip to content

Commit

Permalink
Implement scroll to global point action in PDFiumEngine
Browse files Browse the repository at this point in the history
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}
  • Loading branch information
virenms authored and Commit Bot committed Dec 14, 2019
1 parent 025f420 commit 9ee0969
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 2 deletions.
22 changes: 22 additions & 0 deletions pdf/pdfium/accessibility_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 10 additions & 0 deletions pdf/pdfium/pdfium_engine.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
5 changes: 5 additions & 0 deletions pdf/pdfium/pdfium_engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
8 changes: 6 additions & 2 deletions ppapi/c/private/ppp_pdf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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.
Expand All @@ -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.
Expand Down
1 change: 1 addition & 0 deletions ppapi/proxy/ppapi_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 9ee0969

Please sign in to comment.