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