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