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

Side by Side Diff: pdf/out_of_process_instance.cc

Issue 2855953003: Handle long press in PDF documents. (Closed)
Patch Set: Created 3 years, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "pdf/out_of_process_instance.h" 5 #include "pdf/out_of_process_instance.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> // for min/max() 10 #include <algorithm> // for min/max()
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 int page_index = 0; 235 int page_index = 0;
236 if (!base::StringToInt(url_substr[1], &page_index)) 236 if (!base::StringToInt(url_substr[1], &page_index))
237 return -1; 237 return -1;
238 return page_index; 238 return page_index;
239 } 239 }
240 240
241 bool IsPrintPreviewUrl(const std::string& url) { 241 bool IsPrintPreviewUrl(const std::string& url) {
242 return url.substr(0, strlen(kChromePrint)) == kChromePrint; 242 return url.substr(0, strlen(kChromePrint)) == kChromePrint;
243 } 243 }
244 244
245 void ScaleFloatPoint(float scale, pp::FloatPoint* point) {
246 point->set_x(point->x() * scale);
247 point->set_y(point->y() * scale);
248 }
249
245 void ScalePoint(float scale, pp::Point* point) { 250 void ScalePoint(float scale, pp::Point* point) {
246 point->set_x(static_cast<int>(point->x() * scale)); 251 point->set_x(static_cast<int>(point->x() * scale));
247 point->set_y(static_cast<int>(point->y() * scale)); 252 point->set_y(static_cast<int>(point->y() * scale));
248 } 253 }
249 254
250 void ScaleRect(float scale, pp::Rect* rect) { 255 void ScaleRect(float scale, pp::Rect* rect) {
251 int left = static_cast<int>(floorf(rect->x() * scale)); 256 int left = static_cast<int>(floorf(rect->x() * scale));
252 int top = static_cast<int>(floorf(rect->y() * scale)); 257 int top = static_cast<int>(floorf(rect->y() * scale));
253 int right = static_cast<int>(ceilf((rect->x() + rect->width()) * scale)); 258 int right = static_cast<int>(ceilf((rect->x() + rect->width()) * scale));
254 int bottom = static_cast<int>(ceilf((rect->y() + rect->height()) * scale)); 259 int bottom = static_cast<int>(ceilf((rect->y() + rect->height()) * scale));
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 if (page_number >= 0) 584 if (page_number >= 0)
580 reply.Set(pp::Var(kJSNamedDestinationPageNumber), page_number); 585 reply.Set(pp::Var(kJSNamedDestinationPageNumber), page_number);
581 PostMessage(reply); 586 PostMessage(reply);
582 } else { 587 } else {
583 NOTREACHED(); 588 NOTREACHED();
584 } 589 }
585 } 590 }
586 591
587 bool OutOfProcessInstance::HandleInputEvent( 592 bool OutOfProcessInstance::HandleInputEvent(
588 const pp::InputEvent& event) { 593 const pp::InputEvent& event) {
589 // To simplify things, convert the event into device coordinates if it is 594 // To simplify things, convert the event into device coordinates.
590 // a mouse event.
591 pp::InputEvent event_device_res(event); 595 pp::InputEvent event_device_res(event);
592 { 596 {
593 pp::MouseInputEvent mouse_event(event); 597 pp::MouseInputEvent mouse_event(event);
594 if (!mouse_event.is_null()) { 598 if (!mouse_event.is_null()) {
595 pp::Point point = mouse_event.GetPosition(); 599 pp::Point point = mouse_event.GetPosition();
596 pp::Point movement = mouse_event.GetMovement(); 600 pp::Point movement = mouse_event.GetMovement();
597 ScalePoint(device_scale_, &point); 601 ScalePoint(device_scale_, &point);
602 point.set_x(point.x() - available_area_.x());
603
598 ScalePoint(device_scale_, &movement); 604 ScalePoint(device_scale_, &movement);
599 mouse_event = pp::MouseInputEvent( 605 mouse_event = pp::MouseInputEvent(
600 this, 606 this,
601 event.GetType(), 607 event.GetType(),
602 event.GetTimeStamp(), 608 event.GetTimeStamp(),
603 event.GetModifiers(), 609 event.GetModifiers(),
604 mouse_event.GetButton(), 610 mouse_event.GetButton(),
605 point, 611 point,
606 mouse_event.GetClickCount(), 612 mouse_event.GetClickCount(),
607 movement); 613 movement);
608 event_device_res = mouse_event; 614 event_device_res = mouse_event;
609 } 615 }
610 } 616 }
617 {
618 pp::TouchInputEvent touch_event(event);
619 if (!touch_event.is_null()) {
620 pp::TouchInputEvent new_touch_event = pp::TouchInputEvent(
621 this, touch_event.GetType(), touch_event.GetTimeStamp(),
622 touch_event.GetModifiers());
611 623
612 pp::InputEvent offset_event(event_device_res); 624 for (uint32_t i = 0;
613 switch (offset_event.GetType()) { 625 i < touch_event.GetTouchCount(PP_TOUCHLIST_TYPE_TARGETTOUCHES);
614 case PP_INPUTEVENT_TYPE_MOUSEDOWN: 626 i++) {
615 case PP_INPUTEVENT_TYPE_MOUSEUP: 627 pp::TouchPoint touch_point =
616 case PP_INPUTEVENT_TYPE_MOUSEMOVE: 628 touch_event.GetTouchByIndex(PP_TOUCHLIST_TYPE_TARGETTOUCHES, i);
617 case PP_INPUTEVENT_TYPE_MOUSEENTER: 629
618 case PP_INPUTEVENT_TYPE_MOUSELEAVE: { 630 pp::FloatPoint point = touch_point.position();
619 pp::MouseInputEvent mouse_event(event_device_res); 631
620 pp::MouseInputEvent mouse_event_dip(event); 632 // Account for the scroll position. Touch events are in DOM coordinates
621 pp::Point point = mouse_event.GetPosition(); 633 // where mouse events appear to be in screen coordinates.
622 point.set_x(point.x() - available_area_.x()); 634 point.set_x(scroll_offset_.x() + point.x());
623 offset_event = pp::MouseInputEvent( 635 point.set_y(scroll_offset_.y() + point.y());
624 this, 636 ScaleFloatPoint(device_scale_, &point);
625 event.GetType(), 637
626 event.GetTimeStamp(), 638 point.set_x(point.x() - available_area_.x());
627 event.GetModifiers(), 639
628 mouse_event.GetButton(), 640 new_touch_event.AddTouchPoint(
629 point, 641 PP_TOUCHLIST_TYPE_TARGETTOUCHES,
630 mouse_event.GetClickCount(), 642 {touch_point.id(), point, touch_point.radii(),
631 mouse_event.GetMovement()); 643 touch_point.rotation_angle(), touch_point.pressure()});
632 break; 644 }
645 event_device_res = new_touch_event;
633 } 646 }
634 default:
635 break;
636 } 647 }
637 if (engine_->HandleEvent(offset_event)) 648
649 if (engine_->HandleEvent(event_device_res))
638 return true; 650 return true;
639 651
640 // Middle click is used for scrolling and is handled by the container page. 652 // Middle click is used for scrolling and is handled by the container page.
641 pp::MouseInputEvent mouse_event(event_device_res); 653 pp::MouseInputEvent mouse_event(event_device_res);
642 if (!mouse_event.is_null() && 654 if (!mouse_event.is_null() &&
643 mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_MIDDLE) { 655 mouse_event.GetButton() == PP_INPUTEVENT_MOUSEBUTTON_MIDDLE) {
644 return false; 656 return false;
645 } 657 }
646 658
647 // Return true for unhandled clicks so the plugin takes focus. 659 // Return true for unhandled clicks so the plugin takes focus.
(...skipping 27 matching lines...) Expand all
675 687
676 if (image_data_.is_null()) { 688 if (image_data_.is_null()) {
677 DCHECK(plugin_size_.IsEmpty()); 689 DCHECK(plugin_size_.IsEmpty());
678 return; 690 return;
679 } 691 }
680 692
681 OnGeometryChanged(zoom_, old_device_scale); 693 OnGeometryChanged(zoom_, old_device_scale);
682 } 694 }
683 695
684 if (!stop_scrolling_) { 696 if (!stop_scrolling_) {
685 pp::Point scroll_offset(view.GetScrollOffset()); 697 scroll_offset_ = view.GetScrollOffset();
686 // Because view messages come from the DOM, the coordinates of the viewport 698 // Because view messages come from the DOM, the coordinates of the viewport
687 // are 0-based (i.e. they do not correspond to the viewport's coordinates in 699 // are 0-based (i.e. they do not correspond to the viewport's coordinates in
688 // JS), so we need to subtract the toolbar height to convert them into 700 // JS), so we need to subtract the toolbar height to convert them into
689 // viewport coordinates. 701 // viewport coordinates.
690 pp::FloatPoint scroll_offset_float(scroll_offset.x(), 702 pp::FloatPoint scroll_offset_float(
691 scroll_offset.y() - top_toolbar_height_); 703 scroll_offset_.x(), scroll_offset_.y() - top_toolbar_height_);
692 scroll_offset_float = BoundScrollOffsetToDocument(scroll_offset_float); 704 scroll_offset_float = BoundScrollOffsetToDocument(scroll_offset_float);
693 engine_->ScrolledToXPosition(scroll_offset_float.x() * device_scale_); 705 engine_->ScrolledToXPosition(scroll_offset_float.x() * device_scale_);
694 engine_->ScrolledToYPosition(scroll_offset_float.y() * device_scale_); 706 engine_->ScrolledToYPosition(scroll_offset_float.y() * device_scale_);
695 } 707 }
696 } 708 }
697 709
698 void OutOfProcessInstance::GetPrintPresetOptionsFromDocument( 710 void OutOfProcessInstance::GetPrintPresetOptionsFromDocument(
699 PP_PdfPrintPresetOptions_Dev* options) { 711 PP_PdfPrintPresetOptions_Dev* options) {
700 options->is_scaling_disabled = PP_FromBool(IsPrintScalingDisabled()); 712 options->is_scaling_disabled = PP_FromBool(IsPrintScalingDisabled());
701 options->duplex = 713 options->duplex =
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 void OutOfProcessInstance::DidOpenPreview(int32_t result) { 993 void OutOfProcessInstance::DidOpenPreview(int32_t result) {
982 if (result == PP_OK) { 994 if (result == PP_OK) {
983 preview_client_ = base::MakeUnique<PreviewModeClient>(this); 995 preview_client_ = base::MakeUnique<PreviewModeClient>(this);
984 preview_engine_.reset(PDFEngine::Create(preview_client_.get())); 996 preview_engine_.reset(PDFEngine::Create(preview_client_.get()));
985 preview_engine_->HandleDocumentLoad(embed_preview_loader_); 997 preview_engine_->HandleDocumentLoad(embed_preview_loader_);
986 } else { 998 } else {
987 NOTREACHED(); 999 NOTREACHED();
988 } 1000 }
989 } 1001 }
990 1002
1003 void OutOfProcessInstance::OnClientTouchTimerFired(int32_t id) {
1004 engine_->OnTouchTimerCallback(id);
1005 }
1006
991 void OutOfProcessInstance::OnClientTimerFired(int32_t id) { 1007 void OutOfProcessInstance::OnClientTimerFired(int32_t id) {
992 engine_->OnCallback(id); 1008 engine_->OnCallback(id);
993 } 1009 }
994 1010
995 void OutOfProcessInstance::CalculateBackgroundParts() { 1011 void OutOfProcessInstance::CalculateBackgroundParts() {
996 background_parts_.clear(); 1012 background_parts_.clear();
997 int left_width = available_area_.x(); 1013 int left_width = available_area_.x();
998 int right_start = available_area_.right(); 1014 int right_start = available_area_.right();
999 int right_width = abs(plugin_size_.width() - available_area_.right()); 1015 int right_width = abs(plugin_size_.width() - available_area_.right());
1000 int bottom = std::min(available_area_.bottom(), plugin_size_.height()); 1016 int bottom = std::min(available_area_.bottom(), plugin_size_.height());
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 // Disable save and print until the document is fully loaded, since they 1288 // Disable save and print until the document is fully loaded, since they
1273 // would generate an incomplete document. Need to do this each time we 1289 // would generate an incomplete document. Need to do this each time we
1274 // call DidStartLoading since that resets the content restrictions. 1290 // call DidStartLoading since that resets the content restrictions.
1275 pp::PDF::SetContentRestriction(this, CONTENT_RESTRICTION_SAVE | 1291 pp::PDF::SetContentRestriction(this, CONTENT_RESTRICTION_SAVE |
1276 CONTENT_RESTRICTION_PRINT); 1292 CONTENT_RESTRICTION_PRINT);
1277 } 1293 }
1278 1294
1279 return CreateURLLoaderInternal(); 1295 return CreateURLLoaderInternal();
1280 } 1296 }
1281 1297
1298 void OutOfProcessInstance::ScheduleTouchTimerCallback(int id, int delay_in_ms) {
1299 pp::CompletionCallback callback = timer_factory_.NewCallback(
1300 &OutOfProcessInstance::OnClientTouchTimerFired);
1301 pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id);
1302 }
1303
1282 void OutOfProcessInstance::ScheduleCallback(int id, int delay_in_ms) { 1304 void OutOfProcessInstance::ScheduleCallback(int id, int delay_in_ms) {
1283 pp::CompletionCallback callback = 1305 pp::CompletionCallback callback =
1284 timer_factory_.NewCallback(&OutOfProcessInstance::OnClientTimerFired); 1306 timer_factory_.NewCallback(&OutOfProcessInstance::OnClientTimerFired);
1285 pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id); 1307 pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id);
1286 } 1308 }
1287 1309
1288 void OutOfProcessInstance::SearchString(const base::char16* string, 1310 void OutOfProcessInstance::SearchString(const base::char16* string,
1289 const base::char16* term, 1311 const base::char16* term,
1290 bool case_sensitive, 1312 bool case_sensitive,
1291 std::vector<SearchStringResult>* results) { 1313 std::vector<SearchStringResult>* results) {
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
1653 const pp::FloatPoint& scroll_offset) { 1675 const pp::FloatPoint& scroll_offset) {
1654 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); 1676 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width();
1655 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); 1677 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f);
1656 float min_y = -top_toolbar_height_; 1678 float min_y = -top_toolbar_height_;
1657 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); 1679 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height();
1658 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); 1680 float y = std::max(std::min(scroll_offset.y(), max_y), min_y);
1659 return pp::FloatPoint(x, y); 1681 return pp::FloatPoint(x, y);
1660 } 1682 }
1661 1683
1662 } // namespace chrome_pdf 1684 } // namespace chrome_pdf
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698