| 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() |
| 11 #define _USE_MATH_DEFINES // for M_PI | 11 #define _USE_MATH_DEFINES // for M_PI |
| 12 #include <cmath> // for log() and pow() | |
| 13 #include <math.h> | 12 #include <math.h> |
| 13 #include <cmath> // for log() and pow() |
| 14 #include <list> | 14 #include <list> |
| 15 | 15 |
| 16 #include "base/logging.h" | 16 #include "base/logging.h" |
| 17 #include "base/memory/ptr_util.h" | 17 #include "base/memory/ptr_util.h" |
| 18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/string_split.h" | 19 #include "base/strings/string_split.h" |
| 20 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 21 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 22 #include "base/values.h" | 22 #include "base/values.h" |
| 23 #include "chrome/common/content_restriction.h" | 23 #include "chrome/common/content_restriction.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 pp::Var var; | 170 pp::Var var; |
| 171 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); | 171 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); |
| 172 if (object) { | 172 if (object) { |
| 173 var = static_cast<OutOfProcessInstance*>(object)->GetLinkAtPosition( | 173 var = static_cast<OutOfProcessInstance*>(object)->GetLinkAtPosition( |
| 174 pp::Point(point)); | 174 pp::Point(point)); |
| 175 } | 175 } |
| 176 return var.Detach(); | 176 return var.Detach(); |
| 177 } | 177 } |
| 178 | 178 |
| 179 void Transform(PP_Instance instance, PP_PrivatePageTransformType type) { | 179 void Transform(PP_Instance instance, PP_PrivatePageTransformType type) { |
| 180 void* object = | 180 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); |
| 181 pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); | |
| 182 if (object) { | 181 if (object) { |
| 183 OutOfProcessInstance* obj_instance = | 182 OutOfProcessInstance* obj_instance = |
| 184 static_cast<OutOfProcessInstance*>(object); | 183 static_cast<OutOfProcessInstance*>(object); |
| 185 switch (type) { | 184 switch (type) { |
| 186 case PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW: | 185 case PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW: |
| 187 obj_instance->RotateClockwise(); | 186 obj_instance->RotateClockwise(); |
| 188 break; | 187 break; |
| 189 case PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW: | 188 case PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW: |
| 190 obj_instance->RotateCounterclockwise(); | 189 obj_instance->RotateCounterclockwise(); |
| 191 break; | 190 break; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 208 void EnableAccessibility(PP_Instance instance) { | 207 void EnableAccessibility(PP_Instance instance) { |
| 209 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); | 208 void* object = pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); |
| 210 if (object) { | 209 if (object) { |
| 211 OutOfProcessInstance* obj_instance = | 210 OutOfProcessInstance* obj_instance = |
| 212 static_cast<OutOfProcessInstance*>(object); | 211 static_cast<OutOfProcessInstance*>(object); |
| 213 return obj_instance->EnableAccessibility(); | 212 return obj_instance->EnableAccessibility(); |
| 214 } | 213 } |
| 215 } | 214 } |
| 216 | 215 |
| 217 const PPP_Pdf ppp_private = { | 216 const PPP_Pdf ppp_private = { |
| 218 &GetLinkAtPosition, | 217 &GetLinkAtPosition, &Transform, &GetPrintPresetOptionsFromDocument, |
| 219 &Transform, | 218 &EnableAccessibility, |
| 220 &GetPrintPresetOptionsFromDocument, | |
| 221 &EnableAccessibility, | |
| 222 }; | 219 }; |
| 223 | 220 |
| 224 int ExtractPrintPreviewPageIndex(const std::string& src_url) { | 221 int ExtractPrintPreviewPageIndex(const std::string& src_url) { |
| 225 // Sample |src_url| format: chrome://print/id/page_index/print.pdf | 222 // Sample |src_url| format: chrome://print/id/page_index/print.pdf |
| 226 std::vector<std::string> url_substr = base::SplitString( | 223 std::vector<std::string> url_substr = |
| 227 src_url.substr(strlen(kChromePrint)), "/", | 224 base::SplitString(src_url.substr(strlen(kChromePrint)), "/", |
| 228 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | 225 base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
| 229 if (url_substr.size() != 3) | 226 if (url_substr.size() != 3) |
| 230 return -1; | 227 return -1; |
| 231 | 228 |
| 232 if (url_substr[2] != "print.pdf") | 229 if (url_substr[2] != "print.pdf") |
| 233 return -1; | 230 return -1; |
| 234 | 231 |
| 235 int page_index = 0; | 232 int page_index = 0; |
| 236 if (!base::StringToInt(url_substr[1], &page_index)) | 233 if (!base::StringToInt(url_substr[1], &page_index)) |
| 237 return -1; | 234 return -1; |
| 238 return page_index; | 235 return page_index; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 260 // replace this with a custom PPB_PDF function. | 257 // replace this with a custom PPB_PDF function. |
| 261 pp::Var ModalDialog(const pp::Instance* instance, | 258 pp::Var ModalDialog(const pp::Instance* instance, |
| 262 const std::string& type, | 259 const std::string& type, |
| 263 const std::string& message, | 260 const std::string& message, |
| 264 const std::string& default_answer) { | 261 const std::string& default_answer) { |
| 265 const PPB_Instance_Private* interface = | 262 const PPB_Instance_Private* interface = |
| 266 reinterpret_cast<const PPB_Instance_Private*>( | 263 reinterpret_cast<const PPB_Instance_Private*>( |
| 267 pp::Module::Get()->GetBrowserInterface( | 264 pp::Module::Get()->GetBrowserInterface( |
| 268 PPB_INSTANCE_PRIVATE_INTERFACE)); | 265 PPB_INSTANCE_PRIVATE_INTERFACE)); |
| 269 pp::VarPrivate window(pp::PASS_REF, | 266 pp::VarPrivate window(pp::PASS_REF, |
| 270 interface->GetWindowObject(instance->pp_instance())); | 267 interface->GetWindowObject(instance->pp_instance())); |
| 271 if (default_answer.empty()) | 268 if (default_answer.empty()) |
| 272 return window.Call(type, message); | 269 return window.Call(type, message); |
| 273 return window.Call(type, message, default_answer); | 270 return window.Call(type, message, default_answer); |
| 274 } | 271 } |
| 275 | 272 |
| 276 } // namespace | 273 } // namespace |
| 277 | 274 |
| 278 OutOfProcessInstance::OutOfProcessInstance(PP_Instance instance) | 275 OutOfProcessInstance::OutOfProcessInstance(PP_Instance instance) |
| 279 : pp::Instance(instance), | 276 : pp::Instance(instance), |
| 280 pp::Find_Private(this), | 277 pp::Find_Private(this), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 const char* argv[]) { | 324 const char* argv[]) { |
| 328 // Check if the PDF is being loaded in the PDF chrome extension. We only allow | 325 // Check if the PDF is being loaded in the PDF chrome extension. We only allow |
| 329 // the plugin to be loaded in the extension and print preview to avoid | 326 // the plugin to be loaded in the extension and print preview to avoid |
| 330 // exposing sensitive APIs directly to external websites. | 327 // exposing sensitive APIs directly to external websites. |
| 331 pp::Var document_url_var = pp::URLUtil_Dev::Get()->GetDocumentURL(this); | 328 pp::Var document_url_var = pp::URLUtil_Dev::Get()->GetDocumentURL(this); |
| 332 if (!document_url_var.is_string()) | 329 if (!document_url_var.is_string()) |
| 333 return false; | 330 return false; |
| 334 std::string document_url = document_url_var.AsString(); | 331 std::string document_url = document_url_var.AsString(); |
| 335 base::StringPiece document_url_piece(document_url); | 332 base::StringPiece document_url_piece(document_url); |
| 336 is_print_preview_ = document_url_piece.starts_with(kChromePrint); | 333 is_print_preview_ = document_url_piece.starts_with(kChromePrint); |
| 337 if (!document_url_piece.starts_with(kChromeExtension) && | 334 if (!document_url_piece.starts_with(kChromeExtension) && !is_print_preview_) { |
| 338 !is_print_preview_) { | |
| 339 return false; | 335 return false; |
| 340 } | 336 } |
| 341 | 337 |
| 342 // Check if the plugin is full frame. This is passed in from JS. | 338 // Check if the plugin is full frame. This is passed in from JS. |
| 343 for (uint32_t i = 0; i < argc; ++i) { | 339 for (uint32_t i = 0; i < argc; ++i) { |
| 344 if (strcmp(argn[i], "full-frame") == 0) { | 340 if (strcmp(argn[i], "full-frame") == 0) { |
| 345 full_ = true; | 341 full_ = true; |
| 346 break; | 342 break; |
| 347 } | 343 } |
| 348 } | 344 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 397 | 393 |
| 398 void OutOfProcessInstance::HandleMessage(const pp::Var& message) { | 394 void OutOfProcessInstance::HandleMessage(const pp::Var& message) { |
| 399 pp::VarDictionary dict(message); | 395 pp::VarDictionary dict(message); |
| 400 if (!dict.Get(kType).is_string()) { | 396 if (!dict.Get(kType).is_string()) { |
| 401 NOTREACHED(); | 397 NOTREACHED(); |
| 402 return; | 398 return; |
| 403 } | 399 } |
| 404 | 400 |
| 405 std::string type = dict.Get(kType).AsString(); | 401 std::string type = dict.Get(kType).AsString(); |
| 406 | 402 |
| 407 if (type == kJSViewportType && | 403 if (type == kJSViewportType && dict.Get(pp::Var(kJSXOffset)).is_number() && |
| 408 dict.Get(pp::Var(kJSXOffset)).is_number() && | |
| 409 dict.Get(pp::Var(kJSYOffset)).is_number() && | 404 dict.Get(pp::Var(kJSYOffset)).is_number() && |
| 410 dict.Get(pp::Var(kJSZoom)).is_number() && | 405 dict.Get(pp::Var(kJSZoom)).is_number() && |
| 411 dict.Get(pp::Var(kJSPinchPhase)).is_number()) { | 406 dict.Get(pp::Var(kJSPinchPhase)).is_number()) { |
| 412 received_viewport_message_ = true; | 407 received_viewport_message_ = true; |
| 413 stop_scrolling_ = false; | 408 stop_scrolling_ = false; |
| 414 PinchPhase pinch_phase = | 409 PinchPhase pinch_phase = |
| 415 static_cast<PinchPhase>(dict.Get(pp::Var(kJSPinchPhase)).AsInt()); | 410 static_cast<PinchPhase>(dict.Get(pp::Var(kJSPinchPhase)).AsInt()); |
| 416 double zoom = dict.Get(pp::Var(kJSZoom)).AsDouble(); | 411 double zoom = dict.Get(pp::Var(kJSZoom)).AsDouble(); |
| 417 double zoom_ratio = zoom / zoom_; | 412 double zoom_ratio = zoom / zoom_; |
| 418 | 413 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 // We want to keep the paint in the middle but it must stay in the same | 454 // We want to keep the paint in the middle but it must stay in the same |
| 460 // position relative to the scroll bars. | 455 // position relative to the scroll bars. |
| 461 paint_offset = pp::Point(0, (1 - zoom_ratio) * pinch_center.y()); | 456 paint_offset = pp::Point(0, (1 - zoom_ratio) * pinch_center.y()); |
| 462 scroll_delta = | 457 scroll_delta = |
| 463 pp::Point(0, (scroll_offset.y() - | 458 pp::Point(0, (scroll_offset.y() - |
| 464 scroll_offset_at_last_raster_.y() * zoom_ratio)); | 459 scroll_offset_at_last_raster_.y() * zoom_ratio)); |
| 465 | 460 |
| 466 pinch_vector = pp::Point(); | 461 pinch_vector = pp::Point(); |
| 467 last_bitmap_smaller_ = true; | 462 last_bitmap_smaller_ = true; |
| 468 } else if (last_bitmap_smaller_) { | 463 } else if (last_bitmap_smaller_) { |
| 469 pinch_center = pp::Point((plugin_size_.width() / device_scale_) / 2, | 464 pinch_center = pp::Point((plugin_size_.width() / device_scale_) / 2, |
| 470 (plugin_size_.height() / device_scale_) / 2); | 465 (plugin_size_.height() / device_scale_) / 2); |
| 471 const double zoom_when_doc_covers_plugin_width = | 466 const double zoom_when_doc_covers_plugin_width = |
| 472 zoom_ * plugin_size_.width() / GetDocumentPixelWidth(); | 467 zoom_ * plugin_size_.width() / GetDocumentPixelWidth(); |
| 473 paint_offset = pp::Point( | 468 paint_offset = pp::Point( |
| 474 (1 - zoom / zoom_when_doc_covers_plugin_width) * pinch_center.x(), | 469 (1 - zoom / zoom_when_doc_covers_plugin_width) * pinch_center.x(), |
| 475 (1 - zoom_ratio) * pinch_center.y()); | 470 (1 - zoom_ratio) * pinch_center.y()); |
| 476 pinch_vector = pp::Point(); | 471 pinch_vector = pp::Point(); |
| 477 scroll_delta = | 472 scroll_delta = |
| 478 pp::Point((scroll_offset.x() - | 473 pp::Point((scroll_offset.x() - |
| 479 scroll_offset_at_last_raster_.x() * zoom_ratio), | 474 scroll_offset_at_last_raster_.x() * zoom_ratio), |
| 480 (scroll_offset.y() - | 475 (scroll_offset.y() - |
| 481 scroll_offset_at_last_raster_.y() * zoom_ratio)); | 476 scroll_offset_at_last_raster_.y() * zoom_ratio)); |
| 482 } | 477 } |
| 483 | 478 |
| 484 paint_manager_.SetTransform(zoom_ratio, pinch_center, | 479 paint_manager_.SetTransform(zoom_ratio, pinch_center, |
| 485 pinch_vector + paint_offset + scroll_delta, | 480 pinch_vector + paint_offset + scroll_delta, |
| 486 true); | 481 true); |
| 487 needs_reraster_ = false; | 482 needs_reraster_ = false; |
| 488 return; | 483 return; |
| 489 } | 484 } |
| 490 | 485 |
| 491 if (pinch_phase == PINCH_UPDATE_ZOOM_OUT || pinch_phase == PINCH_END) { | 486 if (pinch_phase == PINCH_UPDATE_ZOOM_OUT || pinch_phase == PINCH_END) { |
| 492 // We reraster on pinch zoom out in order to solve the invalid regions | 487 // We reraster on pinch zoom out in order to solve the invalid regions |
| 493 // that appear after zooming out. | 488 // that appear after zooming out. |
| 494 // On pinch end the scale is again 1.f and we request a reraster | 489 // On pinch end the scale is again 1.f and we request a reraster |
| 495 // in the new position. | 490 // in the new position. |
| 496 paint_manager_.ClearTransform(); | 491 paint_manager_.ClearTransform(); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 | 547 |
| 553 paint_manager_.InvalidateRect(pp::Rect(pp::Point(), plugin_size_)); | 548 paint_manager_.InvalidateRect(pp::Rect(pp::Point(), plugin_size_)); |
| 554 } else if (type == kJSLoadPreviewPageType && | 549 } else if (type == kJSLoadPreviewPageType && |
| 555 dict.Get(pp::Var(kJSPreviewPageUrl)).is_string() && | 550 dict.Get(pp::Var(kJSPreviewPageUrl)).is_string() && |
| 556 dict.Get(pp::Var(kJSPreviewPageIndex)).is_int()) { | 551 dict.Get(pp::Var(kJSPreviewPageIndex)).is_int()) { |
| 557 std::string url = dict.Get(pp::Var(kJSPreviewPageUrl)).AsString(); | 552 std::string url = dict.Get(pp::Var(kJSPreviewPageUrl)).AsString(); |
| 558 // For security reasons we crash if the URL that is trying to be loaded here | 553 // For security reasons we crash if the URL that is trying to be loaded here |
| 559 // isn't a print preview one. | 554 // isn't a print preview one. |
| 560 CHECK(IsPrintPreview()); | 555 CHECK(IsPrintPreview()); |
| 561 CHECK(IsPrintPreviewUrl(url)); | 556 CHECK(IsPrintPreviewUrl(url)); |
| 562 ProcessPreviewPageInfo(url, | 557 ProcessPreviewPageInfo(url, dict.Get(pp::Var(kJSPreviewPageIndex)).AsInt()); |
| 563 dict.Get(pp::Var(kJSPreviewPageIndex)).AsInt()); | |
| 564 } else if (type == kJSStopScrollingType) { | 558 } else if (type == kJSStopScrollingType) { |
| 565 stop_scrolling_ = true; | 559 stop_scrolling_ = true; |
| 566 } else if (type == kJSGetSelectedTextType) { | 560 } else if (type == kJSGetSelectedTextType) { |
| 567 std::string selected_text = engine_->GetSelectedText(); | 561 std::string selected_text = engine_->GetSelectedText(); |
| 568 // Always return unix newlines to JS. | 562 // Always return unix newlines to JS. |
| 569 base::ReplaceChars(selected_text, "\r", std::string(), &selected_text); | 563 base::ReplaceChars(selected_text, "\r", std::string(), &selected_text); |
| 570 pp::VarDictionary reply; | 564 pp::VarDictionary reply; |
| 571 reply.Set(pp::Var(kType), pp::Var(kJSGetSelectedTextReplyType)); | 565 reply.Set(pp::Var(kType), pp::Var(kJSGetSelectedTextReplyType)); |
| 572 reply.Set(pp::Var(kJSSelectedText), selected_text); | 566 reply.Set(pp::Var(kJSSelectedText), selected_text); |
| 573 PostMessage(reply); | 567 PostMessage(reply); |
| 574 } else if (type == KJSGetNamedDestinationType && | 568 } else if (type == KJSGetNamedDestinationType && |
| 575 dict.Get(pp::Var(KJSGetNamedDestination)).is_string()) { | 569 dict.Get(pp::Var(KJSGetNamedDestination)).is_string()) { |
| 576 int page_number = engine_->GetNamedDestinationPage( | 570 int page_number = engine_->GetNamedDestinationPage( |
| 577 dict.Get(pp::Var(KJSGetNamedDestination)).AsString()); | 571 dict.Get(pp::Var(KJSGetNamedDestination)).AsString()); |
| 578 pp::VarDictionary reply; | 572 pp::VarDictionary reply; |
| 579 reply.Set(pp::Var(kType), pp::Var(kJSGetNamedDestinationReplyType)); | 573 reply.Set(pp::Var(kType), pp::Var(kJSGetNamedDestinationReplyType)); |
| 580 if (page_number >= 0) | 574 if (page_number >= 0) |
| 581 reply.Set(pp::Var(kJSNamedDestinationPageNumber), page_number); | 575 reply.Set(pp::Var(kJSNamedDestinationPageNumber), page_number); |
| 582 PostMessage(reply); | 576 PostMessage(reply); |
| 583 } else { | 577 } else { |
| 584 NOTREACHED(); | 578 NOTREACHED(); |
| 585 } | 579 } |
| 586 } | 580 } |
| 587 | 581 |
| 588 bool OutOfProcessInstance::HandleInputEvent( | 582 bool OutOfProcessInstance::HandleInputEvent(const pp::InputEvent& event) { |
| 589 const pp::InputEvent& event) { | |
| 590 // To simplify things, convert the event into device coordinates if it is | 583 // To simplify things, convert the event into device coordinates if it is |
| 591 // a mouse event. | 584 // a mouse event. |
| 592 pp::InputEvent event_device_res(event); | 585 pp::InputEvent event_device_res(event); |
| 593 { | 586 { |
| 594 pp::MouseInputEvent mouse_event(event); | 587 pp::MouseInputEvent mouse_event(event); |
| 595 if (!mouse_event.is_null()) { | 588 if (!mouse_event.is_null()) { |
| 596 pp::Point point = mouse_event.GetPosition(); | 589 pp::Point point = mouse_event.GetPosition(); |
| 597 pp::Point movement = mouse_event.GetMovement(); | 590 pp::Point movement = mouse_event.GetMovement(); |
| 598 ScalePoint(device_scale_, &point); | 591 ScalePoint(device_scale_, &point); |
| 599 ScalePoint(device_scale_, &movement); | 592 ScalePoint(device_scale_, &movement); |
| 600 mouse_event = pp::MouseInputEvent( | 593 mouse_event = |
| 601 this, | 594 pp::MouseInputEvent(this, event.GetType(), event.GetTimeStamp(), |
| 602 event.GetType(), | 595 event.GetModifiers(), mouse_event.GetButton(), |
| 603 event.GetTimeStamp(), | 596 point, mouse_event.GetClickCount(), movement); |
| 604 event.GetModifiers(), | |
| 605 mouse_event.GetButton(), | |
| 606 point, | |
| 607 mouse_event.GetClickCount(), | |
| 608 movement); | |
| 609 event_device_res = mouse_event; | 597 event_device_res = mouse_event; |
| 610 } | 598 } |
| 611 } | 599 } |
| 612 | 600 |
| 613 pp::InputEvent offset_event(event_device_res); | 601 pp::InputEvent offset_event(event_device_res); |
| 614 switch (offset_event.GetType()) { | 602 switch (offset_event.GetType()) { |
| 615 case PP_INPUTEVENT_TYPE_MOUSEDOWN: | 603 case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
| 616 case PP_INPUTEVENT_TYPE_MOUSEUP: | 604 case PP_INPUTEVENT_TYPE_MOUSEUP: |
| 617 case PP_INPUTEVENT_TYPE_MOUSEMOVE: | 605 case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
| 618 case PP_INPUTEVENT_TYPE_MOUSEENTER: | 606 case PP_INPUTEVENT_TYPE_MOUSEENTER: |
| 619 case PP_INPUTEVENT_TYPE_MOUSELEAVE: { | 607 case PP_INPUTEVENT_TYPE_MOUSELEAVE: { |
| 620 pp::MouseInputEvent mouse_event(event_device_res); | 608 pp::MouseInputEvent mouse_event(event_device_res); |
| 621 pp::MouseInputEvent mouse_event_dip(event); | 609 pp::MouseInputEvent mouse_event_dip(event); |
| 622 pp::Point point = mouse_event.GetPosition(); | 610 pp::Point point = mouse_event.GetPosition(); |
| 623 point.set_x(point.x() - available_area_.x()); | 611 point.set_x(point.x() - available_area_.x()); |
| 624 offset_event = pp::MouseInputEvent( | 612 offset_event = pp::MouseInputEvent( |
| 625 this, | 613 this, event.GetType(), event.GetTimeStamp(), event.GetModifiers(), |
| 626 event.GetType(), | 614 mouse_event.GetButton(), point, mouse_event.GetClickCount(), |
| 627 event.GetTimeStamp(), | |
| 628 event.GetModifiers(), | |
| 629 mouse_event.GetButton(), | |
| 630 point, | |
| 631 mouse_event.GetClickCount(), | |
| 632 mouse_event.GetMovement()); | 615 mouse_event.GetMovement()); |
| 633 break; | 616 break; |
| 634 } | 617 } |
| 635 default: | 618 default: |
| 636 break; | 619 break; |
| 637 } | 620 } |
| 638 if (engine_->HandleEvent(offset_event)) | 621 if (engine_->HandleEvent(offset_event)) |
| 639 return true; | 622 return true; |
| 640 | 623 |
| 641 // Middle click is used for scrolling and is handled by the container page. | 624 // Middle click is used for scrolling and is handled by the container page. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 656 pp::Size view_device_size(view_rect.width() * device_scale, | 639 pp::Size view_device_size(view_rect.width() * device_scale, |
| 657 view_rect.height() * device_scale); | 640 view_rect.height() * device_scale); |
| 658 | 641 |
| 659 if (view_device_size != plugin_size_ || device_scale != device_scale_) { | 642 if (view_device_size != plugin_size_ || device_scale != device_scale_) { |
| 660 device_scale_ = device_scale; | 643 device_scale_ = device_scale; |
| 661 plugin_dip_size_ = view_rect.size(); | 644 plugin_dip_size_ = view_rect.size(); |
| 662 plugin_size_ = view_device_size; | 645 plugin_size_ = view_device_size; |
| 663 | 646 |
| 664 paint_manager_.SetSize(view_device_size, device_scale_); | 647 paint_manager_.SetSize(view_device_size, device_scale_); |
| 665 | 648 |
| 666 pp::Size new_image_data_size = PaintManager::GetNewContextSize( | 649 pp::Size new_image_data_size = |
| 667 image_data_.size(), | 650 PaintManager::GetNewContextSize(image_data_.size(), plugin_size_); |
| 668 plugin_size_); | |
| 669 if (new_image_data_size != image_data_.size()) { | 651 if (new_image_data_size != image_data_.size()) { |
| 670 image_data_ = pp::ImageData(this, | 652 image_data_ = pp::ImageData(this, PP_IMAGEDATAFORMAT_BGRA_PREMUL, |
| 671 PP_IMAGEDATAFORMAT_BGRA_PREMUL, | 653 new_image_data_size, false); |
| 672 new_image_data_size, | |
| 673 false); | |
| 674 first_paint_ = true; | 654 first_paint_ = true; |
| 675 } | 655 } |
| 676 | 656 |
| 677 if (image_data_.is_null()) { | 657 if (image_data_.is_null()) { |
| 678 DCHECK(plugin_size_.IsEmpty()); | 658 DCHECK(plugin_size_.IsEmpty()); |
| 679 return; | 659 return; |
| 680 } | 660 } |
| 681 | 661 |
| 682 OnGeometryChanged(zoom_, old_device_scale); | 662 OnGeometryChanged(zoom_, old_device_scale); |
| 683 } | 663 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 if (document_load_state_ == LOAD_STATE_COMPLETE) | 698 if (document_load_state_ == LOAD_STATE_COMPLETE) |
| 719 LoadAccessibility(); | 699 LoadAccessibility(); |
| 720 } | 700 } |
| 721 | 701 |
| 722 void OutOfProcessInstance::LoadAccessibility() { | 702 void OutOfProcessInstance::LoadAccessibility() { |
| 723 accessibility_state_ = ACCESSIBILITY_STATE_LOADED; | 703 accessibility_state_ = ACCESSIBILITY_STATE_LOADED; |
| 724 PP_PrivateAccessibilityDocInfo doc_info; | 704 PP_PrivateAccessibilityDocInfo doc_info; |
| 725 doc_info.page_count = engine_->GetNumberOfPages(); | 705 doc_info.page_count = engine_->GetNumberOfPages(); |
| 726 doc_info.text_accessible = PP_FromBool( | 706 doc_info.text_accessible = PP_FromBool( |
| 727 engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE)); | 707 engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE)); |
| 728 doc_info.text_copyable = PP_FromBool( | 708 doc_info.text_copyable = |
| 729 engine_->HasPermission(PDFEngine::PERMISSION_COPY)); | 709 PP_FromBool(engine_->HasPermission(PDFEngine::PERMISSION_COPY)); |
| 730 | 710 |
| 731 pp::PDF::SetAccessibilityDocInfo(GetPluginInstance(), &doc_info); | 711 pp::PDF::SetAccessibilityDocInfo(GetPluginInstance(), &doc_info); |
| 732 | 712 |
| 733 // If the document contents isn't accessible, don't send anything more. | 713 // If the document contents isn't accessible, don't send anything more. |
| 734 if (!(engine_->HasPermission(PDFEngine::PERMISSION_COPY) || | 714 if (!(engine_->HasPermission(PDFEngine::PERMISSION_COPY) || |
| 735 engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE))) { | 715 engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE))) { |
| 736 return; | 716 return; |
| 737 } | 717 } |
| 738 | 718 |
| 739 SendAccessibilityViewportInfo(); | 719 SendAccessibilityViewportInfo(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 782 | 762 |
| 783 // We need to provide enough information to draw a bounding box | 763 // We need to provide enough information to draw a bounding box |
| 784 // around any arbitrary text range, but the bounding boxes of characters | 764 // around any arbitrary text range, but the bounding boxes of characters |
| 785 // we get from PDFium don't necessarily "line up". Walk through the | 765 // we get from PDFium don't necessarily "line up". Walk through the |
| 786 // characters in each text run and let the width of each character be | 766 // characters in each text run and let the width of each character be |
| 787 // the difference between the x coordinate of one character and the | 767 // the difference between the x coordinate of one character and the |
| 788 // x coordinate of the next. The rest of the bounds of each character | 768 // x coordinate of the next. The rest of the bounds of each character |
| 789 // can be computed from the bounds of the text run. | 769 // can be computed from the bounds of the text run. |
| 790 pp::FloatRect char_bounds = engine_->GetCharBounds(page_index, char_index); | 770 pp::FloatRect char_bounds = engine_->GetCharBounds(page_index, char_index); |
| 791 for (uint32_t i = 0; i < text_run_info.len - 1; i++) { | 771 for (uint32_t i = 0; i < text_run_info.len - 1; i++) { |
| 792 DCHECK_LT(char_index + i + 1, | 772 DCHECK_LT(char_index + i + 1, static_cast<uint32_t>(char_count)); |
| 793 static_cast<uint32_t>(char_count)); | 773 pp::FloatRect next_char_bounds = |
| 794 pp::FloatRect next_char_bounds = engine_->GetCharBounds( | 774 engine_->GetCharBounds(page_index, char_index + i + 1); |
| 795 page_index, char_index + i + 1); | |
| 796 chars[char_index + i].char_width = next_char_bounds.x() - char_bounds.x(); | 775 chars[char_index + i].char_width = next_char_bounds.x() - char_bounds.x(); |
| 797 char_bounds = next_char_bounds; | 776 char_bounds = next_char_bounds; |
| 798 } | 777 } |
| 799 chars[char_index + text_run_info.len - 1].char_width = char_bounds.width(); | 778 chars[char_index + text_run_info.len - 1].char_width = char_bounds.width(); |
| 800 | 779 |
| 801 char_index += text_run_info.len; | 780 char_index += text_run_info.len; |
| 802 } | 781 } |
| 803 | 782 |
| 804 page_info.text_run_count = text_runs.size(); | 783 page_info.text_run_count = text_runs.size(); |
| 805 pp::PDF::SetAccessibilityPageInfo(GetPluginInstance(), &page_info, | 784 pp::PDF::SetAccessibilityPageInfo(GetPluginInstance(), &page_info, |
| 806 text_runs.data(), chars.data()); | 785 text_runs.data(), chars.data()); |
| 807 | 786 |
| 808 // Schedule loading the next page. | 787 // Schedule loading the next page. |
| 809 pp::CompletionCallback callback = timer_factory_.NewCallback( | 788 pp::CompletionCallback callback = timer_factory_.NewCallback( |
| 810 &OutOfProcessInstance::SendNextAccessibilityPage); | 789 &OutOfProcessInstance::SendNextAccessibilityPage); |
| 811 pp::Module::Get()->core()->CallOnMainThread(kAccessibilityPageDelayMs, | 790 pp::Module::Get()->core()->CallOnMainThread(kAccessibilityPageDelayMs, |
| 812 callback, page_index + 1); | 791 callback, page_index + 1); |
| 813 } | 792 } |
| 814 | 793 |
| 815 void OutOfProcessInstance::SendAccessibilityViewportInfo() { | 794 void OutOfProcessInstance::SendAccessibilityViewportInfo() { |
| 816 PP_PrivateAccessibilityViewportInfo viewport_info; | 795 PP_PrivateAccessibilityViewportInfo viewport_info; |
| 817 viewport_info.scroll.x = 0; | 796 viewport_info.scroll.x = 0; |
| 818 viewport_info.scroll.y = -top_toolbar_height_ * device_scale_; | 797 viewport_info.scroll.y = -top_toolbar_height_ * device_scale_; |
| 819 viewport_info.offset = available_area_.point(); | 798 viewport_info.offset = available_area_.point(); |
| 820 viewport_info.zoom = zoom_ * device_scale_; | 799 viewport_info.zoom = zoom_ * device_scale_; |
| 821 pp::PDF::SetAccessibilityViewportInfo(GetPluginInstance(), &viewport_info); | 800 pp::PDF::SetAccessibilityViewportInfo(GetPluginInstance(), &viewport_info); |
| 822 } | 801 } |
| 823 | 802 |
| 824 pp::Var OutOfProcessInstance::GetLinkAtPosition( | 803 pp::Var OutOfProcessInstance::GetLinkAtPosition(const pp::Point& point) { |
| 825 const pp::Point& point) { | |
| 826 pp::Point offset_point(point); | 804 pp::Point offset_point(point); |
| 827 ScalePoint(device_scale_, &offset_point); | 805 ScalePoint(device_scale_, &offset_point); |
| 828 offset_point.set_x(offset_point.x() - available_area_.x()); | 806 offset_point.set_x(offset_point.x() - available_area_.x()); |
| 829 return engine_->GetLinkAtPosition(offset_point); | 807 return engine_->GetLinkAtPosition(offset_point); |
| 830 } | 808 } |
| 831 | 809 |
| 832 uint32_t OutOfProcessInstance::QuerySupportedPrintOutputFormats() { | 810 uint32_t OutOfProcessInstance::QuerySupportedPrintOutputFormats() { |
| 833 return engine_->QuerySupportedPrintOutputFormats(); | 811 return engine_->QuerySupportedPrintOutputFormats(); |
| 834 } | 812 } |
| 835 | 813 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 void OutOfProcessInstance::SelectFindResult(bool forward) { | 860 void OutOfProcessInstance::SelectFindResult(bool forward) { |
| 883 engine_->SelectFindResult(forward); | 861 engine_->SelectFindResult(forward); |
| 884 } | 862 } |
| 885 | 863 |
| 886 void OutOfProcessInstance::StopFind() { | 864 void OutOfProcessInstance::StopFind() { |
| 887 engine_->StopFind(); | 865 engine_->StopFind(); |
| 888 tickmarks_.clear(); | 866 tickmarks_.clear(); |
| 889 SetTickmarks(tickmarks_); | 867 SetTickmarks(tickmarks_); |
| 890 } | 868 } |
| 891 | 869 |
| 892 void OutOfProcessInstance::OnPaint( | 870 void OutOfProcessInstance::OnPaint(const std::vector<pp::Rect>& paint_rects, |
| 893 const std::vector<pp::Rect>& paint_rects, | 871 std::vector<PaintManager::ReadyRect>* ready, |
| 894 std::vector<PaintManager::ReadyRect>* ready, | 872 std::vector<pp::Rect>* pending) { |
| 895 std::vector<pp::Rect>* pending) { | |
| 896 if (image_data_.is_null()) { | 873 if (image_data_.is_null()) { |
| 897 DCHECK(plugin_size_.IsEmpty()); | 874 DCHECK(plugin_size_.IsEmpty()); |
| 898 return; | 875 return; |
| 899 } | 876 } |
| 900 if (first_paint_) { | 877 if (first_paint_) { |
| 901 first_paint_ = false; | 878 first_paint_ = false; |
| 902 pp::Rect rect = pp::Rect(pp::Point(), image_data_.size()); | 879 pp::Rect rect = pp::Rect(pp::Point(), image_data_.size()); |
| 903 FillRect(rect, background_color_); | 880 FillRect(rect, background_color_); |
| 904 ready->push_back(PaintManager::ReadyRect(rect, image_data_, true)); | 881 ready->push_back(PaintManager::ReadyRect(rect, image_data_, true)); |
| 905 } | 882 } |
| 906 | 883 |
| 907 if (!received_viewport_message_ || !needs_reraster_) | 884 if (!received_viewport_message_ || !needs_reraster_) |
| 908 return; | 885 return; |
| 909 | 886 |
| 910 engine_->PrePaint(); | 887 engine_->PrePaint(); |
| 911 | 888 |
| 912 for (const auto& paint_rect : paint_rects) { | 889 for (const auto& paint_rect : paint_rects) { |
| 913 // Intersect with plugin area since there could be pending invalidates from | 890 // Intersect with plugin area since there could be pending invalidates from |
| 914 // when the plugin area was larger. | 891 // when the plugin area was larger. |
| 915 pp::Rect rect = | 892 pp::Rect rect = paint_rect.Intersect(pp::Rect(pp::Point(), plugin_size_)); |
| 916 paint_rect.Intersect(pp::Rect(pp::Point(), plugin_size_)); | |
| 917 if (rect.IsEmpty()) | 893 if (rect.IsEmpty()) |
| 918 continue; | 894 continue; |
| 919 | 895 |
| 920 pp::Rect pdf_rect = available_area_.Intersect(rect); | 896 pp::Rect pdf_rect = available_area_.Intersect(rect); |
| 921 if (!pdf_rect.IsEmpty()) { | 897 if (!pdf_rect.IsEmpty()) { |
| 922 pdf_rect.Offset(available_area_.x() * -1, 0); | 898 pdf_rect.Offset(available_area_.x() * -1, 0); |
| 923 | 899 |
| 924 std::vector<pp::Rect> pdf_ready; | 900 std::vector<pp::Rect> pdf_ready; |
| 925 std::vector<pp::Rect> pdf_pending; | 901 std::vector<pp::Rect> pdf_pending; |
| 926 engine_->Paint(pdf_rect, &image_data_, &pdf_ready, &pdf_pending); | 902 engine_->Paint(pdf_rect, &image_data_, &pdf_ready, &pdf_pending); |
| 927 for (auto& ready_rect : pdf_ready) { | 903 for (auto& ready_rect : pdf_ready) { |
| 928 ready_rect.Offset(available_area_.point()); | 904 ready_rect.Offset(available_area_.point()); |
| 929 ready->push_back( | 905 ready->push_back( |
| 930 PaintManager::ReadyRect(ready_rect, image_data_, false)); | 906 PaintManager::ReadyRect(ready_rect, image_data_, false)); |
| 931 } | 907 } |
| 932 for (auto& pending_rect : pdf_pending) { | 908 for (auto& pending_rect : pdf_pending) { |
| 933 pending_rect.Offset(available_area_.point()); | 909 pending_rect.Offset(available_area_.point()); |
| 934 pending->push_back(pending_rect); | 910 pending->push_back(pending_rect); |
| 935 } | 911 } |
| 936 } | 912 } |
| 937 | 913 |
| 938 // Ensure the region above the first page (if any) is filled; | 914 // Ensure the region above the first page (if any) is filled; |
| 939 int32_t first_page_ypos = engine_->GetNumberOfPages() == 0 ? | 915 int32_t first_page_ypos = engine_->GetNumberOfPages() == 0 |
| 940 0 : engine_->GetPageScreenRect(0).y(); | 916 ? 0 |
| 917 : engine_->GetPageScreenRect(0).y(); |
| 941 if (rect.y() < first_page_ypos) { | 918 if (rect.y() < first_page_ypos) { |
| 942 pp::Rect region = rect.Intersect(pp::Rect( | 919 pp::Rect region = rect.Intersect(pp::Rect( |
| 943 pp::Point(), pp::Size(plugin_size_.width(), first_page_ypos))); | 920 pp::Point(), pp::Size(plugin_size_.width(), first_page_ypos))); |
| 944 ready->push_back(PaintManager::ReadyRect(region, image_data_, false)); | 921 ready->push_back(PaintManager::ReadyRect(region, image_data_, false)); |
| 945 FillRect(region, background_color_); | 922 FillRect(region, background_color_); |
| 946 } | 923 } |
| 947 | 924 |
| 948 for (const auto& background_part : background_parts_) { | 925 for (const auto& background_part : background_parts_) { |
| 949 pp::Rect intersection = background_part.location.Intersect(rect); | 926 pp::Rect intersection = background_part.location.Intersect(rect); |
| 950 if (!intersection.IsEmpty()) { | 927 if (!intersection.IsEmpty()) { |
| 951 FillRect(intersection, background_part.color); | 928 FillRect(intersection, background_part.color); |
| 952 ready->push_back( | 929 ready->push_back( |
| 953 PaintManager::ReadyRect(intersection, image_data_, false)); | 930 PaintManager::ReadyRect(intersection, image_data_, false)); |
| 954 } | 931 } |
| 955 } | 932 } |
| 956 } | 933 } |
| 957 | 934 |
| 958 engine_->PostPaint(); | 935 engine_->PostPaint(); |
| 959 } | 936 } |
| 960 | 937 |
| 961 void OutOfProcessInstance::DidOpen(int32_t result) { | 938 void OutOfProcessInstance::DidOpen(int32_t result) { |
| 962 if (result == PP_OK) { | 939 if (result == PP_OK) { |
| 963 if (!engine_->HandleDocumentLoad(embed_loader_)) { | 940 if (!engine_->HandleDocumentLoad(embed_loader_)) { |
| 964 document_load_state_ = LOAD_STATE_LOADING; | 941 document_load_state_ = LOAD_STATE_LOADING; |
| 965 DocumentLoadFailed(); | 942 DocumentLoadFailed(); |
| 966 } | 943 } |
| 967 } else if (result != PP_ERROR_ABORTED) { // Can happen in tests. | 944 } else if (result != PP_ERROR_ABORTED) { // Can happen in tests. |
| 968 NOTREACHED(); | 945 NOTREACHED(); |
| 969 DocumentLoadFailed(); | 946 DocumentLoadFailed(); |
| 970 } | 947 } |
| 971 | 948 |
| 972 // If it's a progressive load, cancel the stream URL request so that requests | 949 // If it's a progressive load, cancel the stream URL request so that requests |
| 973 // can be made on the original URL. | 950 // can be made on the original URL. |
| 974 // TODO(raymes): Make this clearer once the in-process plugin is deleted. | 951 // TODO(raymes): Make this clearer once the in-process plugin is deleted. |
| 975 if (engine_->IsProgressiveLoad()) { | 952 if (engine_->IsProgressiveLoad()) { |
| 976 pp::VarDictionary message; | 953 pp::VarDictionary message; |
| 977 message.Set(kType, kJSCancelStreamUrlType); | 954 message.Set(kType, kJSCancelStreamUrlType); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 995 | 972 |
| 996 void OutOfProcessInstance::CalculateBackgroundParts() { | 973 void OutOfProcessInstance::CalculateBackgroundParts() { |
| 997 background_parts_.clear(); | 974 background_parts_.clear(); |
| 998 int left_width = available_area_.x(); | 975 int left_width = available_area_.x(); |
| 999 int right_start = available_area_.right(); | 976 int right_start = available_area_.right(); |
| 1000 int right_width = abs(plugin_size_.width() - available_area_.right()); | 977 int right_width = abs(plugin_size_.width() - available_area_.right()); |
| 1001 int bottom = std::min(available_area_.bottom(), plugin_size_.height()); | 978 int bottom = std::min(available_area_.bottom(), plugin_size_.height()); |
| 1002 | 979 |
| 1003 // Add the left, right, and bottom rectangles. Note: we assume only | 980 // Add the left, right, and bottom rectangles. Note: we assume only |
| 1004 // horizontal centering. | 981 // horizontal centering. |
| 1005 BackgroundPart part = { | 982 BackgroundPart part = {pp::Rect(0, 0, left_width, bottom), background_color_}; |
| 1006 pp::Rect(0, 0, left_width, bottom), | |
| 1007 background_color_ | |
| 1008 }; | |
| 1009 if (!part.location.IsEmpty()) | 983 if (!part.location.IsEmpty()) |
| 1010 background_parts_.push_back(part); | 984 background_parts_.push_back(part); |
| 1011 part.location = pp::Rect(right_start, 0, right_width, bottom); | 985 part.location = pp::Rect(right_start, 0, right_width, bottom); |
| 1012 if (!part.location.IsEmpty()) | 986 if (!part.location.IsEmpty()) |
| 1013 background_parts_.push_back(part); | 987 background_parts_.push_back(part); |
| 1014 part.location = pp::Rect( | 988 part.location = |
| 1015 0, bottom, plugin_size_.width(), plugin_size_.height() - bottom); | 989 pp::Rect(0, bottom, plugin_size_.width(), plugin_size_.height() - bottom); |
| 1016 if (!part.location.IsEmpty()) | 990 if (!part.location.IsEmpty()) |
| 1017 background_parts_.push_back(part); | 991 background_parts_.push_back(part); |
| 1018 } | 992 } |
| 1019 | 993 |
| 1020 int OutOfProcessInstance::GetDocumentPixelWidth() const { | 994 int OutOfProcessInstance::GetDocumentPixelWidth() const { |
| 1021 return static_cast<int>(ceil(document_size_.width() * zoom_ * device_scale_)); | 995 return static_cast<int>(ceil(document_size_.width() * zoom_ * device_scale_)); |
| 1022 } | 996 } |
| 1023 | 997 |
| 1024 int OutOfProcessInstance::GetDocumentPixelHeight() const { | 998 int OutOfProcessInstance::GetDocumentPixelHeight() const { |
| 1025 return static_cast<int>( | 999 return static_cast<int>( |
| 1026 ceil(document_size_.height() * zoom_ * device_scale_)); | 1000 ceil(document_size_.height() * zoom_ * device_scale_)); |
| 1027 } | 1001 } |
| 1028 | 1002 |
| 1029 void OutOfProcessInstance::FillRect(const pp::Rect& rect, uint32_t color) { | 1003 void OutOfProcessInstance::FillRect(const pp::Rect& rect, uint32_t color) { |
| 1030 DCHECK(!image_data_.is_null() || rect.IsEmpty()); | 1004 DCHECK(!image_data_.is_null() || rect.IsEmpty()); |
| 1031 uint32_t* buffer_start = static_cast<uint32_t*>(image_data_.data()); | 1005 uint32_t* buffer_start = static_cast<uint32_t*>(image_data_.data()); |
| 1032 int stride = image_data_.stride(); | 1006 int stride = image_data_.stride(); |
| 1033 uint32_t* ptr = buffer_start + rect.y() * stride / 4 + rect.x(); | 1007 uint32_t* ptr = buffer_start + rect.y() * stride / 4 + rect.x(); |
| 1034 int height = rect.height(); | 1008 int height = rect.height(); |
| 1035 int width = rect.width(); | 1009 int width = rect.width(); |
| 1036 for (int y = 0; y < height; ++y) { | 1010 for (int y = 0; y < height; ++y) { |
| 1037 for (int x = 0; x < width; ++x) | 1011 for (int x = 0; x < width; ++x) |
| 1038 *(ptr + x) = color; | 1012 *(ptr + x) = color; |
| 1039 ptr += stride /4; | 1013 ptr += stride / 4; |
| 1040 } | 1014 } |
| 1041 } | 1015 } |
| 1042 | 1016 |
| 1043 void OutOfProcessInstance::DocumentSizeUpdated(const pp::Size& size) { | 1017 void OutOfProcessInstance::DocumentSizeUpdated(const pp::Size& size) { |
| 1044 document_size_ = size; | 1018 document_size_ = size; |
| 1045 | 1019 |
| 1046 pp::VarDictionary dimensions; | 1020 pp::VarDictionary dimensions; |
| 1047 dimensions.Set(kType, kJSDocumentDimensionsType); | 1021 dimensions.Set(kType, kJSDocumentDimensionsType); |
| 1048 dimensions.Set(kJSDocumentWidth, pp::Var(document_size_.width())); | 1022 dimensions.Set(kJSDocumentWidth, pp::Var(document_size_.width())); |
| 1049 dimensions.Set(kJSDocumentHeight, pp::Var(document_size_.height())); | 1023 dimensions.Set(kJSDocumentHeight, pp::Var(document_size_.height())); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 PostMessage(message); | 1083 PostMessage(message); |
| 1110 } | 1084 } |
| 1111 | 1085 |
| 1112 void OutOfProcessInstance::UpdateCursor(PP_CursorType_Dev cursor) { | 1086 void OutOfProcessInstance::UpdateCursor(PP_CursorType_Dev cursor) { |
| 1113 if (cursor == cursor_) | 1087 if (cursor == cursor_) |
| 1114 return; | 1088 return; |
| 1115 cursor_ = cursor; | 1089 cursor_ = cursor; |
| 1116 | 1090 |
| 1117 const PPB_CursorControl_Dev* cursor_interface = | 1091 const PPB_CursorControl_Dev* cursor_interface = |
| 1118 reinterpret_cast<const PPB_CursorControl_Dev*>( | 1092 reinterpret_cast<const PPB_CursorControl_Dev*>( |
| 1119 pp::Module::Get()->GetBrowserInterface(PPB_CURSOR_CONTROL_DEV_INTERFACE)); | 1093 pp::Module::Get()->GetBrowserInterface( |
| 1094 PPB_CURSOR_CONTROL_DEV_INTERFACE)); |
| 1120 if (!cursor_interface) { | 1095 if (!cursor_interface) { |
| 1121 NOTREACHED(); | 1096 NOTREACHED(); |
| 1122 return; | 1097 return; |
| 1123 } | 1098 } |
| 1124 | 1099 |
| 1125 cursor_interface->SetCursor( | 1100 cursor_interface->SetCursor(pp_instance(), cursor_, |
| 1126 pp_instance(), cursor_, pp::ImageData().pp_resource(), nullptr); | 1101 pp::ImageData().pp_resource(), nullptr); |
| 1127 } | 1102 } |
| 1128 | 1103 |
| 1129 void OutOfProcessInstance::UpdateTickMarks( | 1104 void OutOfProcessInstance::UpdateTickMarks( |
| 1130 const std::vector<pp::Rect>& tickmarks) { | 1105 const std::vector<pp::Rect>& tickmarks) { |
| 1131 float inverse_scale = 1.0f / device_scale_; | 1106 float inverse_scale = 1.0f / device_scale_; |
| 1132 std::vector<pp::Rect> scaled_tickmarks = tickmarks; | 1107 std::vector<pp::Rect> scaled_tickmarks = tickmarks; |
| 1133 for (auto& tickmark : scaled_tickmarks) | 1108 for (auto& tickmark : scaled_tickmarks) |
| 1134 ScaleRect(inverse_scale, &tickmark); | 1109 ScaleRect(inverse_scale, &tickmark); |
| 1135 tickmarks_ = scaled_tickmarks; | 1110 tickmarks_ = scaled_tickmarks; |
| 1136 } | 1111 } |
| 1137 | 1112 |
| 1138 void OutOfProcessInstance::NotifyNumberOfFindResultsChanged(int total, | 1113 void OutOfProcessInstance::NotifyNumberOfFindResultsChanged(int total, |
| 1139 bool final_result) { | 1114 bool final_result) { |
| 1140 // We don't want to spam the renderer with too many updates to the number of | 1115 // We don't want to spam the renderer with too many updates to the number of |
| 1141 // find results. Don't send an update if we sent one too recently. If it's the | 1116 // find results. Don't send an update if we sent one too recently. If it's the |
| 1142 // final update, we always send it though. | 1117 // final update, we always send it though. |
| 1143 if (final_result) { | 1118 if (final_result) { |
| 1144 NumberOfFindResultsChanged(total, final_result); | 1119 NumberOfFindResultsChanged(total, final_result); |
| 1145 SetTickmarks(tickmarks_); | 1120 SetTickmarks(tickmarks_); |
| 1146 return; | 1121 return; |
| 1147 } | 1122 } |
| 1148 | 1123 |
| 1149 if (recently_sent_find_update_) | 1124 if (recently_sent_find_update_) |
| 1150 return; | 1125 return; |
| 1151 | 1126 |
| 1152 NumberOfFindResultsChanged(total, final_result); | 1127 NumberOfFindResultsChanged(total, final_result); |
| 1153 SetTickmarks(tickmarks_); | 1128 SetTickmarks(tickmarks_); |
| 1154 recently_sent_find_update_ = true; | 1129 recently_sent_find_update_ = true; |
| 1155 pp::CompletionCallback callback = | 1130 pp::CompletionCallback callback = timer_factory_.NewCallback( |
| 1156 timer_factory_.NewCallback( | 1131 &OutOfProcessInstance::ResetRecentlySentFindUpdate); |
| 1157 &OutOfProcessInstance::ResetRecentlySentFindUpdate); | 1132 pp::Module::Get()->core()->CallOnMainThread(kFindResultCooldownMs, callback, |
| 1158 pp::Module::Get()->core()->CallOnMainThread(kFindResultCooldownMs, | 1133 0); |
| 1159 callback, 0); | |
| 1160 } | 1134 } |
| 1161 | 1135 |
| 1162 void OutOfProcessInstance::NotifySelectedFindResultChanged( | 1136 void OutOfProcessInstance::NotifySelectedFindResultChanged( |
| 1163 int current_find_index) { | 1137 int current_find_index) { |
| 1164 DCHECK_GE(current_find_index, 0); | 1138 DCHECK_GE(current_find_index, 0); |
| 1165 SelectedFindResultChanged(current_find_index); | 1139 SelectedFindResultChanged(current_find_index); |
| 1166 } | 1140 } |
| 1167 | 1141 |
| 1168 void OutOfProcessInstance::GetDocumentPassword( | 1142 void OutOfProcessInstance::GetDocumentPassword( |
| 1169 pp::CompletionCallbackWithOutput<pp::Var> callback) { | 1143 pp::CompletionCallbackWithOutput<pp::Var> callback) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1266 pp::URLLoader OutOfProcessInstance::CreateURLLoader() { | 1240 pp::URLLoader OutOfProcessInstance::CreateURLLoader() { |
| 1267 if (full_) { | 1241 if (full_) { |
| 1268 if (!did_call_start_loading_) { | 1242 if (!did_call_start_loading_) { |
| 1269 did_call_start_loading_ = true; | 1243 did_call_start_loading_ = true; |
| 1270 pp::PDF::DidStartLoading(this); | 1244 pp::PDF::DidStartLoading(this); |
| 1271 } | 1245 } |
| 1272 | 1246 |
| 1273 // Disable save and print until the document is fully loaded, since they | 1247 // Disable save and print until the document is fully loaded, since they |
| 1274 // would generate an incomplete document. Need to do this each time we | 1248 // would generate an incomplete document. Need to do this each time we |
| 1275 // call DidStartLoading since that resets the content restrictions. | 1249 // call DidStartLoading since that resets the content restrictions. |
| 1276 pp::PDF::SetContentRestriction(this, CONTENT_RESTRICTION_SAVE | | 1250 pp::PDF::SetContentRestriction( |
| 1277 CONTENT_RESTRICTION_PRINT); | 1251 this, CONTENT_RESTRICTION_SAVE | CONTENT_RESTRICTION_PRINT); |
| 1278 } | 1252 } |
| 1279 | 1253 |
| 1280 return CreateURLLoaderInternal(); | 1254 return CreateURLLoaderInternal(); |
| 1281 } | 1255 } |
| 1282 | 1256 |
| 1283 void OutOfProcessInstance::ScheduleCallback(int id, int delay_in_ms) { | 1257 void OutOfProcessInstance::ScheduleCallback(int id, int delay_in_ms) { |
| 1284 pp::CompletionCallback callback = | 1258 pp::CompletionCallback callback = |
| 1285 timer_factory_.NewCallback(&OutOfProcessInstance::OnClientTimerFired); | 1259 timer_factory_.NewCallback(&OutOfProcessInstance::OnClientTimerFired); |
| 1286 pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id); | 1260 pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id); |
| 1287 } | 1261 } |
| 1288 | 1262 |
| 1289 void OutOfProcessInstance::SearchString(const base::char16* string, | 1263 void OutOfProcessInstance::SearchString( |
| 1290 const base::char16* term, | 1264 const base::char16* string, |
| 1291 bool case_sensitive, | 1265 const base::char16* term, |
| 1292 std::vector<SearchStringResult>* results) { | 1266 bool case_sensitive, |
| 1267 std::vector<SearchStringResult>* results) { |
| 1293 PP_PrivateFindResult* pp_results; | 1268 PP_PrivateFindResult* pp_results; |
| 1294 int count = 0; | 1269 int count = 0; |
| 1295 pp::PDF::SearchString( | 1270 pp::PDF::SearchString(this, reinterpret_cast<const unsigned short*>(string), |
| 1296 this, | 1271 reinterpret_cast<const unsigned short*>(term), |
| 1297 reinterpret_cast<const unsigned short*>(string), | 1272 case_sensitive, &pp_results, &count); |
| 1298 reinterpret_cast<const unsigned short*>(term), | |
| 1299 case_sensitive, | |
| 1300 &pp_results, | |
| 1301 &count); | |
| 1302 | 1273 |
| 1303 results->resize(count); | 1274 results->resize(count); |
| 1304 for (int i = 0; i < count; ++i) { | 1275 for (int i = 0; i < count; ++i) { |
| 1305 (*results)[i].start_index = pp_results[i].start_index; | 1276 (*results)[i].start_index = pp_results[i].start_index; |
| 1306 (*results)[i].length = pp_results[i].length; | 1277 (*results)[i].length = pp_results[i].length; |
| 1307 } | 1278 } |
| 1308 | 1279 |
| 1309 pp::Memory_Dev memory; | 1280 pp::Memory_Dev memory; |
| 1310 memory.MemFree(pp_results); | 1281 memory.MemFree(pp_results); |
| 1311 } | 1282 } |
| 1312 | 1283 |
| 1313 void OutOfProcessInstance::DocumentPaintOccurred() { | 1284 void OutOfProcessInstance::DocumentPaintOccurred() {} |
| 1314 } | |
| 1315 | 1285 |
| 1316 void OutOfProcessInstance::DocumentLoadComplete(int page_count) { | 1286 void OutOfProcessInstance::DocumentLoadComplete(int page_count) { |
| 1317 // Clear focus state for OSK. | 1287 // Clear focus state for OSK. |
| 1318 FormTextFieldFocusChange(false); | 1288 FormTextFieldFocusChange(false); |
| 1319 | 1289 |
| 1320 DCHECK_EQ(LOAD_STATE_LOADING, document_load_state_); | 1290 DCHECK_EQ(LOAD_STATE_LOADING, document_load_state_); |
| 1321 document_load_state_ = LOAD_STATE_COMPLETE; | 1291 document_load_state_ = LOAD_STATE_COMPLETE; |
| 1322 UserMetricsRecordAction("PDF.LoadSuccess"); | 1292 UserMetricsRecordAction("PDF.LoadSuccess"); |
| 1323 uma_.HistogramEnumeration("PDF.DocumentFeature", LOADED_DOCUMENT, | 1293 uma_.HistogramEnumeration("PDF.DocumentFeature", LOADED_DOCUMENT, |
| 1324 FEATURES_COUNT); | 1294 FEATURES_COUNT); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1391 if (preview_document_load_state_ != LOAD_STATE_LOADING || | 1361 if (preview_document_load_state_ != LOAD_STATE_LOADING || |
| 1392 preview_pages_info_.empty()) { | 1362 preview_pages_info_.empty()) { |
| 1393 return; | 1363 return; |
| 1394 } | 1364 } |
| 1395 | 1365 |
| 1396 preview_document_load_state_ = LOAD_STATE_COMPLETE; | 1366 preview_document_load_state_ = LOAD_STATE_COMPLETE; |
| 1397 | 1367 |
| 1398 int dest_page_index = preview_pages_info_.front().second; | 1368 int dest_page_index = preview_pages_info_.front().second; |
| 1399 int src_page_index = | 1369 int src_page_index = |
| 1400 ExtractPrintPreviewPageIndex(preview_pages_info_.front().first); | 1370 ExtractPrintPreviewPageIndex(preview_pages_info_.front().first); |
| 1401 if (src_page_index > 0 && dest_page_index > -1 && preview_engine_.get()) | 1371 if (src_page_index > 0 && dest_page_index > -1 && preview_engine_.get()) |
| 1402 engine_->AppendPage(preview_engine_.get(), dest_page_index); | 1372 engine_->AppendPage(preview_engine_.get(), dest_page_index); |
| 1403 | 1373 |
| 1404 preview_pages_info_.pop(); | 1374 preview_pages_info_.pop(); |
| 1405 // |print_preview_page_count_| is not updated yet. Do not load any | 1375 // |print_preview_page_count_| is not updated yet. Do not load any |
| 1406 // other preview pages till we get this information. | 1376 // other preview pages till we get this information. |
| 1407 if (print_preview_page_count_ == 0) | 1377 if (print_preview_page_count_ == 0) |
| 1408 return; | 1378 return; |
| 1409 | 1379 |
| 1410 if (!preview_pages_info_.empty()) | 1380 if (!preview_pages_info_.empty()) |
| 1411 LoadAvailablePreviewPage(); | 1381 LoadAvailablePreviewPage(); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 } | 1522 } |
| 1553 | 1523 |
| 1554 void OutOfProcessInstance::LoadPreviewUrl(const std::string& url) { | 1524 void OutOfProcessInstance::LoadPreviewUrl(const std::string& url) { |
| 1555 LoadUrlInternal(url, &embed_preview_loader_, | 1525 LoadUrlInternal(url, &embed_preview_loader_, |
| 1556 &OutOfProcessInstance::DidOpenPreview); | 1526 &OutOfProcessInstance::DidOpenPreview); |
| 1557 } | 1527 } |
| 1558 | 1528 |
| 1559 void OutOfProcessInstance::LoadUrlInternal( | 1529 void OutOfProcessInstance::LoadUrlInternal( |
| 1560 const std::string& url, | 1530 const std::string& url, |
| 1561 pp::URLLoader* loader, | 1531 pp::URLLoader* loader, |
| 1562 void (OutOfProcessInstance::* method)(int32_t)) { | 1532 void (OutOfProcessInstance::*method)(int32_t)) { |
| 1563 pp::URLRequestInfo request(this); | 1533 pp::URLRequestInfo request(this); |
| 1564 request.SetURL(url); | 1534 request.SetURL(url); |
| 1565 request.SetMethod("GET"); | 1535 request.SetMethod("GET"); |
| 1566 request.SetFollowRedirects(false); | 1536 request.SetFollowRedirects(false); |
| 1567 | 1537 |
| 1568 *loader = CreateURLLoaderInternal(); | 1538 *loader = CreateURLLoaderInternal(); |
| 1569 pp::CompletionCallback callback = loader_factory_.NewCallback(method); | 1539 pp::CompletionCallback callback = loader_factory_.NewCallback(method); |
| 1570 int rv = loader->Open(request, callback); | 1540 int rv = loader->Open(request, callback); |
| 1571 if (rv != PP_OK_COMPLETIONPENDING) | 1541 if (rv != PP_OK_COMPLETIONPENDING) |
| 1572 callback.Run(rv); | 1542 callback.Run(rv); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 | 1597 |
| 1628 void OutOfProcessInstance::LoadAvailablePreviewPage() { | 1598 void OutOfProcessInstance::LoadAvailablePreviewPage() { |
| 1629 if (preview_pages_info_.empty() || | 1599 if (preview_pages_info_.empty() || |
| 1630 document_load_state_ != LOAD_STATE_COMPLETE) { | 1600 document_load_state_ != LOAD_STATE_COMPLETE) { |
| 1631 return; | 1601 return; |
| 1632 } | 1602 } |
| 1633 | 1603 |
| 1634 std::string url = preview_pages_info_.front().first; | 1604 std::string url = preview_pages_info_.front().first; |
| 1635 int dst_page_index = preview_pages_info_.front().second; | 1605 int dst_page_index = preview_pages_info_.front().second; |
| 1636 int src_page_index = ExtractPrintPreviewPageIndex(url); | 1606 int src_page_index = ExtractPrintPreviewPageIndex(url); |
| 1637 if (src_page_index < 1 || | 1607 if (src_page_index < 1 || dst_page_index >= print_preview_page_count_ || |
| 1638 dst_page_index >= print_preview_page_count_ || | |
| 1639 preview_document_load_state_ == LOAD_STATE_LOADING) { | 1608 preview_document_load_state_ == LOAD_STATE_LOADING) { |
| 1640 return; | 1609 return; |
| 1641 } | 1610 } |
| 1642 | 1611 |
| 1643 preview_document_load_state_ = LOAD_STATE_LOADING; | 1612 preview_document_load_state_ = LOAD_STATE_LOADING; |
| 1644 LoadPreviewUrl(url); | 1613 LoadPreviewUrl(url); |
| 1645 } | 1614 } |
| 1646 | 1615 |
| 1647 void OutOfProcessInstance::UserMetricsRecordAction( | 1616 void OutOfProcessInstance::UserMetricsRecordAction(const std::string& action) { |
| 1648 const std::string& action) { | |
| 1649 // TODO(raymes): Move this function to PPB_UMA_Private. | 1617 // TODO(raymes): Move this function to PPB_UMA_Private. |
| 1650 pp::PDF::UserMetricsRecordAction(this, pp::Var(action)); | 1618 pp::PDF::UserMetricsRecordAction(this, pp::Var(action)); |
| 1651 } | 1619 } |
| 1652 | 1620 |
| 1653 pp::FloatPoint OutOfProcessInstance::BoundScrollOffsetToDocument( | 1621 pp::FloatPoint OutOfProcessInstance::BoundScrollOffsetToDocument( |
| 1654 const pp::FloatPoint& scroll_offset) { | 1622 const pp::FloatPoint& scroll_offset) { |
| 1655 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); | 1623 float max_x = document_size_.width() * zoom_ - plugin_dip_size_.width(); |
| 1656 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); | 1624 float x = std::max(std::min(scroll_offset.x(), max_x), 0.0f); |
| 1657 float min_y = -top_toolbar_height_; | 1625 float min_y = -top_toolbar_height_; |
| 1658 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); | 1626 float max_y = document_size_.height() * zoom_ - plugin_dip_size_.height(); |
| 1659 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); | 1627 float y = std::max(std::min(scroll_offset.y(), max_y), min_y); |
| 1660 return pp::FloatPoint(x, y); | 1628 return pp::FloatPoint(x, y); |
| 1661 } | 1629 } |
| 1662 | 1630 |
| 1663 } // namespace chrome_pdf | 1631 } // namespace chrome_pdf |
| OLD | NEW |