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 RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); |
| 30 return proxy; |
| 31 } |
| 32 |
| 33 // static |
| 34 RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { |
| 35 RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); |
| 36 RoutingIDProxyMap::iterator it = proxies->find(routing_id); |
| 37 return it == proxies->end() ? NULL : it->second; |
| 38 } |
| 39 |
| 40 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| 41 : routing_id_(routing_id), |
| 42 frame_routing_id_(frame_routing_id) { |
| 43 std::pair<RoutingIDProxyMap::iterator, bool> result = |
| 44 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
| 45 CHECK(result.second) << "Inserting a duplicate item."; |
| 46 RenderThread::Get()->AddRoute(routing_id_, this); |
| 47 |
| 48 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| 49 CHECK(render_frame_); |
| 50 } |
| 51 |
| 52 RenderFrameProxy::~RenderFrameProxy() { |
| 53 RenderThread::Get()->RemoveRoute(routing_id_); |
| 54 g_routing_id_proxy_map.Get().erase(routing_id_); |
| 55 } |
| 56 |
| 57 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
| 58 bool handled = true; |
| 59 bool msg_is_ok = true; |
| 60 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameProxy, msg, msg_is_ok) |
| 61 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
| 62 IPC_MESSAGE_UNHANDLED(handled = false) |
| 63 IPC_END_MESSAGE_MAP_EX() |
| 64 |
| 65 if (!handled) |
| 66 return render_frame_->OnMessageReceived(msg); |
| 67 |
| 68 if (!msg_is_ok) { |
| 69 // The message had a handler, but its deserialization failed. |
| 70 // Kill the renderer to avoid potential spoofing attacks. |
| 71 int id = msg.type(); |
| 72 CHECK(false) << "Unable to deserialize " << id << " in RenderFrameProxy."; |
| 73 } |
| 74 |
| 75 return handled; |
| 76 } |
| 77 |
| 78 bool RenderFrameProxy::Send(IPC::Message* message) { |
| 79 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { |
| 80 delete message; |
| 81 return false; |
| 82 } |
| 83 message->set_routing_id(routing_id_); |
| 84 return RenderThread::Get()->Send(message); |
| 85 } |
| 86 |
| 87 void RenderFrameProxy::OnDeleteProxy() { |
| 88 RenderFrameImpl* render_frame = |
| 89 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
| 90 CHECK(render_frame); |
| 91 render_frame->set_render_frame_proxy(NULL); |
| 92 |
| 93 delete this; |
| 94 } |
| 95 |
| 96 } // namespace |
OLD | NEW |