OLD | NEW |
---|---|
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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
56 const char kAccessibleLoaded[] = "loaded"; | 56 const char kAccessibleLoaded[] = "loaded"; |
57 const char kAccessibleCopyable[] = "copyable"; | 57 const char kAccessibleCopyable[] = "copyable"; |
58 | 58 |
59 // Constants used in handling postMessage() messages. | 59 // Constants used in handling postMessage() messages. |
60 const char kType[] = "type"; | 60 const char kType[] = "type"; |
61 // Viewport message arguments. (Page -> Plugin). | 61 // Viewport message arguments. (Page -> Plugin). |
62 const char kJSViewportType[] = "viewport"; | 62 const char kJSViewportType[] = "viewport"; |
63 const char kJSXOffset[] = "xOffset"; | 63 const char kJSXOffset[] = "xOffset"; |
64 const char kJSYOffset[] = "yOffset"; | 64 const char kJSYOffset[] = "yOffset"; |
65 const char kJSZoom[] = "zoom"; | 65 const char kJSZoom[] = "zoom"; |
66 const char kJSRender[] = "render"; | |
67 // kJSPx and kJSPy represent the center of the pinch gesture. | |
68 const char kJSPx[] = "px"; | |
69 const char kJSPy[] = "py"; | |
70 // kJSPinchVector represents the amount of panning caused by the pinch gesture. | |
71 const char kJSPinchVectorX[] = "pinchVectorX"; | |
72 const char kJSPinchVectorY[] = "pinchVectorY"; | |
66 // Stop scrolling message (Page -> Plugin) | 73 // Stop scrolling message (Page -> Plugin) |
67 const char kJSStopScrollingType[] = "stopScrolling"; | 74 const char kJSStopScrollingType[] = "stopScrolling"; |
68 // Document dimension arguments (Plugin -> Page). | 75 // Document dimension arguments (Plugin -> Page). |
69 const char kJSDocumentDimensionsType[] = "documentDimensions"; | 76 const char kJSDocumentDimensionsType[] = "documentDimensions"; |
70 const char kJSDocumentWidth[] = "width"; | 77 const char kJSDocumentWidth[] = "width"; |
71 const char kJSDocumentHeight[] = "height"; | 78 const char kJSDocumentHeight[] = "height"; |
72 const char kJSPageDimensions[] = "pageDimensions"; | 79 const char kJSPageDimensions[] = "pageDimensions"; |
73 const char kJSPageX[] = "x"; | 80 const char kJSPageX[] = "x"; |
74 const char kJSPageY[] = "y"; | 81 const char kJSPageY[] = "y"; |
75 const char kJSPageWidth[] = "width"; | 82 const char kJSPageWidth[] = "width"; |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
266 } | 273 } |
267 | 274 |
268 } // namespace | 275 } // namespace |
269 | 276 |
270 OutOfProcessInstance::OutOfProcessInstance(PP_Instance instance) | 277 OutOfProcessInstance::OutOfProcessInstance(PP_Instance instance) |
271 : pp::Instance(instance), | 278 : pp::Instance(instance), |
272 pp::Find_Private(this), | 279 pp::Find_Private(this), |
273 pp::Printing_Dev(this), | 280 pp::Printing_Dev(this), |
274 cursor_(PP_CURSORTYPE_POINTER), | 281 cursor_(PP_CURSORTYPE_POINTER), |
275 zoom_(1.0), | 282 zoom_(1.0), |
283 do_render_(true), | |
284 last_current_scroll_(0, 0), | |
285 was_smaller_(false), | |
276 device_scale_(1.0), | 286 device_scale_(1.0), |
277 full_(false), | 287 full_(false), |
278 paint_manager_(this, this, true), | 288 paint_manager_(this, this, true), |
279 first_paint_(true), | 289 first_paint_(true), |
280 document_load_state_(LOAD_STATE_LOADING), | 290 document_load_state_(LOAD_STATE_LOADING), |
281 preview_document_load_state_(LOAD_STATE_COMPLETE), | 291 preview_document_load_state_(LOAD_STATE_COMPLETE), |
282 uma_(this), | 292 uma_(this), |
283 told_browser_about_unsupported_feature_(false), | 293 told_browser_about_unsupported_feature_(false), |
284 print_preview_page_count_(0), | 294 print_preview_page_count_(0), |
285 last_progress_sent_(0), | 295 last_progress_sent_(0), |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 } | 389 } |
380 | 390 |
381 void OutOfProcessInstance::HandleMessage(const pp::Var& message) { | 391 void OutOfProcessInstance::HandleMessage(const pp::Var& message) { |
382 pp::VarDictionary dict(message); | 392 pp::VarDictionary dict(message); |
383 if (!dict.Get(kType).is_string()) { | 393 if (!dict.Get(kType).is_string()) { |
384 NOTREACHED(); | 394 NOTREACHED(); |
385 return; | 395 return; |
386 } | 396 } |
387 | 397 |
388 std::string type = dict.Get(kType).AsString(); | 398 std::string type = dict.Get(kType).AsString(); |
389 | |
390 if (type == kJSViewportType && | 399 if (type == kJSViewportType && |
391 dict.Get(pp::Var(kJSXOffset)).is_number() && | 400 dict.Get(pp::Var(kJSXOffset)).is_number() && |
392 dict.Get(pp::Var(kJSYOffset)).is_number() && | 401 dict.Get(pp::Var(kJSYOffset)).is_number() && |
393 dict.Get(pp::Var(kJSZoom)).is_number()) { | 402 dict.Get(pp::Var(kJSZoom)).is_number() && |
403 dict.Get(pp::Var(kJSRender)).is_bool() && | |
404 dict.Get(pp::Var(kJSPx)).is_number() && | |
405 dict.Get(pp::Var(kJSPy)).is_number()) { | |
394 received_viewport_message_ = true; | 406 received_viewport_message_ = true; |
395 stop_scrolling_ = false; | 407 stop_scrolling_ = false; |
408 bool do_render = dict.Get(pp::Var(kJSRender)).AsBool(); | |
396 double zoom = dict.Get(pp::Var(kJSZoom)).AsDouble(); | 409 double zoom = dict.Get(pp::Var(kJSZoom)).AsDouble(); |
410 double zoom_delta = zoom / zoom_; | |
411 | |
412 // Pinch vector is the panning caused due to change in pinch | |
413 // center between start and end of the gesture. | |
414 pp::Point pinch_vector = | |
415 pp::Point(dict.Get(kJSPinchVectorX).AsDouble() * zoom_delta, | |
416 dict.Get(kJSPinchVectorY).AsDouble() * zoom_delta); | |
397 pp::FloatPoint scroll_offset(dict.Get(pp::Var(kJSXOffset)).AsDouble(), | 417 pp::FloatPoint scroll_offset(dict.Get(pp::Var(kJSXOffset)).AsDouble(), |
398 dict.Get(pp::Var(kJSYOffset)).AsDouble()); | 418 dict.Get(pp::Var(kJSYOffset)).AsDouble()); |
419 pp::Point pinch_center(dict.Get(pp::Var(kJSPx)).AsDouble(), | |
420 dict.Get(pp::Var(kJSPy)).AsDouble()); | |
421 pp::Point scroll_delta(0,0); | |
422 | |
423 // If the rendered document doesn't fill the display area we will | |
424 // use paint_offset to anchor the paint vertically into the same place. We | |
425 // use the scroll bars instead of the pinch vector to get the actual | |
426 // position on screen of the paint. | |
427 pp::Point paint_offset(0,0); | |
428 | |
429 // Pinch start. | |
430 if (!do_render && do_render_) { | |
bokan
2016/05/12 14:57:57
We should replace these with an actual state enum
| |
431 last_current_scroll_ = scroll_offset; | |
432 old_zoom_ = zoom; | |
433 initial_zoom_delta_ = zoom / zoom_; | |
434 was_smaller_ = false; | |
435 do_render_ = false; | |
436 return; | |
437 } | |
438 | |
439 if (!do_render && | |
440 plugin_size_.width() > GetDocumentPixelWidth() * zoom_delta) { | |
441 // We want to keep the paint in the middle but it must stay in the same | |
442 // position relative to the scroll bars. | |
443 paint_offset = pp::Point(0, (1 - zoom_delta) * pinch_center.y()); | |
444 scroll_delta = pp::Point( | |
445 0, (scroll_offset.y() - | |
446 last_current_scroll_.y() * zoom_delta / initial_zoom_delta_)); | |
447 | |
448 pinch_vector = pp::Point(); | |
449 old_zoom_ = zoom; | |
450 was_smaller_ = true; | |
451 } else { | |
452 if (was_smaller_) { | |
453 pinch_center = pp::Point((plugin_size_.width() / device_scale_) / 2, | |
454 (plugin_size_.height() / device_scale_) / 2); | |
455 paint_offset = pp::Point((1 - zoom / old_zoom_) * pinch_center.x(), | |
456 (1 - zoom_delta) * pinch_center.y()); | |
457 pinch_vector = pp::Point(0, 0); | |
458 scroll_delta = pp::Point( | |
459 (scroll_offset.x() - | |
460 last_current_scroll_.x() * zoom_delta / initial_zoom_delta_), | |
461 (scroll_offset.y() - | |
462 last_current_scroll_.y() * zoom_delta / initial_zoom_delta_)); | |
463 } | |
464 } | |
465 | |
466 // While pinching. | |
bokan
2016/05/12 14:57:57
I think the above if..else is part of "While Pinch
| |
467 if (!do_render) { | |
468 paint_manager_.SetTransform(zoom_delta, pinch_center, | |
469 pinch_vector + paint_offset + scroll_delta); | |
470 do_render_ = do_render; | |
471 return; | |
472 } | |
473 | |
474 // On pinch end the scale is again 1.f and we request a render in the new | |
475 // position. | |
476 if (do_render && !do_render_) { | |
477 paint_manager_.SetTransform(1.f); | |
478 was_smaller_ = false; | |
479 } | |
399 | 480 |
400 // Bound the input parameters. | 481 // Bound the input parameters. |
401 zoom = std::max(kMinZoom, zoom); | 482 zoom = std::max(kMinZoom, zoom); |
402 SetZoom(zoom); | 483 SetZoom(zoom); |
484 | |
485 do_render_ = do_render; | |
403 scroll_offset = BoundScrollOffsetToDocument(scroll_offset); | 486 scroll_offset = BoundScrollOffsetToDocument(scroll_offset); |
404 engine_->ScrolledToXPosition(scroll_offset.x() * device_scale_); | 487 engine_->ScrolledToXPosition(scroll_offset.x() * device_scale_); |
405 engine_->ScrolledToYPosition(scroll_offset.y() * device_scale_); | 488 engine_->ScrolledToYPosition(scroll_offset.y() * device_scale_); |
406 } else if (type == kJSGetPasswordCompleteType && | 489 } else if (type == kJSGetPasswordCompleteType && |
407 dict.Get(pp::Var(kJSPassword)).is_string()) { | 490 dict.Get(pp::Var(kJSPassword)).is_string()) { |
408 if (password_callback_) { | 491 if (password_callback_) { |
409 pp::CompletionCallbackWithOutput<pp::Var> callback = *password_callback_; | 492 pp::CompletionCallbackWithOutput<pp::Var> callback = *password_callback_; |
410 password_callback_.reset(); | 493 password_callback_.reset(); |
411 *callback.output() = dict.Get(pp::Var(kJSPassword)).pp_var(); | 494 *callback.output() = dict.Get(pp::Var(kJSPassword)).pp_var(); |
412 callback.Run(PP_OK); | 495 callback.Run(PP_OK); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
561 float device_scale = view.GetDeviceScale(); | 644 float device_scale = view.GetDeviceScale(); |
562 pp::Size view_device_size(view_rect.width() * device_scale, | 645 pp::Size view_device_size(view_rect.width() * device_scale, |
563 view_rect.height() * device_scale); | 646 view_rect.height() * device_scale); |
564 | 647 |
565 if (view_device_size != plugin_size_ || device_scale != device_scale_) { | 648 if (view_device_size != plugin_size_ || device_scale != device_scale_) { |
566 device_scale_ = device_scale; | 649 device_scale_ = device_scale; |
567 plugin_dip_size_ = view_rect.size(); | 650 plugin_dip_size_ = view_rect.size(); |
568 plugin_size_ = view_device_size; | 651 plugin_size_ = view_device_size; |
569 | 652 |
570 paint_manager_.SetSize(view_device_size, device_scale_); | 653 paint_manager_.SetSize(view_device_size, device_scale_); |
571 | |
572 pp::Size new_image_data_size = PaintManager::GetNewContextSize( | 654 pp::Size new_image_data_size = PaintManager::GetNewContextSize( |
573 image_data_.size(), | 655 image_data_.size(), |
574 plugin_size_); | 656 plugin_size_); |
575 if (new_image_data_size != image_data_.size()) { | 657 if (new_image_data_size != image_data_.size()) { |
576 image_data_ = pp::ImageData(this, | 658 image_data_ = pp::ImageData(this, |
577 PP_IMAGEDATAFORMAT_BGRA_PREMUL, | 659 PP_IMAGEDATAFORMAT_BGRA_PREMUL, |
578 new_image_data_size, | 660 new_image_data_size, |
579 false); | 661 false); |
580 first_paint_ = true; | 662 first_paint_ = true; |
581 } | 663 } |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
690 DCHECK(plugin_size_.IsEmpty()); | 772 DCHECK(plugin_size_.IsEmpty()); |
691 return; | 773 return; |
692 } | 774 } |
693 if (first_paint_) { | 775 if (first_paint_) { |
694 first_paint_ = false; | 776 first_paint_ = false; |
695 pp::Rect rect = pp::Rect(pp::Point(), image_data_.size()); | 777 pp::Rect rect = pp::Rect(pp::Point(), image_data_.size()); |
696 FillRect(rect, background_color_); | 778 FillRect(rect, background_color_); |
697 ready->push_back(PaintManager::ReadyRect(rect, image_data_, true)); | 779 ready->push_back(PaintManager::ReadyRect(rect, image_data_, true)); |
698 } | 780 } |
699 | 781 |
700 if (!received_viewport_message_) | 782 if (!received_viewport_message_ || !do_render_) |
701 return; | 783 return; |
702 | 784 |
703 engine_->PrePaint(); | 785 engine_->PrePaint(); |
704 | 786 |
705 for (const auto& paint_rect : paint_rects) { | 787 for (const auto& paint_rect : paint_rects) { |
706 // Intersect with plugin area since there could be pending invalidates from | 788 // Intersect with plugin area since there could be pending invalidates from |
707 // when the plugin area was larger. | 789 // when the plugin area was larger. |
708 pp::Rect rect = | 790 pp::Rect rect = |
709 paint_rect.Intersect(pp::Rect(pp::Point(), plugin_size_)); | 791 paint_rect.Intersect(pp::Rect(pp::Point(), plugin_size_)); |
710 if (rect.IsEmpty()) | 792 if (rect.IsEmpty()) |
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1436 const pp::FloatPoint& scroll_offset) { | 1518 const pp::FloatPoint& scroll_offset) { |
1437 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); | 1519 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); |
1438 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); | 1520 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); |
1439 float min_y = -top_toolbar_height_; | 1521 float min_y = -top_toolbar_height_; |
1440 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); | 1522 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); |
1441 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); | 1523 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); |
1442 return pp::FloatPoint(x, y); | 1524 return pp::FloatPoint(x, y); |
1443 } | 1525 } |
1444 | 1526 |
1445 } // namespace chrome_pdf | 1527 } // namespace chrome_pdf |
OLD | NEW |