OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 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/renderer/render_frame_proxy.h" |
| 6 |
| 7 #include <map> |
| 8 |
| 9 #include "base/lazy_instance.h" |
| 10 #include "content/common/frame_messages.h" |
| 11 #include "content/common/swapped_out_messages.h" |
| 12 #include "content/renderer/render_frame_impl.h" |
| 13 #include "content/renderer/render_thread_impl.h" |
| 14 #include "content/renderer/render_view_impl.h" |
| 15 |
| 16 namespace content { |
| 17 |
| 18 namespace { |
| 19 |
| 20 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; |
| 21 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = |
| 22 LAZY_INSTANCE_INITIALIZER; |
| 23 |
| 24 } // namespace |
| 25 |
| 26 // static |
| 27 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(int routing_id, |
| 28 int frame_routing_id) { |
| 29 DCHECK_NE(routing_id, MSG_ROUTING_NONE); |
| 30 RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); |
| 31 return proxy; |
| 32 } |
| 33 |
| 34 // static |
| 35 RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { |
| 36 RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); |
| 37 RoutingIDProxyMap::iterator it = proxies->find(routing_id); |
| 38 return it == proxies->end() ? NULL : it->second; |
| 39 } |
| 40 |
| 41 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| 42 : routing_id_(routing_id), |
| 43 frame_routing_id_(frame_routing_id) { |
| 44 std::pair<RoutingIDProxyMap::iterator, bool> result = |
| 45 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
| 46 CHECK(result.second) << "Inserting a duplicate item."; |
| 47 RenderThread::Get()->AddRoute(routing_id_, this); |
| 48 |
| 49 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| 50 CHECK(render_frame_); |
| 51 } |
| 52 |
| 53 RenderFrameProxy::~RenderFrameProxy() { |
| 54 RenderThread::Get()->RemoveRoute(routing_id_); |
| 55 g_routing_id_proxy_map.Get().erase(routing_id_); |
| 56 } |
| 57 |
| 58 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
| 59 bool handled = true; |
| 60 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) |
| 61 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
| 62 IPC_MESSAGE_UNHANDLED(handled = false) |
| 63 IPC_END_MESSAGE_MAP() |
| 64 |
| 65 if (!handled) |
| 66 return render_frame_->OnMessageReceived(msg); |
| 67 |
| 68 return handled; |
| 69 } |
| 70 |
| 71 bool RenderFrameProxy::Send(IPC::Message* message) { |
| 72 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { |
| 73 delete message; |
| 74 return false; |
| 75 } |
| 76 message->set_routing_id(routing_id_); |
| 77 return RenderThread::Get()->Send(message); |
| 78 } |
| 79 |
| 80 void RenderFrameProxy::OnDeleteProxy() { |
| 81 RenderFrameImpl* render_frame = |
| 82 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
| 83 CHECK(render_frame); |
| 84 render_frame->set_render_frame_proxy(NULL); |
| 85 |
| 86 delete this; |
| 87 } |
| 88 |
| 89 } // namespace |
OLD | NEW |