Index: content/browser/renderer_host/pepper_message_filter.cc |
=================================================================== |
--- content/browser/renderer_host/pepper_message_filter.cc (revision 85766) |
+++ content/browser/renderer_host/pepper_message_filter.cc (working copy) |
@@ -5,9 +5,12 @@ |
#include "content/browser/renderer_host/pepper_message_filter.h" |
#include "base/basictypes.h" |
+#include "base/bind.h" |
#include "base/process_util.h" |
#include "base/threading/worker_pool.h" |
+#include "base/values.h" |
#include "content/browser/browser_thread.h" |
+#include "content/browser/font_list_async.h" |
#include "content/browser/renderer_host/browser_render_process_host.h" |
#include "content/browser/resource_context.h" |
#include "content/common/pepper_messages.h" |
@@ -17,6 +20,7 @@ |
#include "net/base/host_resolver.h" |
#include "net/url_request/url_request_context.h" |
#include "ppapi/c/private/ppb_flash_net_connector.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
#include "webkit/plugins/ppapi/ppb_flash_net_connector_impl.h" |
#if defined(ENABLE_FLAPPER_HACKS) |
@@ -36,10 +40,17 @@ |
PepperMessageFilter::PepperMessageFilter( |
const content::ResourceContext* resource_context) |
- : resource_context_(resource_context) { |
+ : resource_context_(resource_context), |
+ host_resolver_(NULL) { |
DCHECK(resource_context_); |
} |
+PepperMessageFilter::PepperMessageFilter(net::HostResolver* host_resolver) |
+ : resource_context_(NULL), |
+ host_resolver_(host_resolver) { |
+ DCHECK(host_resolver); |
+} |
+ |
PepperMessageFilter::~PepperMessageFilter() {} |
bool PepperMessageFilter::OnMessageReceived(const IPC::Message& msg, |
@@ -52,6 +63,8 @@ |
#endif // ENABLE_FLAPPER_HACKS |
IPC_MESSAGE_HANDLER(PepperMsg_GetLocalTimeZoneOffset, |
OnGetLocalTimeZoneOffset) |
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(PpapiHostMsg_PPBFont_GetFontFamilies, |
+ OnGetFontFamilies) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP_EX() |
return handled; |
@@ -178,7 +191,7 @@ |
// The lookup request will delete itself on completion. |
LookupRequest* lookup_request = |
- new LookupRequest(this, resource_context_->host_resolver(), |
+ new LookupRequest(this, GetHostResolver(), |
routing_id, request_id, request_info); |
lookup_request->Start(); |
} |
@@ -295,3 +308,43 @@ |
base::Time cur = base::Time::FromUTCExploded(exploded); |
*result = (adj_time - cur).InSecondsF(); |
} |
+ |
+void PepperMessageFilter::OnGetFontFamilies(IPC::Message* reply_msg) { |
+ content::GetFontListAsync( |
+ base::Bind(&PepperMessageFilter::GetFontFamiliesComplete, |
+ this, reply_msg)); |
+} |
+ |
+void PepperMessageFilter::GetFontFamiliesComplete( |
+ IPC::Message* reply_msg, |
+ scoped_refptr<content::FontListResult> result) { |
+ ListValue* input = result->list.get(); |
+ |
+ std::string output; |
+ for (size_t i = 0; i < input->GetSize(); i++) { |
+ ListValue* cur_font; |
+ if (!input->GetList(i, &cur_font)) |
+ continue; |
+ |
+ // Each entry in the list is actually a list of (font name, localized name). |
+ // We only care about the regular name. |
+ std::string font_name; |
+ if (!cur_font->GetString(0, &font_name)) |
+ continue; |
+ |
+ // Font names are separated with nulls. We also want an explicit null at |
+ // the end of the string (Pepper strings aren't null terminated so since |
+ // we specify there will be a null, it should actually be in the string). |
+ output.append(font_name); |
+ output.push_back(0); |
+ } |
+ |
+ PpapiHostMsg_PPBFont_GetFontFamilies::WriteReplyParams(reply_msg, output); |
+ Send(reply_msg); |
+} |
+ |
+net::HostResolver* PepperMessageFilter::GetHostResolver() { |
+ if (resource_context_) |
+ return resource_context_->host_resolver(); |
+ return host_resolver_; |
+} |