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)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/renderer/ppb_pdf_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/scoped_file.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/common/pdf_messages.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/renderer/pdf_resource_util.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/child_process_sandbox_support_linux.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/referrer.h"
1558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/pepper_plugin_instance.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_thread.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h"
20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "ppapi/c/trusted/ppb_browser_font_trusted.h"
21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ppapi/shared_impl/ppapi_globals.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h"
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/WebKit/public/web/WebView.h"
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/usearch.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace pdf {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPPB_PDF_Impl::PrintClient* g_print_client = NULL;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrivateFontFile : public ppapi::Resource {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrivateFontFile(PP_Instance instance, int fd)
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : Resource(ppapi::OBJECT_IS_IMPL, instance), fd_(fd) {}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  bool GetFontTable(uint32_t table, void* output, uint32_t* output_length) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t temp_size = static_cast<size_t>(*output_length);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool rv = content::GetFontTable(fd_.get(),
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    table,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    0 /* offset */,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    static_cast<uint8_t*>(output),
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    &temp_size);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *output_length = base::checked_cast<uint32_t>(temp_size);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return rv;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PrivateFontFile() {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedFD fd_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Var GetLocalizedString(PP_Instance instance_id,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          PP_ResourceString string_id) {
6558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
6658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_MakeUndefined();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string rv = GetStringResource(string_id);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ppapi::StringVar::StringToPPVar(rv);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetFontFileWithFallback(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance_id,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const PP_BrowserFont_Trusted_Description* description,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_PrivateFontCharset charset) {
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Validate the instance before using it below.
8058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (!content::PepperPluginInstance::Get(instance_id))
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ppapi::StringVar> face_name(
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ppapi::StringVar::FromPPVar(description->face));
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!face_name.get())
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int fd = content::MatchFontWithFallback(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      face_name->value().c_str(),
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      description->weight >= PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      description->italic,
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      charset,
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      description->family);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fd == -1)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PrivateFontFile> font(new PrivateFontFile(instance_id, fd));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return font->GetReference();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For trusted PPAPI plugins, this is only needed in Linux since font loading
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on Windows and Mac works through the renderer sandbox.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetFontTableForPrivateFontFile(PP_Resource font_file,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t table,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    void* output,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    uint32_t* output_length) {
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::Resource* resource =
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ppapi::PpapiGlobals::Get()->GetResourceTracker()->GetResource(font_file);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!resource)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrivateFontFile* font = static_cast<PrivateFontFile*>(resource);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return font->GetFontTable(table, output, output_length);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SearchString(PP_Instance instance,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const unsigned short* input_string,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const unsigned short* input_term,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool case_sensitive,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PP_PrivateFindResult** results,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int* count) {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::char16* string =
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      reinterpret_cast<const base::char16*>(input_string);
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const base::char16* term = reinterpret_cast<const base::char16*>(input_term);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode status = U_ZERO_ERROR;
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  UStringSearch* searcher =
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      usearch_open(term,
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   -1,
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   string,
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   -1,
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   content::RenderThread::Get()->GetLocale().c_str(),
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   0,
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   &status);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status == U_ZERO_ERROR || status == U_USING_FALLBACK_WARNING ||
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         status == U_USING_DEFAULT_WARNING);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UCollationStrength strength = case_sensitive ? UCOL_TERTIARY : UCOL_PRIMARY;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UCollator* collator = usearch_getCollator(searcher);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ucol_getStrength(collator) != strength) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ucol_setStrength(collator, strength);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    usearch_reset(searcher);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status = U_ZERO_ERROR;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int match_start = usearch_first(searcher, &status);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(status == U_ZERO_ERROR);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PP_PrivateFindResult> pp_results;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (match_start != USEARCH_DONE) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t matched_length = usearch_getMatchedLength(searcher);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_PrivateFindResult result;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.start_index = match_start;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result.length = matched_length;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp_results.push_back(result);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match_start = usearch_next(searcher, &status);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(status == U_ZERO_ERROR);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *count = pp_results.size();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (*count) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *results = reinterpret_cast<PP_PrivateFindResult*>(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        malloc(*count * sizeof(PP_PrivateFindResult)));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(*results, &pp_results[0], *count * sizeof(PP_PrivateFindResult));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *results = NULL;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  usearch_close(searcher);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidStartLoading(PP_Instance instance_id) {
18158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
18258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
185bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  instance->GetRenderView()->DidStartLoading();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DidStopLoading(PP_Instance instance_id) {
18958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
19058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
193bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  instance->GetRenderView()->DidStopLoading();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetContentRestriction(PP_Instance instance_id, int restrictions) {
19758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
19858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  instance->GetRenderView()->Send(new PDFHostMsg_PDFUpdateContentRestrictions(
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      instance->GetRenderView()->GetRoutingID(), restrictions));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid HistogramPDFPageCount(PP_Instance instance, int count) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UMA_HISTOGRAM_COUNTS_10000("PDF.PageCount", count);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid UserMetricsRecordAction(PP_Instance instance, PP_Var action) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ppapi::StringVar> action_str(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::StringVar::FromPPVar(action));
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (action_str.get())
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderThread::Get()->RecordComputedAction(action_str->value());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HasUnsupportedFeature(PP_Instance instance_id) {
21758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
21858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only want to show an info bar if the pdf is the whole tab.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance->IsFullPagePlugin())
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  blink::WebView* view =
22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      instance->GetContainer()->element().document().frame()->view();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderView* render_view = content::RenderView::FromWebView(view);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  render_view->Send(
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new PDFHostMsg_PDFHasUnsupportedFeature(render_view->GetRoutingID()));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SaveAs(PP_Instance instance_id) {
23458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
23558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
238bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  GURL url = instance->GetPluginURL();
239ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
240bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  content::RenderView* render_view = instance->GetRenderView();
2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  blink::WebLocalFrame* frame =
2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      render_view->GetWebView()->mainFrame()->toWebLocalFrame();
243ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::Referrer referrer(frame->document().url(),
244ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             frame->document().referrerPolicy());
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  render_view->Send(
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new PDFHostMsg_PDFSaveURLAs(render_view->GetRoutingID(), url, referrer));
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Print(PP_Instance instance) {
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PPB_PDF_Impl::InvokePrintingForInstance(instance);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PP_Bool IsFeatureEnabled(PP_Instance instance, PP_PDFFeature feature) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (feature) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_PDFFEATURE_HIDPI:
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return PP_TRUE;
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PP_PDFFEATURE_PRINTING:
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return (g_print_client && g_print_client->IsPrintingEnabled(instance))
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 ? PP_TRUE
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 : PP_FALSE;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return PP_FALSE;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResourceImageForScale(PP_Instance instance_id,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     PP_ResourceImage image_id,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     float scale) {
268a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Validate the instance.
26958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  content::PepperPluginInstance* instance =
27058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      content::PepperPluginInstance::Get(instance_id);
271a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  if (!instance)
272a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    return 0;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::ImageSkia* res_image_skia = GetImageResource(image_id);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!res_image_skia)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return instance->CreateImage(res_image_skia, scale);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResourceImage(PP_Instance instance_id,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             PP_ResourceImage image_id) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetResourceImageForScale(instance_id, image_id, 1.0f);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPP_Var ModalPromptForPassword(PP_Instance instance_id, PP_Var message) {
288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  content::PepperPluginInstance* instance =
289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      content::PepperPluginInstance::Get(instance_id);
290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!instance)
291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return PP_MakeUndefined();
292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::string actual_value;
294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_refptr<ppapi::StringVar> message_string(
295d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ppapi::StringVar::FromPPVar(message));
296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  IPC::SyncMessage* msg = new PDFHostMsg_PDFModalPromptForPassword(
298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      instance->GetRenderView()->GetRoutingID(),
299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      message_string->value(),
300d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      &actual_value);
301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  msg->EnableMessagePumping();
302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  instance->GetRenderView()->Send(msg);
303d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return ppapi::StringVar::StringToPPVar(actual_value);
305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPP_Bool IsOutOfProcess(PP_Instance instance_id) {
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return PP_FALSE;
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetSelectedText(PP_Instance instance_id, const char* selected_text) {
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This function is intended for out of process PDF plugin.
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetLinkUnderCursor(PP_Instance instance_id, const char* url) {
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::PepperPluginInstance* instance =
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::PepperPluginInstance::Get(instance_id);
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!instance)
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  instance->SetLinkUnderCursor(url);
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
323c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst PPB_PDF ppb_pdf = {                      //
324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetLocalizedString,                       //
325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetResourceImage,                         //
326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetFontFileWithFallback,                  //
327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetFontTableForPrivateFontFile,           //
328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SearchString,                             //
329c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &DidStartLoading,                          //
330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &DidStopLoading,                           //
331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SetContentRestriction,                    //
332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &HistogramPDFPageCount,                    //
333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &UserMetricsRecordAction,                  //
334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &HasUnsupportedFeature,                    //
335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SaveAs,                                   //
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    &Print,                                    //
337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &IsFeatureEnabled,                         //
338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &GetResourceImageForScale,                 //
339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &ModalPromptForPassword,                   //
340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &IsOutOfProcess,                           //
341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SetSelectedText,                          //
342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    &SetLinkUnderCursor,                       //
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst PPB_PDF* PPB_PDF_Impl::GetInterface() {
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return &ppb_pdf;
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool PPB_PDF_Impl::InvokePrintingForInstance(PP_Instance instance_id) {
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return g_print_client ? g_print_client->Print(instance_id) : false;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PPB_PDF_Impl::SetPrintClient(PPB_PDF_Impl::PrintClient* client) {
3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK(!g_print_client) << "There should only be a single PrintClient.";
3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  g_print_client = client;
3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace pdf
363