Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Unified Diff: pdf/out_of_process_instance.cc

Issue 2855953003: Handle long press in PDF documents. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pdf/out_of_process_instance.cc
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index fd69a5aadc3d3e216d04f3fd35f3c25c2ce5253e..75c10c2c5278cbc60f92153b5ba236ec96f74015 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -242,6 +242,11 @@ bool IsPrintPreviewUrl(const std::string& url) {
return url.substr(0, strlen(kChromePrint)) == kChromePrint;
}
+void ScaleFloatPoint(float scale, pp::FloatPoint* point) {
+ point->set_x(point->x() * scale);
+ point->set_y(point->y() * scale);
+}
+
void ScalePoint(float scale, pp::Point* point) {
point->set_x(static_cast<int>(point->x() * scale));
point->set_y(static_cast<int>(point->y() * scale));
@@ -586,8 +591,7 @@ void OutOfProcessInstance::HandleMessage(const pp::Var& message) {
bool OutOfProcessInstance::HandleInputEvent(
const pp::InputEvent& event) {
- // To simplify things, convert the event into device coordinates if it is
- // a mouse event.
+ // To simplify things, convert the event into device coordinates.
pp::InputEvent event_device_res(event);
{
pp::MouseInputEvent mouse_event(event);
@@ -595,6 +599,8 @@ bool OutOfProcessInstance::HandleInputEvent(
pp::Point point = mouse_event.GetPosition();
pp::Point movement = mouse_event.GetMovement();
ScalePoint(device_scale_, &point);
+ point.set_x(point.x() - available_area_.x());
+
ScalePoint(device_scale_, &movement);
mouse_event = pp::MouseInputEvent(
this,
@@ -608,33 +614,39 @@ bool OutOfProcessInstance::HandleInputEvent(
event_device_res = mouse_event;
}
}
-
- pp::InputEvent offset_event(event_device_res);
- switch (offset_event.GetType()) {
- case PP_INPUTEVENT_TYPE_MOUSEDOWN:
- case PP_INPUTEVENT_TYPE_MOUSEUP:
- case PP_INPUTEVENT_TYPE_MOUSEMOVE:
- case PP_INPUTEVENT_TYPE_MOUSEENTER:
- case PP_INPUTEVENT_TYPE_MOUSELEAVE: {
- pp::MouseInputEvent mouse_event(event_device_res);
- pp::MouseInputEvent mouse_event_dip(event);
- pp::Point point = mouse_event.GetPosition();
- point.set_x(point.x() - available_area_.x());
- offset_event = pp::MouseInputEvent(
- this,
- event.GetType(),
- event.GetTimeStamp(),
- event.GetModifiers(),
- mouse_event.GetButton(),
- point,
- mouse_event.GetClickCount(),
- mouse_event.GetMovement());
- break;
+ {
+ pp::TouchInputEvent touch_event(event);
+ if (!touch_event.is_null()) {
+ pp::TouchInputEvent new_touch_event = pp::TouchInputEvent(
+ this, touch_event.GetType(), touch_event.GetTimeStamp(),
+ touch_event.GetModifiers());
+
+ for (uint32_t i = 0;
+ i < touch_event.GetTouchCount(PP_TOUCHLIST_TYPE_TARGETTOUCHES);
+ i++) {
+ pp::TouchPoint touch_point =
+ touch_event.GetTouchByIndex(PP_TOUCHLIST_TYPE_TARGETTOUCHES, i);
+
+ pp::FloatPoint point = touch_point.position();
+
+ // Account for the scroll position. Touch events are in DOM coordinates
+ // where mouse events appear to be in screen coordinates.
+ point.set_x(scroll_offset_.x() + point.x());
+ point.set_y(scroll_offset_.y() + point.y());
+ ScaleFloatPoint(device_scale_, &point);
+
+ point.set_x(point.x() - available_area_.x());
+
+ new_touch_event.AddTouchPoint(
+ PP_TOUCHLIST_TYPE_TARGETTOUCHES,
+ {touch_point.id(), point, touch_point.radii(),
+ touch_point.rotation_angle(), touch_point.pressure()});
+ }
+ event_device_res = new_touch_event;
}
- default:
- break;
}
- if (engine_->HandleEvent(offset_event))
+
+ if (engine_->HandleEvent(event_device_res))
return true;
// Middle click is used for scrolling and is handled by the container page.
@@ -682,13 +694,13 @@ void OutOfProcessInstance::DidChangeView(const pp::View& view) {
}
if (!stop_scrolling_) {
- pp::Point scroll_offset(view.GetScrollOffset());
+ scroll_offset_ = view.GetScrollOffset();
// Because view messages come from the DOM, the coordinates of the viewport
// are 0-based (i.e. they do not correspond to the viewport's coordinates in
// JS), so we need to subtract the toolbar height to convert them into
// viewport coordinates.
- pp::FloatPoint scroll_offset_float(scroll_offset.x(),
- scroll_offset.y() - top_toolbar_height_);
+ pp::FloatPoint scroll_offset_float(
+ scroll_offset_.x(), scroll_offset_.y() - top_toolbar_height_);
scroll_offset_float = BoundScrollOffsetToDocument(scroll_offset_float);
engine_->ScrolledToXPosition(scroll_offset_float.x() * device_scale_);
engine_->ScrolledToYPosition(scroll_offset_float.y() * device_scale_);
@@ -988,6 +1000,10 @@ void OutOfProcessInstance::DidOpenPreview(int32_t result) {
}
}
+void OutOfProcessInstance::OnClientTouchTimerFired(int32_t id) {
+ engine_->OnTouchTimerCallback(id);
+}
+
void OutOfProcessInstance::OnClientTimerFired(int32_t id) {
engine_->OnCallback(id);
}
@@ -1279,6 +1295,12 @@ pp::URLLoader OutOfProcessInstance::CreateURLLoader() {
return CreateURLLoaderInternal();
}
+void OutOfProcessInstance::ScheduleTouchTimerCallback(int id, int delay_in_ms) {
+ pp::CompletionCallback callback = timer_factory_.NewCallback(
+ &OutOfProcessInstance::OnClientTouchTimerFired);
+ pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id);
+}
+
void OutOfProcessInstance::ScheduleCallback(int id, int delay_in_ms) {
pp::CompletionCallback callback =
timer_factory_.NewCallback(&OutOfProcessInstance::OnClientTimerFired);

Powered by Google App Engine
This is Rietveld 408576698