pepper_truetype_font_list_host.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/pepper/pepper_truetype_font_list_host.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <algorithm>
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/safe_numerics.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/threading/sequenced_worker_pool.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/browser/renderer_host/pepper/pepper_truetype_font_list.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/browser_ppapi_host.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/browser_thread.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/host/dispatch_host_message.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ppapi/host/host_message_context.h"
160de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "ppapi/host/resource_message_filter.h"
170de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)namespace content {
200de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)namespace {
220de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
230de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)// Handles the font list request on the blocking pool.
240de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)class FontMessageFilter : public ppapi::host::ResourceMessageFilter {
250de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) public:
260de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  FontMessageFilter();
270de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
280de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // ppapi::host::ResourceMessageFilter implementation.
290de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  virtual scoped_refptr<base::TaskRunner> OverrideTaskRunnerForMessage(
300de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      const IPC::Message& msg) OVERRIDE;
310de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  virtual int32_t OnResourceMessageReceived(
320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      const IPC::Message& msg,
330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      ppapi::host::HostMessageContext* context) OVERRIDE;
340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) private:
360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  virtual ~FontMessageFilter();
370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
380de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  // Message handler.
390de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  int32_t OnHostMsgGetFontFamilies(ppapi::host::HostMessageContext* context);
400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
410de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FontMessageFilter);
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
44effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochFontMessageFilter::FontMessageFilter() {
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
47effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochFontMessageFilter::~FontMessageFilter() {
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<base::TaskRunner> FontMessageFilter::OverrideTaskRunnerForMessage(
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const IPC::Message& msg) {
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Use the blocking pool to get the font list (currently the only message
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // so we can always just return it).
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return scoped_refptr<base::TaskRunner>(BrowserThread::GetBlockingPool());
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochint32_t FontMessageFilter::OnResourceMessageReceived(
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const IPC::Message& msg,
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ppapi::host::HostMessageContext* context) {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  IPC_BEGIN_MESSAGE_MAP(FontMessageFilter, msg)
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        PpapiHostMsg_TrueTypeFontSingleton_GetFontFamilies,
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        OnHostMsgGetFontFamilies)
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  IPC_END_MESSAGE_MAP()
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return PP_ERROR_FAILED;
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochint32_t FontMessageFilter::OnHostMsgGetFontFamilies(
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ppapi::host::HostMessageContext* context) {
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // OK to use "slow blocking" version since we're on the blocking pool.
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> font_families;
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GetFontFamilies_SlowBlocking(&font_families);
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Sort the names in case the host platform returns them out of order.
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::sort(font_families.begin(), font_families.end());
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  int32_t result = base::checked_numeric_cast<int32_t>(font_families.size());
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ppapi::host::ReplyMessageContext reply_context =
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      context->MakeReplyMessageContext();
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  reply_context.params.set_result(result);
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  context->reply_msg =
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PpapiPluginMsg_TrueTypeFontSingleton_GetFontFamiliesReply(font_families);
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return result;
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
87effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPepperTrueTypeFontListHost::PepperTrueTypeFontListHost(
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    BrowserPpapiHost* host,
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PP_Instance instance,
900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    PP_Resource resource)
910de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    : ResourceHost(host->GetPpapiHost(), instance, resource) {
920de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  AddFilter(scoped_refptr<ppapi::host::ResourceMessageFilter>(
930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)      new FontMessageFilter()));
940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)}
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
96effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPepperTrueTypeFontListHost::~PepperTrueTypeFontListHost() {
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace content
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch