Index: content/browser/renderer_host/pepper/pepper_host_resolver_private_host.cc |
diff --git a/content/browser/renderer_host/pepper/pepper_host_resolver_private_host.cc b/content/browser/renderer_host/pepper/pepper_host_resolver_private_host.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f91c376830ae0b339ee911dbd87395ea30e04419 |
--- /dev/null |
+++ b/content/browser/renderer_host/pepper/pepper_host_resolver_private_host.cc |
@@ -0,0 +1,138 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/renderer_host/pepper/pepper_host_resolver_private_host.h" |
+ |
+#include "base/logging.h" |
+#include "base/time.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/browser_ppapi_host.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/resource_context.h" |
+#include "net/base/host_resolver.h" |
+#include "ppapi/c/private/ppb_host_resolver_private.h" |
+#include "ppapi/c/private/ppb_net_address_private.h" |
+#include "ppapi/host/dispatch_host_message.h" |
+#include "ppapi/host/ppapi_host.h" |
+#include "ppapi/proxy/ppapi_messages.h" |
+#include "ppapi/shared_impl/private/ppb_host_resolver_shared.h" |
+ |
+namespace content { |
+ |
+namespace { |
+ |
+// Delay for resolve requests until host resolver is ready. |
+const int kHostResolverWaitingTimeoutMs = 100; |
+ |
+ResourceContext* GetResourceContext(RenderProcessHost* render_process_host) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ BrowserContext* browser_context = render_process_host->GetBrowserContext(); |
+ if (!browser_context) |
+ return NULL; |
+ return browser_context->GetResourceContext(); |
+} |
+ |
+} // namespace |
+ |
+PepperHostResolverPrivateHost::PepperHostResolverPrivateHost( |
+ BrowserPpapiHost* host, |
+ PP_Instance instance, |
+ PP_Resource resource) |
+ : ResourceHost(host->GetPpapiHost(), instance, resource), |
+ host_resolver_(NULL), |
+ host_resolver_is_ready_(false), |
+ weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
+ DCHECK(host); |
+ |
+ host->PostOnUIThreadWithRenderProcessAndReply( |
+ FROM_HERE, |
+ instance, |
+ base::Bind(&GetResourceContext), |
+ base::Bind(&PepperHostResolverPrivateHost::SetHostResolver, |
+ weak_factory_.GetWeakPtr())); |
+} |
+ |
+PepperHostResolverPrivateHost::~PepperHostResolverPrivateHost() { |
+} |
+ |
+int32_t PepperHostResolverPrivateHost::OnResourceMessageReceived( |
+ const IPC::Message& msg, |
+ ppapi::host::HostMessageContext* context) { |
+ IPC_BEGIN_MESSAGE_MAP(PepperHostResolverPrivateHost, msg) |
+ PPAPI_DISPATCH_HOST_RESOURCE_CALL( |
+ PpapiHostMsg_HostResolverPrivate_Resolve, |
+ OnMsgResolve) |
+ IPC_END_MESSAGE_MAP() |
+ return PP_ERROR_FAILED; |
+} |
+ |
+void PepperHostResolverPrivateHost::HostResolverSendReply( |
+ bool succeeded, |
+ const std::string& canonical_name, |
+ const std::vector<PP_NetAddress_Private>& net_address_list, |
+ const BoundInfo& bound_info) { |
+ host()->SendReply(bound_info.reply_context, |
+ PpapiPluginMsg_HostResolverPrivate_ResolveReply( |
+ true, canonical_name, net_address_list)); |
+} |
+ |
+void PepperHostResolverPrivateHost::HostResolverSendError( |
+ const BoundInfo& bound_info) { |
+ host()->SendReply(bound_info.reply_context, |
+ PpapiPluginMsg_HostResolverPrivate_ResolveReply( |
+ false, "", std::vector<PP_NetAddress_Private>())); |
+} |
+ |
+net::HostResolver* PepperHostResolverPrivateHost::GetHostResolver() { |
+ return host_resolver_; |
+} |
+ |
+void PepperHostResolverPrivateHost::SetHostResolver( |
+ ResourceContext* resource_context) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ host_resolver_is_ready_ = true; |
+ if (resource_context) |
+ host_resolver_ = resource_context->GetHostResolver(); |
+} |
+ |
+int32_t PepperHostResolverPrivateHost::OnMsgResolve( |
+ const ppapi::host::HostMessageContext* context, |
+ const ppapi::HostPortPair& host_port, |
+ const PP_HostResolver_Private_Hint& hint) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ ppapi::host::ReplyMessageContext reply_context = |
+ context->MakeReplyMessageContext(); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&PepperHostResolverPrivateHost::Resolve, |
+ weak_factory_.GetWeakPtr(), reply_context, host_port, hint)); |
+ return PP_OK_COMPLETIONPENDING; |
+} |
+ |
+void PepperHostResolverPrivateHost::Resolve( |
+ const ppapi::host::ReplyMessageContext& context, |
+ const ppapi::HostPortPair& host_port, |
+ const PP_HostResolver_Private_Hint& hint) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ if (!host_resolver_is_ready()) { |
+ BrowserThread::PostDelayedTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&PepperHostResolverPrivateHost::Resolve, |
+ weak_factory_.GetWeakPtr(), |
+ context, host_port, hint), |
+ base::TimeDelta::FromMilliseconds(kHostResolverWaitingTimeoutMs)); |
+ return; |
+ } |
+ HostResolverResolve(BoundInfo(context), host_port, hint); |
+} |
+ |
+} // namespace content |