pepper_truetype_font_list_host.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/public/browser/browser_ppapi_host.h"
13#include "content/public/browser/browser_thread.h"
14#include "ppapi/host/dispatch_host_message.h"
15#include "ppapi/host/host_message_context.h"
16#include "ppapi/host/resource_message_filter.h"
17#include "ppapi/proxy/ppapi_messages.h"
18
19namespace content {
20
21namespace {
22
23// Handles the font list request on the blocking pool.
24class FontMessageFilter : public ppapi::host::ResourceMessageFilter {
25 public:
26  FontMessageFilter();
27
28  // ppapi::host::ResourceMessageFilter implementation.
29  virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage(
30      const IPC::Message& msg) OVERRIDE;
31  virtual int32_t OnResourceMessageReceived(
32      const IPC::Message& msg,
33      ppapi::host::HostMessageContext* context) OVERRIDE;
34
35 private:
36  virtual ~FontMessageFilter();
37
38  // Message handler.
39  int32_t OnHostMsgGetFontFamilies(ppapi::host::HostMessageContext* context);
40
41  DISALLOW_COPY_AND_ASSIGN(FontMessageFilter);
42};
43
44FontMessageFilter::FontMessageFilter() {
45}
46
47FontMessageFilter::~FontMessageFilter() {
48}
49
50scoped_refptr<base::TaskRunner> FontMessageFilter::OverrideTaskRunnerForMessage(
51    const IPC::Message& msg) {
52  // Use the blocking pool to get the font list (currently the only message
53  // so we can always just return it).
54  return scoped_refptr<base::TaskRunner>(BrowserThread::GetBlockingPool());
55}
56
57int32_t FontMessageFilter::OnResourceMessageReceived(
58    const IPC::Message& msg,
59    ppapi::host::HostMessageContext* context) {
60  IPC_BEGIN_MESSAGE_MAP(FontMessageFilter, msg)
61    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
62        PpapiHostMsg_TrueTypeFontSingleton_GetFontFamilies,
63        OnHostMsgGetFontFamilies)
64  IPC_END_MESSAGE_MAP()
65  return PP_ERROR_FAILED;
66}
67
68int32_t FontMessageFilter::OnHostMsgGetFontFamilies(
69    ppapi::host::HostMessageContext* context) {
70  // OK to use "slow blocking" version since we're on the blocking pool.
71  std::vector<std::string> font_families;
72  GetFontFamilies_SlowBlocking(&font_families);
73  // Sort the names in case the host platform returns them out of order.
74  std::sort(font_families.begin(), font_families.end());
75
76  int32_t result = base::checked_numeric_cast<int32_t>(font_families.size());
77  ppapi::host::ReplyMessageContext reply_context =
78      context->MakeReplyMessageContext();
79  reply_context.params.set_result(result);
80  context->reply_msg =
81      PpapiPluginMsg_TrueTypeFontSingleton_GetFontFamiliesReply(font_families);
82  return result;
83}
84
85}  // namespace
86
87PepperTrueTypeFontListHost::PepperTrueTypeFontListHost(
88    BrowserPpapiHost* host,
89    PP_Instance instance,
90    PP_Resource resource)
91    : ResourceHost(host->GetPpapiHost(), instance, resource) {
92  AddFilter(scoped_refptr<ppapi::host::ResourceMessageFilter>(
93      new FontMessageFilter()));
94}
95
96PepperTrueTypeFontListHost::~PepperTrueTypeFontListHost() {
97}
98
99}  // namespace content
100