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