Home | History | Annotate | Download | only in pepper
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/renderer_host/pepper/pepper_truetype_font_list_host.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/safe_numerics.h"
     10 #include "base/threading/sequenced_worker_pool.h"
     11 #include "content/browser/renderer_host/pepper/pepper_truetype_font_list.h"
     12 #include "content/common/font_list.h"
     13 #include "content/public/browser/browser_ppapi_host.h"
     14 #include "content/public/browser/browser_thread.h"
     15 #include "ppapi/host/dispatch_host_message.h"
     16 #include "ppapi/host/host_message_context.h"
     17 #include "ppapi/host/resource_message_filter.h"
     18 #include "ppapi/proxy/ppapi_messages.h"
     19 
     20 namespace content {
     21 
     22 namespace {
     23 
     24 // Handles the font list request on the blocking pool.
     25 class FontMessageFilter : public ppapi::host::ResourceMessageFilter {
     26  public:
     27   FontMessageFilter();
     28 
     29   // ppapi::host::ResourceMessageFilter implementation.
     30   virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage(
     31       const IPC::Message& msg) OVERRIDE;
     32   virtual int32_t OnResourceMessageReceived(
     33       const IPC::Message& msg,
     34       ppapi::host::HostMessageContext* context) OVERRIDE;
     35 
     36  private:
     37   virtual ~FontMessageFilter();
     38 
     39   // Message handlers.
     40   int32_t OnHostMsgGetFontFamilies(ppapi::host::HostMessageContext* context);
     41   int32_t OnHostMsgGetFontsInFamily(ppapi::host::HostMessageContext* context,
     42                                     const std::string& family);
     43 
     44   DISALLOW_COPY_AND_ASSIGN(FontMessageFilter);
     45 };
     46 
     47 FontMessageFilter::FontMessageFilter() {
     48 }
     49 
     50 FontMessageFilter::~FontMessageFilter() {
     51 }
     52 
     53 scoped_refptr<base::TaskRunner> FontMessageFilter::OverrideTaskRunnerForMessage(
     54     const IPC::Message& msg) {
     55   // Use the blocking pool to get the font list (currently the only message)
     56   // Since getting the font list is non-threadsafe on Linux (for versions of
     57   // Pango predating 2013), use a sequenced task runner.
     58   base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
     59   return pool->GetSequencedTaskRunner(
     60       pool->GetNamedSequenceToken(kFontListSequenceToken));
     61 }
     62 
     63 int32_t FontMessageFilter::OnResourceMessageReceived(
     64     const IPC::Message& msg,
     65     ppapi::host::HostMessageContext* context) {
     66   IPC_BEGIN_MESSAGE_MAP(FontMessageFilter, msg)
     67     PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
     68         PpapiHostMsg_TrueTypeFontSingleton_GetFontFamilies,
     69         OnHostMsgGetFontFamilies)
     70     PPAPI_DISPATCH_HOST_RESOURCE_CALL(
     71         PpapiHostMsg_TrueTypeFontSingleton_GetFontsInFamily,
     72         OnHostMsgGetFontsInFamily)
     73   IPC_END_MESSAGE_MAP()
     74   return PP_ERROR_FAILED;
     75 }
     76 
     77 int32_t FontMessageFilter::OnHostMsgGetFontFamilies(
     78     ppapi::host::HostMessageContext* context) {
     79   // OK to use "slow blocking" version since we're on the blocking pool.
     80   std::vector<std::string> font_families;
     81   GetFontFamilies_SlowBlocking(&font_families);
     82   // Sort the names in case the host platform returns them out of order.
     83   std::sort(font_families.begin(), font_families.end());
     84 
     85   int32_t result = base::checked_numeric_cast<int32_t>(font_families.size());
     86   ppapi::host::ReplyMessageContext reply_context =
     87       context->MakeReplyMessageContext();
     88   reply_context.params.set_result(result);
     89   context->reply_msg =
     90       PpapiPluginMsg_TrueTypeFontSingleton_GetFontFamiliesReply(font_families);
     91   return result;
     92 }
     93 
     94 int32_t FontMessageFilter::OnHostMsgGetFontsInFamily(
     95     ppapi::host::HostMessageContext* context,
     96     const std::string& family) {
     97   // OK to use "slow blocking" version since we're on the blocking pool.
     98   std::vector<ppapi::proxy::SerializedTrueTypeFontDesc> fonts_in_family;
     99   GetFontsInFamily_SlowBlocking(family, &fonts_in_family);
    100 
    101   int32_t result = base::checked_numeric_cast<int32_t>(fonts_in_family.size());
    102   ppapi::host::ReplyMessageContext reply_context =
    103       context->MakeReplyMessageContext();
    104   reply_context.params.set_result(result);
    105   context->reply_msg =
    106       PpapiPluginMsg_TrueTypeFontSingleton_GetFontsInFamilyReply(
    107           fonts_in_family);
    108   return result;
    109 }
    110 
    111 }  // namespace
    112 
    113 PepperTrueTypeFontListHost::PepperTrueTypeFontListHost(
    114     BrowserPpapiHost* host,
    115     PP_Instance instance,
    116     PP_Resource resource)
    117     : ResourceHost(host->GetPpapiHost(), instance, resource) {
    118   AddFilter(scoped_refptr<ppapi::host::ResourceMessageFilter>(
    119       new FontMessageFilter()));
    120 }
    121 
    122 PepperTrueTypeFontListHost::~PepperTrueTypeFontListHost() {
    123 }
    124 
    125 }  // namespace content
    126