12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_pdf.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/enter.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/thunk/ppb_flash_font_file_api.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_pdf_api.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/thunk/resource_creation_api.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/thunk.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace thunk { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var GetLocalizedString(PP_Instance instance, PP_ResourceString string_id) { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.functions()->GetLocalizedString(string_id); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Resource GetResourceImage(PP_Instance instance, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_ResourceImage image_id) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.functions()->GetResourceImage(image_id); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Resource GetFontFileWithFallback( 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PP_BrowserFont_Trusted_Description* description, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_PrivateFontCharset charset) { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(raymes): Eventually we should replace the use of this function with 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // either PPB_Flash_Font_File or PPB_TrueType_Font directly in the PDF code. 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For now just call into PPB_Flash_Font_File which has the exact same API. 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResourceCreation enter(instance); 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (enter.failed()) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 0; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.functions()->CreateFlashFontFile(instance, description, charset); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetFontTableForPrivateFontFile(PP_Resource font_file, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t table, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void* output, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t* output_length) { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(raymes): Eventually we should replace the use of this function with 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // either PPB_Flash_Font_File or PPB_TrueType_Font directly in the PDF code. 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // For now just call into PPB_Flash_Font_File which has the exact same API. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_Flash_FontFile_API> enter(font_file, true); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (enter.failed()) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_FALSE; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_ToBool(enter.object()->GetFontTable(table, output, output_length)); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SearchString(PP_Instance instance, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const unsigned short* string, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const unsigned short* term, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool case_sensitive, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_PrivateFindResult** results, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* count) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->SearchString(string, term, case_sensitive, results, count); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidStartLoading(PP_Instance instance) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->DidStartLoading(); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DidStopLoading(PP_Instance instance) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->DidStopLoading(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetContentRestriction(PP_Instance instance, int restrictions) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->SetContentRestriction(restrictions); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HistogramPDFPageCount(PP_Instance instance, int count) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->HistogramPDFPageCount(count); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserMetricsRecordAction(PP_Instance instance, PP_Var action) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->UserMetricsRecordAction(action); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HasUnsupportedFeature(PP_Instance instance) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->HasUnsupportedFeature(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SaveAs(PP_Instance instance) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->SaveAs(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Print(PP_Instance instance) { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.succeeded()) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.functions()->Print(); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool IsFeatureEnabled(PP_Instance instance, PP_PDFFeature feature) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.functions()->IsFeatureEnabled(feature); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Resource GetResourceImageForScale(PP_Instance instance, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_ResourceImage image_id, 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scale) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.functions()->GetResourceImageForScale(image_id, scale); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PP_Var ModalPromptForPassword(PP_Instance instance_id, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PP_Var message) { 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(raymes): Implement or remove this function. 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTIMPLEMENTED(); 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return PP_MakeUndefined(); 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PP_Bool IsOutOfProcess(PP_Instance instance) { 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (enter.failed()) 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return PP_FALSE; 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return enter.functions()->IsOutOfProcess(); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetSelectedText(PP_Instance instance, 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* selected_text) { 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (enter.succeeded()) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enter.functions()->SetSelectedText(selected_text); 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetLinkUnderCursor(PP_Instance instance, const char* url) { 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EnterInstanceAPI<PPB_PDF_API> enter(instance); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (enter.failed()) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enter.functions()->SetLinkUnderCursor(url); 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PPB_PDF g_ppb_pdf_thunk = { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetLocalizedString, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetResourceImage, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetFontFileWithFallback, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &GetFontTableForPrivateFontFile, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SearchString, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &DidStartLoading, 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &DidStopLoading, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SetContentRestriction, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &HistogramPDFPageCount, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &UserMetricsRecordAction, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &HasUnsupportedFeature, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &SaveAs, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &Print, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &IsFeatureEnabled, 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &GetResourceImageForScale, 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &ModalPromptForPassword, 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &IsOutOfProcess, 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &SetSelectedText, 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &SetLinkUnderCursor, 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const PPB_PDF* GetPPB_PDF_Thunk() { 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &g_ppb_pdf_thunk; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace thunk 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 194