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