Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/render_frame_proxy.h" | 5 #include "content/renderer/render_frame_proxy.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "content/common/frame_messages.h" | 10 #include "content/common/frame_messages.h" |
| 11 #include "content/common/swapped_out_messages.h" | 11 #include "content/common/swapped_out_messages.h" |
| 12 #include "content/renderer/child_frame_compositing_helper.h" | 12 #include "content/renderer/child_frame_compositing_helper.h" |
| 13 #include "content/renderer/render_frame_impl.h" | 13 #include "content/renderer/render_frame_impl.h" |
| 14 #include "content/renderer/render_thread_impl.h" | 14 #include "content/renderer/render_thread_impl.h" |
| 15 #include "content/renderer/render_view_impl.h" | 15 #include "content/renderer/render_view_impl.h" |
| 16 #include "third_party/WebKit/public/web/WebView.h" | 16 #include "third_party/WebKit/public/web/WebView.h" |
| 17 | 17 |
| 18 #include "ipc/ipc_logging.h" | |
| 19 #include "ipc/ipc_message_utils.h" | |
| 20 | |
| 18 namespace content { | 21 namespace content { |
| 19 | 22 |
| 20 namespace { | 23 namespace { |
| 21 | 24 |
| 22 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; | 25 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; |
| 23 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = | 26 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = |
| 24 LAZY_INSTANCE_INITIALIZER; | 27 LAZY_INSTANCE_INITIALIZER; |
| 25 | 28 |
| 29 typedef std::map<blink::WebFrame*, RenderFrameProxy*> FrameMap; | |
| 30 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; | |
| 31 | |
| 26 } // namespace | 32 } // namespace |
| 27 | 33 |
| 28 // static | 34 // static |
| 29 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(int routing_id, | 35 RenderFrameProxy* RenderFrameProxy::CreateProxyForFrame(int routing_id, |
| 30 int frame_routing_id) { | 36 int frame_routing_id) { |
| 31 DCHECK_NE(routing_id, MSG_ROUTING_NONE); | 37 CHECK_NE(routing_id, MSG_ROUTING_NONE); |
| 38 CHECK_NE(frame_routing_id, MSG_ROUTING_NONE); | |
| 39 | |
| 40 LOG(ERROR) << "RFP::CreateProxyForFrame: 2 param version: " | |
| 41 << " routing_id:" << routing_id << ", frame:" << frame_routing_id; | |
| 42 | |
| 32 RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); | 43 RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); |
| 44 | |
| 45 RenderFrameImpl* rf = RenderFrameImpl::FromRoutingID(frame_routing_id); | |
| 46 CHECK(rf); | |
| 47 LOG(ERROR) << "RFP::CreateProxyForFrame: rf: " << rf; | |
| 48 proxy->set_render_view(rf->render_view()); | |
| 49 | |
| 50 if (rf->GetWebFrame()->parent() && | |
| 51 rf->GetWebFrame()->parent()->isWebRemoteFrame()) { | |
| 52 proxy->frame_ = | |
| 53 rf->GetWebFrame()->parent()->toWebRemoteFrame()->createRemoteChild( | |
| 54 "", NULL); | |
| 55 } else { | |
| 56 proxy->frame_ = blink::WebRemoteFrame::create(NULL); | |
| 57 } | |
| 58 | |
| 59 std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( | |
| 60 std::make_pair(proxy->frame_, proxy)); | |
| 61 CHECK(result.second) << "Inserting a duplicate item."; | |
| 62 | |
| 33 return proxy; | 63 return proxy; |
| 34 } | 64 } |
| 35 | 65 |
| 66 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( | |
| 67 int routing_id, | |
| 68 int parent_routing_id, | |
| 69 int render_view_routing_id) { | |
| 70 LOG(ERROR) << "RFP::CreateFrameProxy: " | |
| 71 << routing_id << ":" << parent_routing_id << ":" << render_view_routing_id; | |
| 72 | |
| 73 RenderViewImpl* rv = NULL; | |
| 74 RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, MSG_ROUTING_NONE); | |
| 75 | |
| 76 if (parent_routing_id == MSG_ROUTING_NONE) { | |
| 77 rv = RenderViewImpl::FromRoutingID(render_view_routing_id); | |
| 78 proxy->frame_ = blink::WebRemoteFrame::create(NULL); | |
| 79 LOG(ERROR) << "RFP::CreateFrameProxy: top frame"; | |
| 80 rv->webview()->setMainFrame(proxy->frame_); | |
| 81 } else { | |
| 82 RenderFrameProxy* proxy = RenderFrameProxy::FromRoutingID( | |
| 83 parent_routing_id); | |
|
ncarter (slow)
2014/06/25 01:07:57
|proxy| here is shadowing |proxy| up there. Strong
| |
| 84 CHECK(proxy); | |
| 85 LOG(ERROR) << "RFP::CreateFrameProxy: RFP: " << proxy; | |
| 86 blink::WebRemoteFrame* remote_frame = proxy->GetWebFrame(); | |
| 87 proxy->frame_ = remote_frame->createRemoteChild("", NULL); | |
| 88 rv = proxy->render_view(); | |
| 89 } | |
| 90 | |
| 91 std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( | |
| 92 std::make_pair(proxy->frame_, proxy)); | |
| 93 CHECK(result.second) << "Inserting a duplicate item."; | |
| 94 | |
| 95 CHECK(rv); | |
| 96 proxy->set_render_view(rv); | |
| 97 | |
| 98 return proxy; | |
| 99 } | |
| 100 | |
| 36 // static | 101 // static |
| 37 RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { | 102 RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { |
| 38 RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); | 103 RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); |
| 39 RoutingIDProxyMap::iterator it = proxies->find(routing_id); | 104 RoutingIDProxyMap::iterator it = proxies->find(routing_id); |
| 40 return it == proxies->end() ? NULL : it->second; | 105 return it == proxies->end() ? NULL : it->second; |
| 41 } | 106 } |
| 42 | 107 |
| 108 // static | |
| 109 RenderFrameProxy* RenderFrameProxy::FromWebFrame(blink::WebFrame* web_frame) { | |
| 110 FrameMap::iterator iter = g_frame_map.Get().find(web_frame); | |
| 111 if (iter != g_frame_map.Get().end()) | |
| 112 return iter->second; | |
| 113 return NULL; | |
| 114 } | |
| 115 | |
| 43 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) | 116 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| 44 : routing_id_(routing_id), | 117 : routing_id_(routing_id), |
| 45 frame_routing_id_(frame_routing_id) { | 118 frame_routing_id_(frame_routing_id) { |
| 46 std::pair<RoutingIDProxyMap::iterator, bool> result = | 119 std::pair<RoutingIDProxyMap::iterator, bool> result = |
| 47 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); | 120 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
| 48 CHECK(result.second) << "Inserting a duplicate item."; | 121 CHECK(result.second) << "Inserting a duplicate item."; |
| 49 RenderThread::Get()->AddRoute(routing_id_, this); | 122 RenderThread::Get()->AddRoute(routing_id_, this); |
| 50 | 123 |
| 51 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); | 124 LOG(ERROR) << "RFP::RFP[" << this << "]:" |
| 52 CHECK(render_frame_); | 125 << " routing_id:" << routing_id_ << ", for frame:" << frame_routing_id; |
| 53 render_frame_->render_view()->RegisterRenderFrameProxy(this); | 126 |
| 127 if (frame_routing_id_ != MSG_ROUTING_NONE) { | |
| 128 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); | |
| 129 CHECK(render_frame_); | |
| 130 render_frame_->render_view()->RegisterRenderFrameProxy(this); | |
| 131 } | |
| 54 } | 132 } |
| 55 | 133 |
| 56 RenderFrameProxy::~RenderFrameProxy() { | 134 RenderFrameProxy::~RenderFrameProxy() { |
| 57 render_frame_->render_view()->UnregisterRenderFrameProxy(this); | 135 LOG(ERROR) << "RFP::~RFP[" << this << "]:" |
| 136 << " routing_id:" << routing_id_; | |
| 137 if (render_frame_) | |
| 138 render_frame_->render_view()->UnregisterRenderFrameProxy(this); | |
| 139 | |
| 140 FrameMap::iterator it = g_frame_map.Get().find(frame_); | |
| 141 CHECK(it != g_frame_map.Get().end()); | |
| 142 CHECK_EQ(it->second, this); | |
| 143 g_frame_map.Get().erase(it); | |
| 144 | |
| 58 RenderThread::Get()->RemoveRoute(routing_id_); | 145 RenderThread::Get()->RemoveRoute(routing_id_); |
| 59 g_routing_id_proxy_map.Get().erase(routing_id_); | 146 g_routing_id_proxy_map.Get().erase(routing_id_); |
| 60 } | 147 } |
| 61 | 148 |
| 62 blink::WebFrame* RenderFrameProxy::GetWebFrame() { | |
| 63 return render_frame_->GetWebFrame(); | |
| 64 } | |
| 65 | |
| 66 void RenderFrameProxy::DidCommitCompositorFrame() { | 149 void RenderFrameProxy::DidCommitCompositorFrame() { |
| 67 if (compositing_helper_) | 150 if (compositing_helper_) |
| 68 compositing_helper_->DidCommitCompositorFrame(); | 151 compositing_helper_->DidCommitCompositorFrame(); |
| 69 } | 152 } |
| 70 | 153 |
| 71 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { | 154 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
| 155 IPC::LogData data; | |
| 156 IPC::GenerateLogData("", msg, &data, true); | |
| 157 | |
| 158 LOG(ERROR) << "RFP[" << this << "]::OnMessageReceived:" | |
| 159 << " msg:" << data.message_name | |
| 160 << " render_frame_:" << render_frame_; | |
| 161 //<< " parent:" << frame_->parent(); | |
| 162 | |
| 72 bool handled = true; | 163 bool handled = true; |
| 73 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) | 164 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) |
| 74 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) | 165 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
| 75 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) | 166 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) |
| 76 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) | 167 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) |
| 77 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, | 168 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, |
| 78 OnCompositorFrameSwapped(msg)) | 169 OnCompositorFrameSwapped(msg)) |
| 79 IPC_MESSAGE_UNHANDLED(handled = false) | 170 IPC_MESSAGE_UNHANDLED(handled = false) |
| 80 IPC_END_MESSAGE_MAP() | 171 IPC_END_MESSAGE_MAP() |
| 81 | 172 |
| 82 if (!handled) | 173 if (!handled && render_frame_) |
| 83 return render_frame_->OnMessageReceived(msg); | 174 return render_frame_->OnMessageReceived(msg); |
| 84 | 175 |
| 85 return handled; | 176 return handled; |
| 86 } | 177 } |
| 87 | 178 |
| 88 bool RenderFrameProxy::Send(IPC::Message* message) { | 179 bool RenderFrameProxy::Send(IPC::Message* message) { |
| 89 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { | 180 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { |
| 90 delete message; | 181 delete message; |
| 91 return false; | 182 return false; |
| 92 } | 183 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 139 compositing_helper_->EnableCompositing(true); | 230 compositing_helper_->EnableCompositing(true); |
| 140 } | 231 } |
| 141 compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), | 232 compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), |
| 142 param.a.producing_route_id, | 233 param.a.producing_route_id, |
| 143 param.a.output_surface_id, | 234 param.a.output_surface_id, |
| 144 param.a.producing_host_id, | 235 param.a.producing_host_id, |
| 145 param.a.shared_memory_handle); | 236 param.a.shared_memory_handle); |
| 146 } | 237 } |
| 147 | 238 |
| 148 } // namespace | 239 } // namespace |
| OLD | NEW |