Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/renderer/pepper/ppb_pdf_impl.h" | 5 #include "components/pdf/renderer/ppb_pdf_impl.h" |
| 6 | 6 |
| 7 #include "base/files/scoped_file.h" | 7 #include "base/files/scoped_file.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "chrome/common/render_messages.h" | 12 #include "components/pdf/common/pdf_messages.h" |
| 13 #include "chrome/renderer/printing/print_web_view_helper.h" | |
| 14 #include "content/app/resources/grit/content_resources.h" | 13 #include "content/app/resources/grit/content_resources.h" |
| 15 #include "content/app/strings/grit/content_strings.h" | 14 #include "content/app/strings/grit/content_strings.h" |
| 16 #include "content/public/common/child_process_sandbox_support_linux.h" | 15 #include "content/public/common/child_process_sandbox_support_linux.h" |
| 17 #include "content/public/common/referrer.h" | 16 #include "content/public/common/referrer.h" |
| 18 #include "content/public/renderer/pepper_plugin_instance.h" | 17 #include "content/public/renderer/pepper_plugin_instance.h" |
| 19 #include "content/public/renderer/render_thread.h" | 18 #include "content/public/renderer/render_thread.h" |
| 20 #include "content/public/renderer/render_view.h" | 19 #include "content/public/renderer/render_view.h" |
| 21 #include "ppapi/c/pp_resource.h" | 20 #include "ppapi/c/pp_resource.h" |
| 22 #include "ppapi/c/private/ppb_pdf.h" | 21 #include "ppapi/c/private/ppb_pdf.h" |
| 23 #include "ppapi/c/trusted/ppb_browser_font_trusted.h" | 22 #include "ppapi/c/trusted/ppb_browser_font_trusted.h" |
| 24 #include "ppapi/shared_impl/ppapi_globals.h" | 23 #include "ppapi/shared_impl/ppapi_globals.h" |
| 25 #include "ppapi/shared_impl/resource.h" | 24 #include "ppapi/shared_impl/resource.h" |
| 26 #include "ppapi/shared_impl/resource_tracker.h" | 25 #include "ppapi/shared_impl/resource_tracker.h" |
| 27 #include "ppapi/shared_impl/var.h" | 26 #include "ppapi/shared_impl/var.h" |
| 28 #include "third_party/WebKit/public/web/WebDocument.h" | 27 #include "third_party/WebKit/public/web/WebDocument.h" |
| 29 #include "third_party/WebKit/public/web/WebElement.h" | 28 #include "third_party/WebKit/public/web/WebElement.h" |
| 30 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 29 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 31 #include "third_party/WebKit/public/web/WebPluginContainer.h" | 30 #include "third_party/WebKit/public/web/WebPluginContainer.h" |
| 32 #include "third_party/WebKit/public/web/WebView.h" | 31 #include "third_party/WebKit/public/web/WebView.h" |
| 33 #include "third_party/icu/source/i18n/unicode/usearch.h" | 32 #include "third_party/icu/source/i18n/unicode/usearch.h" |
| 34 #include "third_party/skia/include/core/SkBitmap.h" | 33 #include "third_party/skia/include/core/SkBitmap.h" |
| 35 #include "ui/base/l10n/l10n_util.h" | 34 #include "ui/base/l10n/l10n_util.h" |
| 36 #include "ui/base/resource/resource_bundle.h" | 35 #include "ui/base/resource/resource_bundle.h" |
| 37 | 36 |
| 37 namespace pdf { | |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 PPB_PDF_Impl::PrintDelegate* print_delegate = NULL; | |
|
Lei Zhang
2014/08/26 22:41:31
g_print_delegate
sadrul
2014/08/27 00:09:52
Done.
| |
| 41 | |
| 40 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 42 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 41 class PrivateFontFile : public ppapi::Resource { | 43 class PrivateFontFile : public ppapi::Resource { |
| 42 public: | 44 public: |
| 43 PrivateFontFile(PP_Instance instance, int fd) | 45 PrivateFontFile(PP_Instance instance, int fd) |
| 44 : Resource(ppapi::OBJECT_IS_IMPL, instance), fd_(fd) {} | 46 : Resource(ppapi::OBJECT_IS_IMPL, instance), fd_(fd) {} |
| 45 | 47 |
| 46 bool GetFontTable(uint32_t table, void* output, uint32_t* output_length) { | 48 bool GetFontTable(uint32_t table, void* output, uint32_t* output_length) { |
| 47 size_t temp_size = static_cast<size_t>(*output_length); | 49 size_t temp_size = static_cast<size_t>(*output_length); |
| 48 bool rv = content::GetFontTable( | 50 bool rv = content::GetFontTable(fd_.get(), |
| 49 fd_.get(), table, 0 /* offset */, static_cast<uint8_t*>(output), | 51 table, |
| 50 &temp_size); | 52 0 /* offset */, |
| 53 static_cast<uint8_t*>(output), | |
| 54 &temp_size); | |
| 51 *output_length = base::checked_cast<uint32_t>(temp_size); | 55 *output_length = base::checked_cast<uint32_t>(temp_size); |
| 52 return rv; | 56 return rv; |
| 53 } | 57 } |
| 54 | 58 |
| 55 protected: | 59 protected: |
| 56 virtual ~PrivateFontFile() {} | 60 virtual ~PrivateFontFile() {} |
| 57 | 61 |
| 58 private: | 62 private: |
| 59 base::ScopedFD fd_; | 63 base::ScopedFD fd_; |
| 60 }; | 64 }; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 110 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_4, IDR_PDF_PROGRESS_BAR_4}, | 114 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_4, IDR_PDF_PROGRESS_BAR_4}, |
| 111 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_5, IDR_PDF_PROGRESS_BAR_5}, | 115 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_5, IDR_PDF_PROGRESS_BAR_5}, |
| 112 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_6, IDR_PDF_PROGRESS_BAR_6}, | 116 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_6, IDR_PDF_PROGRESS_BAR_6}, |
| 113 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_7, IDR_PDF_PROGRESS_BAR_7}, | 117 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_7, IDR_PDF_PROGRESS_BAR_7}, |
| 114 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_8, IDR_PDF_PROGRESS_BAR_8}, | 118 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_8, IDR_PDF_PROGRESS_BAR_8}, |
| 115 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_BACKGROUND, | 119 {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_BACKGROUND, |
| 116 IDR_PDF_PROGRESS_BAR_BACKGROUND}, | 120 IDR_PDF_PROGRESS_BAR_BACKGROUND}, |
| 117 {PP_RESOURCEIMAGE_PDF_PAGE_INDICATOR_BACKGROUND, | 121 {PP_RESOURCEIMAGE_PDF_PAGE_INDICATOR_BACKGROUND, |
| 118 IDR_PDF_PAGE_INDICATOR_BACKGROUND}, | 122 IDR_PDF_PAGE_INDICATOR_BACKGROUND}, |
| 119 {PP_RESOURCEIMAGE_PDF_PAGE_DROPSHADOW, IDR_PDF_PAGE_DROPSHADOW}, | 123 {PP_RESOURCEIMAGE_PDF_PAGE_DROPSHADOW, IDR_PDF_PAGE_DROPSHADOW}, |
| 120 {PP_RESOURCEIMAGE_PDF_PAN_SCROLL_ICON, IDR_PAN_SCROLL_ICON}, }; | 124 {PP_RESOURCEIMAGE_PDF_PAN_SCROLL_ICON, IDR_PAN_SCROLL_ICON}, |
| 121 | 125 }; |
| 122 #if defined(ENABLE_FULL_PRINTING) | |
| 123 | |
| 124 blink::WebElement GetWebElement(PP_Instance instance_id) { | |
| 125 content::PepperPluginInstance* instance = | |
| 126 content::PepperPluginInstance::Get(instance_id); | |
| 127 if (!instance) | |
| 128 return blink::WebElement(); | |
| 129 return instance->GetContainer()->element(); | |
| 130 } | |
| 131 | |
| 132 printing::PrintWebViewHelper* GetPrintWebViewHelper( | |
| 133 const blink::WebElement& element) { | |
| 134 if (element.isNull()) | |
| 135 return NULL; | |
| 136 blink::WebView* view = element.document().frame()->view(); | |
| 137 content::RenderView* render_view = content::RenderView::FromWebView(view); | |
| 138 return printing::PrintWebViewHelper::Get(render_view); | |
| 139 } | |
| 140 | |
| 141 bool IsPrintingEnabled(PP_Instance instance_id) { | |
| 142 blink::WebElement element = GetWebElement(instance_id); | |
| 143 printing::PrintWebViewHelper* helper = GetPrintWebViewHelper(element); | |
| 144 return helper && helper->IsPrintingEnabled(); | |
| 145 } | |
| 146 | |
| 147 #else // ENABLE_FULL_PRINTING | |
| 148 | |
| 149 bool IsPrintingEnabled(PP_Instance instance_id) { return false; } | |
| 150 | |
| 151 #endif // ENABLE_FULL_PRINTING | |
| 152 | 126 |
| 153 PP_Var GetLocalizedString(PP_Instance instance_id, | 127 PP_Var GetLocalizedString(PP_Instance instance_id, |
| 154 PP_ResourceString string_id) { | 128 PP_ResourceString string_id) { |
| 155 content::PepperPluginInstance* instance = | 129 content::PepperPluginInstance* instance = |
| 156 content::PepperPluginInstance::Get(instance_id); | 130 content::PepperPluginInstance::Get(instance_id); |
| 157 if (!instance) | 131 if (!instance) |
| 158 return PP_MakeUndefined(); | 132 return PP_MakeUndefined(); |
| 159 | 133 |
| 160 std::string rv; | 134 std::string rv; |
| 161 if (string_id == PP_RESOURCESTRING_PDFGETPASSWORD) { | 135 if (string_id == PP_RESOURCESTRING_PDFGETPASSWORD) { |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 293 if (!instance) | 267 if (!instance) |
| 294 return; | 268 return; |
| 295 instance->GetRenderView()->DidStopLoading(); | 269 instance->GetRenderView()->DidStopLoading(); |
| 296 } | 270 } |
| 297 | 271 |
| 298 void SetContentRestriction(PP_Instance instance_id, int restrictions) { | 272 void SetContentRestriction(PP_Instance instance_id, int restrictions) { |
| 299 content::PepperPluginInstance* instance = | 273 content::PepperPluginInstance* instance = |
| 300 content::PepperPluginInstance::Get(instance_id); | 274 content::PepperPluginInstance::Get(instance_id); |
| 301 if (!instance) | 275 if (!instance) |
| 302 return; | 276 return; |
| 303 instance->GetRenderView()->Send( | 277 instance->GetRenderView()->Send(new PDFHostMsg_PDFUpdateContentRestrictions( |
| 304 new ChromeViewHostMsg_PDFUpdateContentRestrictions( | 278 instance->GetRenderView()->GetRoutingID(), restrictions)); |
| 305 instance->GetRenderView()->GetRoutingID(), restrictions)); | |
| 306 } | 279 } |
| 307 | 280 |
| 308 void HistogramPDFPageCount(PP_Instance instance, int count) { | 281 void HistogramPDFPageCount(PP_Instance instance, int count) { |
| 309 UMA_HISTOGRAM_COUNTS_10000("PDF.PageCount", count); | 282 UMA_HISTOGRAM_COUNTS_10000("PDF.PageCount", count); |
| 310 } | 283 } |
| 311 | 284 |
| 312 void UserMetricsRecordAction(PP_Instance instance, PP_Var action) { | 285 void UserMetricsRecordAction(PP_Instance instance, PP_Var action) { |
| 313 scoped_refptr<ppapi::StringVar> action_str( | 286 scoped_refptr<ppapi::StringVar> action_str( |
| 314 ppapi::StringVar::FromPPVar(action)); | 287 ppapi::StringVar::FromPPVar(action)); |
| 315 if (action_str) | 288 if (action_str) |
| 316 content::RenderThread::Get()->RecordComputedAction(action_str->value()); | 289 content::RenderThread::Get()->RecordComputedAction(action_str->value()); |
| 317 } | 290 } |
| 318 | 291 |
| 319 void HasUnsupportedFeature(PP_Instance instance_id) { | 292 void HasUnsupportedFeature(PP_Instance instance_id) { |
| 320 content::PepperPluginInstance* instance = | 293 content::PepperPluginInstance* instance = |
| 321 content::PepperPluginInstance::Get(instance_id); | 294 content::PepperPluginInstance::Get(instance_id); |
| 322 if (!instance) | 295 if (!instance) |
| 323 return; | 296 return; |
| 324 | 297 |
| 325 // Only want to show an info bar if the pdf is the whole tab. | 298 // Only want to show an info bar if the pdf is the whole tab. |
| 326 if (!instance->IsFullPagePlugin()) | 299 if (!instance->IsFullPagePlugin()) |
| 327 return; | 300 return; |
| 328 | 301 |
| 329 blink::WebView* view = | 302 blink::WebView* view = |
| 330 instance->GetContainer()->element().document().frame()->view(); | 303 instance->GetContainer()->element().document().frame()->view(); |
| 331 content::RenderView* render_view = content::RenderView::FromWebView(view); | 304 content::RenderView* render_view = content::RenderView::FromWebView(view); |
| 332 render_view->Send(new ChromeViewHostMsg_PDFHasUnsupportedFeature( | 305 render_view->Send( |
| 333 render_view->GetRoutingID())); | 306 new PDFHostMsg_PDFHasUnsupportedFeature(render_view->GetRoutingID())); |
| 334 } | 307 } |
| 335 | 308 |
| 336 void SaveAs(PP_Instance instance_id) { | 309 void SaveAs(PP_Instance instance_id) { |
| 337 content::PepperPluginInstance* instance = | 310 content::PepperPluginInstance* instance = |
| 338 content::PepperPluginInstance::Get(instance_id); | 311 content::PepperPluginInstance::Get(instance_id); |
| 339 if (!instance) | 312 if (!instance) |
| 340 return; | 313 return; |
| 341 GURL url = instance->GetPluginURL(); | 314 GURL url = instance->GetPluginURL(); |
| 342 | 315 |
| 343 content::RenderView* render_view = instance->GetRenderView(); | 316 content::RenderView* render_view = instance->GetRenderView(); |
| 344 blink::WebLocalFrame* frame = | 317 blink::WebLocalFrame* frame = |
| 345 render_view->GetWebView()->mainFrame()->toWebLocalFrame(); | 318 render_view->GetWebView()->mainFrame()->toWebLocalFrame(); |
| 346 content::Referrer referrer(frame->document().url(), | 319 content::Referrer referrer(frame->document().url(), |
| 347 frame->document().referrerPolicy()); | 320 frame->document().referrerPolicy()); |
| 348 render_view->Send(new ChromeViewHostMsg_PDFSaveURLAs( | 321 render_view->Send( |
| 349 render_view->GetRoutingID(), url, referrer)); | 322 new PDFHostMsg_PDFSaveURLAs(render_view->GetRoutingID(), url, referrer)); |
| 350 } | 323 } |
| 351 | 324 |
| 352 PP_Bool IsFeatureEnabled(PP_Instance instance, PP_PDFFeature feature) { | 325 PP_Bool IsFeatureEnabled(PP_Instance instance, PP_PDFFeature feature) { |
| 353 switch (feature) { | 326 switch (feature) { |
| 354 case PP_PDFFEATURE_HIDPI: | 327 case PP_PDFFEATURE_HIDPI: |
| 355 return PP_TRUE; | 328 return PP_TRUE; |
| 356 case PP_PDFFEATURE_PRINTING: | 329 case PP_PDFFEATURE_PRINTING: |
| 357 return IsPrintingEnabled(instance) ? PP_TRUE : PP_FALSE; | 330 return (print_delegate && print_delegate->IsPrintingEnabled(instance)) |
| 331 ? PP_TRUE | |
| 332 : PP_FALSE; | |
| 358 } | 333 } |
| 359 return PP_FALSE; | 334 return PP_FALSE; |
| 360 } | 335 } |
| 361 | 336 |
| 362 PP_Resource GetResourceImageForScale(PP_Instance instance_id, | 337 PP_Resource GetResourceImageForScale(PP_Instance instance_id, |
| 363 PP_ResourceImage image_id, | 338 PP_ResourceImage image_id, |
| 364 float scale) { | 339 float scale) { |
| 365 int res_id = 0; | 340 int res_id = 0; |
| 366 for (size_t i = 0; i < arraysize(kResourceImageMap); ++i) { | 341 for (size_t i = 0; i < arraysize(kResourceImageMap); ++i) { |
| 367 if (kResourceImageMap[i].pp_id == image_id) { | 342 if (kResourceImageMap[i].pp_id == image_id) { |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 395 PP_Var ModalPromptForPassword(PP_Instance instance_id, PP_Var message) { | 370 PP_Var ModalPromptForPassword(PP_Instance instance_id, PP_Var message) { |
| 396 content::PepperPluginInstance* instance = | 371 content::PepperPluginInstance* instance = |
| 397 content::PepperPluginInstance::Get(instance_id); | 372 content::PepperPluginInstance::Get(instance_id); |
| 398 if (!instance) | 373 if (!instance) |
| 399 return PP_MakeUndefined(); | 374 return PP_MakeUndefined(); |
| 400 | 375 |
| 401 std::string actual_value; | 376 std::string actual_value; |
| 402 scoped_refptr<ppapi::StringVar> message_string( | 377 scoped_refptr<ppapi::StringVar> message_string( |
| 403 ppapi::StringVar::FromPPVar(message)); | 378 ppapi::StringVar::FromPPVar(message)); |
| 404 | 379 |
| 405 IPC::SyncMessage* msg = new ChromeViewHostMsg_PDFModalPromptForPassword( | 380 IPC::SyncMessage* msg = new PDFHostMsg_PDFModalPromptForPassword( |
| 406 instance->GetRenderView()->GetRoutingID(), | 381 instance->GetRenderView()->GetRoutingID(), |
| 407 message_string->value(), | 382 message_string->value(), |
| 408 &actual_value); | 383 &actual_value); |
| 409 msg->EnableMessagePumping(); | 384 msg->EnableMessagePumping(); |
| 410 instance->GetRenderView()->Send(msg); | 385 instance->GetRenderView()->Send(msg); |
| 411 | 386 |
| 412 return ppapi::StringVar::StringToPPVar(actual_value); | 387 return ppapi::StringVar::StringToPPVar(actual_value); |
| 413 } | 388 } |
| 414 | 389 |
| 415 PP_Bool IsOutOfProcess(PP_Instance instance_id) { return PP_FALSE; } | 390 PP_Bool IsOutOfProcess(PP_Instance instance_id) { |
| 391 return PP_FALSE; | |
| 392 } | |
| 416 | 393 |
| 417 void SetSelectedText(PP_Instance instance_id, const char* selected_text) { | 394 void SetSelectedText(PP_Instance instance_id, const char* selected_text) { |
| 418 // This function is intended for out of process PDF plugin. | 395 // This function is intended for out of process PDF plugin. |
| 419 } | 396 } |
| 420 | 397 |
| 421 void SetLinkUnderCursor(PP_Instance instance_id, const char* url) { | 398 void SetLinkUnderCursor(PP_Instance instance_id, const char* url) { |
| 422 content::PepperPluginInstance* instance = | 399 content::PepperPluginInstance* instance = |
| 423 content::PepperPluginInstance::Get(instance_id); | 400 content::PepperPluginInstance::Get(instance_id); |
| 424 if (!instance) | 401 if (!instance) |
| 425 return; | 402 return; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 444 &GetResourceImageForScale, // | 421 &GetResourceImageForScale, // |
| 445 &ModalPromptForPassword, // | 422 &ModalPromptForPassword, // |
| 446 &IsOutOfProcess, // | 423 &IsOutOfProcess, // |
| 447 &SetSelectedText, // | 424 &SetSelectedText, // |
| 448 &SetLinkUnderCursor, // | 425 &SetLinkUnderCursor, // |
| 449 }; | 426 }; |
| 450 | 427 |
| 451 } // namespace | 428 } // namespace |
| 452 | 429 |
| 453 // static | 430 // static |
| 454 const PPB_PDF* PPB_PDF_Impl::GetInterface() { return &ppb_pdf; } | 431 const PPB_PDF* PPB_PDF_Impl::GetInterface() { |
| 432 return &ppb_pdf; | |
| 433 } | |
| 455 | 434 |
| 456 // static | 435 // static |
| 457 void PPB_PDF_Impl::InvokePrintingForInstance(PP_Instance instance_id) { | 436 void PPB_PDF_Impl::InvokePrintingForInstance(PP_Instance instance_id) { |
| 458 #if defined(ENABLE_FULL_PRINTING) | 437 if (print_delegate) |
| 459 blink::WebElement element = GetWebElement(instance_id); | 438 print_delegate->Print(instance_id); |
| 460 printing::PrintWebViewHelper* helper = GetPrintWebViewHelper(element); | |
| 461 if (helper) | |
| 462 helper->PrintNode(element); | |
| 463 #endif // ENABLE_FULL_PRINTING | |
| 464 } | 439 } |
| 440 | |
| 441 void PPB_PDF_Impl::SetPrintDelegate(PPB_PDF_Impl::PrintDelegate* delegate) { | |
| 442 CHECK(!print_delegate) << "There should only be a single PrintDelegate."; | |
| 443 print_delegate = delegate; | |
| 444 } | |
| 445 | |
| 446 } // namespace pdf | |
| OLD | NEW |