Chromium Code Reviews| Index: content/renderer/render_frame_proxy.cc |
| diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc |
| index 2e85a52ded03a713ed2fb61dc4909dccaa32566c..659b1dc51c74d081a45320a2373c384b2afd6fef 100644 |
| --- a/content/renderer/render_frame_proxy.cc |
| +++ b/content/renderer/render_frame_proxy.cc |
| @@ -15,6 +15,9 @@ |
| #include "content/renderer/render_view_impl.h" |
| #include "third_party/WebKit/public/web/WebView.h" |
| +#include "ipc/ipc_logging.h" |
| +#include "ipc/ipc_message_utils.h" |
| + |
| namespace content { |
| namespace { |
| @@ -23,13 +26,75 @@ typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; |
| static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = |
| LAZY_INSTANCE_INITIALIZER; |
| +typedef std::map<blink::WebFrame*, RenderFrameProxy*> FrameMap; |
| +base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; |
| + |
| } // namespace |
| // static |
| -RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(int routing_id, |
| - int frame_routing_id) { |
| - DCHECK_NE(routing_id, MSG_ROUTING_NONE); |
| +RenderFrameProxy* RenderFrameProxy::CreateProxyForFrame(int routing_id, |
| + int frame_routing_id) { |
| + CHECK_NE(routing_id, MSG_ROUTING_NONE); |
| + CHECK_NE(frame_routing_id, MSG_ROUTING_NONE); |
| + |
| + LOG(ERROR) << "RFP::CreateProxyForFrame: 2 param version: " |
| + << " routing_id:" << routing_id << ", frame:" << frame_routing_id; |
| + |
| RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); |
| + |
| + RenderFrameImpl* rf = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| + CHECK(rf); |
| + LOG(ERROR) << "RFP::CreateProxyForFrame: rf: " << rf; |
| + proxy->set_render_view(rf->render_view()); |
| + |
| + if (rf->GetWebFrame()->parent() && |
| + rf->GetWebFrame()->parent()->isWebRemoteFrame()) { |
| + proxy->frame_ = |
| + rf->GetWebFrame()->parent()->toWebRemoteFrame()->createRemoteChild( |
| + "", NULL); |
| + } else { |
| + proxy->frame_ = blink::WebRemoteFrame::create(NULL); |
| + } |
| + |
| + std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( |
| + std::make_pair(proxy->frame_, proxy)); |
| + CHECK(result.second) << "Inserting a duplicate item."; |
| + |
| + return proxy; |
| +} |
| + |
| +RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( |
| + int routing_id, |
| + int parent_routing_id, |
| + int render_view_routing_id) { |
| + LOG(ERROR) << "RFP::CreateFrameProxy: " |
| + << routing_id << ":" << parent_routing_id << ":" << render_view_routing_id; |
| + |
| + RenderViewImpl* rv = NULL; |
| + RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, MSG_ROUTING_NONE); |
| + |
| + if (parent_routing_id == MSG_ROUTING_NONE) { |
| + rv = RenderViewImpl::FromRoutingID(render_view_routing_id); |
| + proxy->frame_ = blink::WebRemoteFrame::create(NULL); |
| + LOG(ERROR) << "RFP::CreateFrameProxy: top frame"; |
| + rv->webview()->setMainFrame(proxy->frame_); |
| + } else { |
| + RenderFrameProxy* proxy = RenderFrameProxy::FromRoutingID( |
| + parent_routing_id); |
|
ncarter (slow)
2014/06/25 01:07:57
|proxy| here is shadowing |proxy| up there. Strong
|
| + CHECK(proxy); |
| + LOG(ERROR) << "RFP::CreateFrameProxy: RFP: " << proxy; |
| + blink::WebRemoteFrame* remote_frame = proxy->GetWebFrame(); |
| + proxy->frame_ = remote_frame->createRemoteChild("", NULL); |
| + rv = proxy->render_view(); |
| + } |
| + |
| + std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( |
| + std::make_pair(proxy->frame_, proxy)); |
| + CHECK(result.second) << "Inserting a duplicate item."; |
| + |
| + CHECK(rv); |
| + proxy->set_render_view(rv); |
| + |
| return proxy; |
| } |
| @@ -40,6 +105,14 @@ RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { |
| return it == proxies->end() ? NULL : it->second; |
| } |
| +// static |
| +RenderFrameProxy* RenderFrameProxy::FromWebFrame(blink::WebFrame* web_frame) { |
| + FrameMap::iterator iter = g_frame_map.Get().find(web_frame); |
| + if (iter != g_frame_map.Get().end()) |
| + return iter->second; |
| + return NULL; |
| +} |
| + |
| RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| : routing_id_(routing_id), |
| frame_routing_id_(frame_routing_id) { |
| @@ -48,27 +121,45 @@ RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| CHECK(result.second) << "Inserting a duplicate item."; |
| RenderThread::Get()->AddRoute(routing_id_, this); |
| - render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| - CHECK(render_frame_); |
| - render_frame_->render_view()->RegisterRenderFrameProxy(this); |
| + LOG(ERROR) << "RFP::RFP[" << this << "]:" |
| + << " routing_id:" << routing_id_ << ", for frame:" << frame_routing_id; |
| + |
| + if (frame_routing_id_ != MSG_ROUTING_NONE) { |
| + render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| + CHECK(render_frame_); |
| + render_frame_->render_view()->RegisterRenderFrameProxy(this); |
| + } |
| } |
| RenderFrameProxy::~RenderFrameProxy() { |
| - render_frame_->render_view()->UnregisterRenderFrameProxy(this); |
| + LOG(ERROR) << "RFP::~RFP[" << this << "]:" |
| + << " routing_id:" << routing_id_; |
| + if (render_frame_) |
| + render_frame_->render_view()->UnregisterRenderFrameProxy(this); |
| + |
| + FrameMap::iterator it = g_frame_map.Get().find(frame_); |
| + CHECK(it != g_frame_map.Get().end()); |
| + CHECK_EQ(it->second, this); |
| + g_frame_map.Get().erase(it); |
| + |
| RenderThread::Get()->RemoveRoute(routing_id_); |
| g_routing_id_proxy_map.Get().erase(routing_id_); |
| } |
| -blink::WebFrame* RenderFrameProxy::GetWebFrame() { |
| - return render_frame_->GetWebFrame(); |
| -} |
| - |
| void RenderFrameProxy::DidCommitCompositorFrame() { |
| if (compositing_helper_) |
| compositing_helper_->DidCommitCompositorFrame(); |
| } |
| bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
| + IPC::LogData data; |
| + IPC::GenerateLogData("", msg, &data, true); |
| + |
| + LOG(ERROR) << "RFP[" << this << "]::OnMessageReceived:" |
| + << " msg:" << data.message_name |
| + << " render_frame_:" << render_frame_; |
| + //<< " parent:" << frame_->parent(); |
| + |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) |
| IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
| @@ -79,7 +170,7 @@ bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| - if (!handled) |
| + if (!handled && render_frame_) |
| return render_frame_->OnMessageReceived(msg); |
| return handled; |