Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2963)

Unified Diff: content/renderer/render_frame_proxy.cc

Issue 281663002: Create RenderFrameProxyHost at time of swap-out instead of commit. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Ready for review Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/render_frame_proxy.cc
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
new file mode 100644
index 0000000000000000000000000000000000000000..fba9caf2638a297fae292b50e70357cc41dc7e65
--- /dev/null
+++ b/content/renderer/render_frame_proxy.cc
@@ -0,0 +1,100 @@
+// Copyright 2014 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/renderer/render_frame_proxy.h"
+
+#include <map>
+
+#include "base/lazy_instance.h"
+#include "content/common/frame_messages.h"
+#include "content/common/swapped_out_messages.h"
+#include "content/renderer/render_frame_impl.h"
+#include "content/renderer/render_thread_impl.h"
+#include "content/renderer/render_view_impl.h"
+
+namespace content {
+
+namespace {
+
+typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap;
+static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+// static
+RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(int routing_id,
+ int frame_routing_id) {
+ RenderFrameImpl* rf = RenderFrameImpl::FromRoutingID(frame_routing_id);
+ RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id);
+
+ CHECK(rf);
Charlie Reis 2014/05/15 00:32:50 Not sure I understand why we need this function.
nasko 2014/05/15 18:47:13 The code when through a bunch of iterations, so I
+ proxy->set_render_frame(rf);
+ return proxy;
+}
+
+// static
+RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) {
+ RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer();
+ RoutingIDProxyMap::iterator it = proxies->find(routing_id);
+ return it == proxies->end() ? NULL : it->second;
+}
+
+RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id)
Charlie Reis 2014/05/15 00:32:50 Maybe we should check that routing_id is valid?
nasko 2014/05/15 18:47:13 If it is invalid, what do we do? We can't fail con
Charlie Reis 2014/05/15 22:55:00 A DCHECK would work fine, right? It just seems li
nasko 2014/05/15 23:36:49 Done.
+ : routing_id_(routing_id),
+ frame_routing_id_(frame_routing_id) {
+ std::pair<RoutingIDProxyMap::iterator, bool> result =
+ g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this));
+ CHECK(result.second) << "Inserting a duplicate item.";
+ RenderThread::Get()->AddRoute(routing_id_, this);
+
+ render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id);
+ CHECK(render_frame_);
+}
+
+RenderFrameProxy::~RenderFrameProxy() {
+ RenderThread::Get()->RemoveRoute(routing_id_);
+ g_routing_id_proxy_map.Get().erase(routing_id_);
+}
+
+bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) {
+ bool handled = true;
+ bool msg_is_ok = true;
+ IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameProxy, msg, msg_is_ok)
+ IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP_EX()
+
+ if (!handled)
+ return render_frame_->OnMessageReceived(msg);
+
+ if (!msg_is_ok) {
+ // The message had a handler, but its deserialization failed.
+ // Kill the renderer to avoid potential spoofing attacks.
+ int id = msg.type();
+ CHECK(false) << "Unable to deserialize " << id << " in RenderFrameProxy.";
+ }
+
+ return handled;
+}
+
+bool RenderFrameProxy::Send(IPC::Message* message) {
+ if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) {
+ delete message;
+ return false;
+ }
+ message->set_routing_id(routing_id_);
+ return RenderThread::Get()->Send(message);
+}
+
+void RenderFrameProxy::OnDeleteProxy() {
+ RenderFrameImpl* render_frame =
+ RenderFrameImpl::FromRoutingID(frame_routing_id_);
+ CHECK(render_frame);
+ render_frame->set_render_frame_proxy(NULL);
+
+ delete this;
+}
+
+} // namespace

Powered by Google App Engine
This is Rietveld 408576698