1 // Copyright 2013 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/renderer_host/pepper/pepper_truetype_font_list_host.h"
11 #include "base/logging.h"
12 #include "base/numerics/safe_conversions.h"
13 #include "content/browser/renderer_host/pepper/pepper_truetype_font_list.h"
14 #include "content/common/font_list.h"
15 #include "content/public/browser/browser_ppapi_host.h"
16 #include "ppapi/host/dispatch_host_message.h"
17 #include "ppapi/host/host_message_context.h"
18 #include "ppapi/host/resource_message_filter.h"
19 #include "ppapi/proxy/ppapi_messages.h"
25 // Handles the font list request on the blocking pool.
26 class TrueTypeFontMessageFilter : public ppapi::host::ResourceMessageFilter {
28 TrueTypeFontMessageFilter();
30 TrueTypeFontMessageFilter(const TrueTypeFontMessageFilter&) = delete;
31 TrueTypeFontMessageFilter& operator=(const TrueTypeFontMessageFilter&) =
34 // ppapi::host::ResourceMessageFilter implementation.
35 scoped_refptr<base::SequencedTaskRunner> OverrideTaskRunnerForMessage(
36 const IPC::Message& msg) override;
37 int32_t OnResourceMessageReceived(
38 const IPC::Message& msg,
39 ppapi::host::HostMessageContext* context) override;
42 ~TrueTypeFontMessageFilter() override;
45 int32_t OnHostMsgGetFontFamilies(ppapi::host::HostMessageContext* context);
46 int32_t OnHostMsgGetFontsInFamily(ppapi::host::HostMessageContext* context,
47 const std::string& family);
50 TrueTypeFontMessageFilter::TrueTypeFontMessageFilter() {}
52 TrueTypeFontMessageFilter::~TrueTypeFontMessageFilter() {}
54 scoped_refptr<base::SequencedTaskRunner>
55 TrueTypeFontMessageFilter::OverrideTaskRunnerForMessage(
56 const IPC::Message& msg) {
57 // Use the font list SequencedTaskRunner to get the font list (currently the
58 // only message) since getting the font list is non-threadsafe on Linux (for
59 // versions of Pango predating 2013).
60 return GetFontListTaskRunner();
63 int32_t TrueTypeFontMessageFilter::OnResourceMessageReceived(
64 const IPC::Message& msg,
65 ppapi::host::HostMessageContext* context) {
66 PPAPI_BEGIN_MESSAGE_MAP(TrueTypeFontMessageFilter, 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 PPAPI_END_MESSAGE_MAP()
74 LOG(ERROR) << "Resource message unresolved";
75 return PP_ERROR_FAILED;
78 int32_t TrueTypeFontMessageFilter::OnHostMsgGetFontFamilies(
79 ppapi::host::HostMessageContext* context) {
80 // OK to use "slow blocking" version since we're on the blocking pool.
81 std::vector<std::string> font_families;
82 GetFontFamilies_SlowBlocking(&font_families);
83 // Sort the names in case the host platform returns them out of order.
84 std::sort(font_families.begin(), font_families.end());
87 PpapiPluginMsg_TrueTypeFontSingleton_GetFontFamiliesReply(font_families);
88 return base::checked_cast<int32_t>(font_families.size());
91 int32_t TrueTypeFontMessageFilter::OnHostMsgGetFontsInFamily(
92 ppapi::host::HostMessageContext* context,
93 const std::string& family) {
94 // OK to use "slow blocking" version since we're on the blocking pool.
95 std::vector<ppapi::proxy::SerializedTrueTypeFontDesc> fonts_in_family;
96 GetFontsInFamily_SlowBlocking(family, &fonts_in_family);
99 PpapiPluginMsg_TrueTypeFontSingleton_GetFontsInFamilyReply(
101 return base::checked_cast<int32_t>(fonts_in_family.size());
106 PepperTrueTypeFontListHost::PepperTrueTypeFontListHost(BrowserPpapiHost* host,
107 PP_Instance instance,
108 PP_Resource resource)
109 : ResourceHost(host->GetPpapiHost(), instance, resource) {
110 AddFilter(scoped_refptr<ppapi::host::ResourceMessageFilter>(
111 new TrueTypeFontMessageFilter()));
114 PepperTrueTypeFontListHost::~PepperTrueTypeFontListHost() {}
116 } // namespace content