15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/pepper/ppb_pdf_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/printing/print_web_view_helper.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_sandbox_support_linux.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/referrer.h"
1758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/pepper_plugin_instance.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/webkit_resources.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/webkit_strings.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h"
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ppapi/shared_impl/ppapi_globals.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h"
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h"
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h"
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/web/WebView.h"
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/usearch.h"
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals;
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebElement;
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebView;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderThread;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrivateFontFile : public ppapi::Resource {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrivateFontFile(PP_Instance instance, int fd)
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : Resource(ppapi::OBJECT_IS_IMPL, instance), fd_(fd) {}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool GetFontTable(uint32_t table, void* output, uint32_t* output_length) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t temp_size = static_cast<size_t>(*output_length);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool rv = content::GetFontTable(
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        fd_, table, 0 /* offset */, static_cast<uint8_t*>(output), &temp_size);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *output_length = base::checked_cast<uint32_t>(temp_size);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rv;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrivateFontFile() {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fd_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResourceImageInfo {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_ResourceImage pp_id;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res_id;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const ResourceImageInfo kResourceImageMap[] = {
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_FTP, IDR_PDF_BUTTON_FTP},
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_FTP_HOVER, IDR_PDF_BUTTON_FTP_HOVER},
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_FTP_PRESSED, IDR_PDF_BUTTON_FTP_PRESSED},
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_FTW, IDR_PDF_BUTTON_FTW},
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_FTW_HOVER, IDR_PDF_BUTTON_FTW_HOVER},
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_FTW_PRESSED, IDR_PDF_BUTTON_FTW_PRESSED},
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_END, IDR_PDF_BUTTON_ZOOMIN_END},
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_END_HOVER,
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     IDR_PDF_BUTTON_ZOOMIN_END_HOVER},
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_END_PRESSED,
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     IDR_PDF_BUTTON_ZOOMIN_END_PRESSED},
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN, IDR_PDF_BUTTON_ZOOMIN},
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_HOVER, IDR_PDF_BUTTON_ZOOMIN_HOVER},
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_PRESSED, IDR_PDF_BUTTON_ZOOMIN_PRESSED},
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT, IDR_PDF_BUTTON_ZOOMOUT},
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_HOVER, IDR_PDF_BUTTON_ZOOMOUT_HOVER},
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_PRESSED,
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     IDR_PDF_BUTTON_ZOOMOUT_PRESSED},
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_SAVE, IDR_PDF_BUTTON_SAVE},
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_SAVE_HOVER, IDR_PDF_BUTTON_SAVE_HOVER},
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_SAVE_PRESSED, IDR_PDF_BUTTON_SAVE_PRESSED},
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_PRINT, IDR_PDF_BUTTON_PRINT},
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_HOVER, IDR_PDF_BUTTON_PRINT_HOVER},
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_PRESSED, IDR_PDF_BUTTON_PRINT_PRESSED},
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_DISABLED, IDR_PDF_BUTTON_PRINT_DISABLED},
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_0, IDR_PDF_THUMBNAIL_0},
100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_1, IDR_PDF_THUMBNAIL_1},
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_2, IDR_PDF_THUMBNAIL_2},
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_3, IDR_PDF_THUMBNAIL_3},
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_4, IDR_PDF_THUMBNAIL_4},
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_5, IDR_PDF_THUMBNAIL_5},
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_6, IDR_PDF_THUMBNAIL_6},
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_7, IDR_PDF_THUMBNAIL_7},
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_8, IDR_PDF_THUMBNAIL_8},
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_9, IDR_PDF_THUMBNAIL_9},
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_NUM_BACKGROUND,
110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     IDR_PDF_THUMBNAIL_NUM_BACKGROUND},
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_0, IDR_PDF_PROGRESS_BAR_0},
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_1, IDR_PDF_PROGRESS_BAR_1},
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_2, IDR_PDF_PROGRESS_BAR_2},
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_3, IDR_PDF_PROGRESS_BAR_3},
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_4, IDR_PDF_PROGRESS_BAR_4},
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_5, IDR_PDF_PROGRESS_BAR_5},
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_6, IDR_PDF_PROGRESS_BAR_6},
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_7, IDR_PDF_PROGRESS_BAR_7},
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_8, IDR_PDF_PROGRESS_BAR_8},
120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_BACKGROUND,
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     IDR_PDF_PROGRESS_BAR_BACKGROUND},
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PAGE_INDICATOR_BACKGROUND,
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch     IDR_PDF_PAGE_INDICATOR_BACKGROUND},
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PAGE_DROPSHADOW, IDR_PDF_PAGE_DROPSHADOW},
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {PP_RESOURCEIMAGE_PDF_PAN_SCROLL_ICON, IDR_PAN_SCROLL_ICON}, };
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebElement GetWebElement(PP_Instance instance_id) {
13058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
13158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!instance)
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return blink::WebElement();
134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return instance->GetContainer()->element();
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)printing::PrintWebViewHelper* GetPrintWebViewHelper(
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebElement& element) {
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (element.isNull())
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebView* view = element.document().frame()->view();
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::RenderView* render_view = content::RenderView::FromWebView(view);
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return printing::PrintWebViewHelper::Get(render_view);
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool IsPrintingEnabled(PP_Instance instance_id) {
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebElement element = GetWebElement(instance_id);
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  printing::PrintWebViewHelper* helper = GetPrintWebViewHelper(element);
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return helper && helper->IsPrintingEnabled();
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
152c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else  // ENABLE_FULL_PRINTING
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool IsPrintingEnabled(PP_Instance instance_id) { return false; }
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // ENABLE_FULL_PRINTING
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetLocalizedString(PP_Instance instance_id,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          PP_ResourceString string_id) {
16058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
16158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_MakeUndefined();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string rv;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (string_id == PP_RESOURCESTRING_PDFGETPASSWORD) {
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rv = base::UTF16ToUTF8(l10n_util::GetStringUTF16(IDS_PDF_NEED_PASSWORD));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (string_id == PP_RESOURCESTRING_PDFLOADING) {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rv = base::UTF16ToUTF8(l10n_util::GetStringUTF16(IDS_PDF_PAGE_LOADING));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (string_id == PP_RESOURCESTRING_PDFLOAD_FAILED) {
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rv = base::UTF16ToUTF8(l10n_util::GetStringUTF16(IDS_PDF_PAGE_LOAD_FAILED));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (string_id == PP_RESOURCESTRING_PDFPROGRESSLOADING) {
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    rv = base::UTF16ToUTF8(l10n_util::GetStringUTF16(IDS_PDF_PROGRESS_LOADING));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ppapi::StringVar::StringToPPVar(rv);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetFontFileWithFallback(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance_id,
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const PP_BrowserFont_Trusted_Description* description,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_PrivateFontCharset charset) {
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Validate the instance before using it below.
18758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (!content::PepperPluginInstance::Get(instance_id))
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ppapi::StringVar> face_name(
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ppapi::StringVar::FromPPVar(description->face));
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!face_name.get())
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fd = content::MatchFontWithFallback(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      face_name->value().c_str(),
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      description->weight >= PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      description->italic,
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      charset,
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      description->family);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fd == -1)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PrivateFontFile> font(new PrivateFontFile(instance_id, fd));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return font->GetReference();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For trusted PPAPI plugins, this is only needed in Linux since font loading
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on Windows and Mac works through the renderer sandbox.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetFontTableForPrivateFontFile(PP_Resource font_file,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t table,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    void* output,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t* output_length) {
21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::Resource* resource =
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PpapiGlobals::Get()->GetResourceTracker()->GetResource(font_file);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!resource)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrivateFontFile* font = static_cast<PrivateFontFile*>(resource);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return font->GetFontTable(table, output, output_length);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchString(PP_Instance instance,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const unsigned short* input_string,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const unsigned short* input_term,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool case_sensitive,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PP_PrivateFindResult** results,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int* count) {
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::char16* string =
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      reinterpret_cast<const base::char16*>(input_string);
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const base::char16* term = reinterpret_cast<const base::char16*>(input_term);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode status = U_ZERO_ERROR;
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  UStringSearch* searcher =
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      usearch_open(term,
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   -1,
245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   string,
246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   -1,
247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   RenderThread::Get()->GetLocale().c_str(),
248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   0,
249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   &status);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status == U_ZERO_ERROR || status == U_USING_FALLBACK_WARNING ||
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         status == U_USING_DEFAULT_WARNING);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UCollationStrength strength = case_sensitive ? UCOL_TERTIARY : UCOL_PRIMARY;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UCollator* collator = usearch_getCollator(searcher);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ucol_getStrength(collator) != strength) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucol_setStrength(collator, strength);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usearch_reset(searcher);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = U_ZERO_ERROR;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int match_start = usearch_first(searcher, &status);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status == U_ZERO_ERROR);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PP_PrivateFindResult> pp_results;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (match_start != USEARCH_DONE) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t matched_length = usearch_getMatchedLength(searcher);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_PrivateFindResult result;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.start_index = match_start;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.length = matched_length;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp_results.push_back(result);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match_start = usearch_next(searcher, &status);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(status == U_ZERO_ERROR);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *count = pp_results.size();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*count) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *results = reinterpret_cast<PP_PrivateFindResult*>(
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        malloc(*count * sizeof(PP_PrivateFindResult)));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(*results, &pp_results[0], *count * sizeof(PP_PrivateFindResult));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *results = NULL;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  usearch_close(searcher);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidStartLoading(PP_Instance instance_id) {
28858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
28958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
292bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  instance->GetRenderView()->DidStartLoading();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidStopLoading(PP_Instance instance_id) {
29658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
29758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
300bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  instance->GetRenderView()->DidStopLoading();
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetContentRestriction(PP_Instance instance_id, int restrictions) {
30458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
30558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
308bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  instance->GetRenderView()->Send(
309ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      new ChromeViewHostMsg_PDFUpdateContentRestrictions(
310bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch          instance->GetRenderView()->GetRoutingID(), restrictions));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
313bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid HistogramPDFPageCount(PP_Instance instance, int count) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS_10000("PDF.PageCount", count);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
317bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid UserMetricsRecordAction(PP_Instance instance, PP_Var action) {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ppapi::StringVar> action_str(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::StringVar::FromPPVar(action));
320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (action_str.get())
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    RenderThread::Get()->RecordComputedAction(action_str->value());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HasUnsupportedFeature(PP_Instance instance_id) {
32558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
32658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only want to show an info bar if the pdf is the whole tab.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance->IsFullPagePlugin())
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  WebView* view =
33523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      instance->GetContainer()->element().document().frame()->view();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderView* render_view = content::RenderView::FromWebView(view);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_view->Send(new ChromeViewHostMsg_PDFHasUnsupportedFeature(
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      render_view->GetRoutingID()));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SaveAs(PP_Instance instance_id) {
34258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
34358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
346bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  GURL url = instance->GetPluginURL();
347ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
348bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  content::RenderView* render_view = instance->GetRenderView();
3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  blink::WebLocalFrame* frame =
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      render_view->GetWebView()->mainFrame()->toWebLocalFrame();
351ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::Referrer referrer(frame->document().url(),
352ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             frame->document().referrerPolicy());
353ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  render_view->Send(new ChromeViewHostMsg_PDFSaveURLAs(
354ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      render_view->GetRoutingID(), url, referrer));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Bool IsFeatureEnabled(PP_Instance instance, PP_PDFFeature feature) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (feature) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_PDFFEATURE_HIDPI:
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return PP_TRUE;
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_PDFFEATURE_PRINTING:
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return IsPrintingEnabled(instance) ? PP_TRUE : PP_FALSE;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return PP_FALSE;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResourceImageForScale(PP_Instance instance_id,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     PP_ResourceImage image_id,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     float scale) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res_id = 0;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kResourceImageMap); ++i) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (kResourceImageMap[i].pp_id == image_id) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      res_id = kResourceImageMap[i].res_id;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (res_id == 0)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
380a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Validate the instance.
38158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
38258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
383a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (!instance)
384a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return 0;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia* res_image_skia =
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceBundle::GetSharedInstance().GetImageSkiaNamed(res_id);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!res_image_skia)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return instance->CreateImage(res_image_skia, scale);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResourceImage(PP_Instance instance_id,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             PP_ResourceImage image_id) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetResourceImageForScale(instance_id, image_id, 1.0f);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPP_Var ModalPromptForPassword(PP_Instance instance_id, PP_Var message) {
401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  content::PepperPluginInstance* instance =
402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      content::PepperPluginInstance::Get(instance_id);
403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!instance)
404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_MakeUndefined();
405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
406d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::string actual_value;
407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_refptr<ppapi::StringVar> message_string(
408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ppapi::StringVar::FromPPVar(message));
409d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  IPC::SyncMessage* msg = new ChromeViewHostMsg_PDFModalPromptForPassword(
411d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      instance->GetRenderView()->GetRoutingID(),
412d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      message_string->value(),
413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      &actual_value);
414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  msg->EnableMessagePumping();
415d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  instance->GetRenderView()->Send(msg);
416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return ppapi::StringVar::StringToPPVar(actual_value);
418d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPP_Bool IsOutOfProcess(PP_Instance instance_id) { return PP_FALSE; }
421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetSelectedText(PP_Instance instance_id, const char* selected_text) {
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This function is intended for out of process PDF plugin.
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NOTIMPLEMENTED();
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetLinkUnderCursor(PP_Instance instance_id, const char* url) {
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::PepperPluginInstance* instance =
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::PepperPluginInstance::Get(instance_id);
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!instance)
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  instance->SetLinkUnderCursor(url);
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst PPB_PDF ppb_pdf = {                      //
436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetLocalizedString,                       //
437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetResourceImage,                         //
438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetFontFileWithFallback,                  //
439c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetFontTableForPrivateFontFile,           //
440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SearchString,                             //
441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &DidStartLoading,                          //
442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &DidStopLoading,                           //
443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SetContentRestriction,                    //
444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &HistogramPDFPageCount,                    //
445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &UserMetricsRecordAction,                  //
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &HasUnsupportedFeature,                    //
447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SaveAs,                                   //
448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &PPB_PDF_Impl::InvokePrintingForInstance,  //
449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &IsFeatureEnabled,                         //
450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetResourceImageForScale,                 //
451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &ModalPromptForPassword,                   //
452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &IsOutOfProcess,                           //
453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SetSelectedText,                          //
454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SetLinkUnderCursor,                       //
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst PPB_PDF* PPB_PDF_Impl::GetInterface() { return &ppb_pdf; }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_PDF_Impl::InvokePrintingForInstance(PP_Instance instance_id) {
464c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebElement element = GetWebElement(instance_id);
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  printing::PrintWebViewHelper* helper = GetPrintWebViewHelper(element);
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (helper)
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    helper->PrintNode(element);
469c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif  // ENABLE_FULL_PRINTING
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
471