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

Side by Side Diff: content/renderer/render_frame_impl.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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 using base::Time; 158 using base::Time;
159 using base::TimeDelta; 159 using base::TimeDelta;
160 using webkit_glue::WebURLResponseExtraDataImpl; 160 using webkit_glue::WebURLResponseExtraDataImpl;
161 161
162 namespace content { 162 namespace content {
163 163
164 namespace { 164 namespace {
165 165
166 const size_t kExtraCharsBeforeAndAfterSelection = 100; 166 const size_t kExtraCharsBeforeAndAfterSelection = 100;
167 167
168 typedef std::map<int, RenderFrameImpl*> RoutingIDFrameMap;
169 static base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map =
170 LAZY_INSTANCE_INITIALIZER;
171
168 typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap; 172 typedef std::map<blink::WebFrame*, RenderFrameImpl*> FrameMap;
169 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; 173 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER;
170 174
171 int64 ExtractPostId(const WebHistoryItem& item) { 175 int64 ExtractPostId(const WebHistoryItem& item) {
172 if (item.isNull()) 176 if (item.isNull())
173 return -1; 177 return -1;
174 178
175 if (item.httpBody().isNull()) 179 if (item.httpBody().isNull())
176 return -1; 180 return -1;
177 181
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 int32 routing_id) { 355 int32 routing_id) {
352 DCHECK(routing_id != MSG_ROUTING_NONE); 356 DCHECK(routing_id != MSG_ROUTING_NONE);
353 357
354 if (g_create_render_frame_impl) 358 if (g_create_render_frame_impl)
355 return g_create_render_frame_impl(render_view, routing_id); 359 return g_create_render_frame_impl(render_view, routing_id);
356 else 360 else
357 return new RenderFrameImpl(render_view, routing_id); 361 return new RenderFrameImpl(render_view, routing_id);
358 } 362 }
359 363
360 // static 364 // static
365 RenderFrameImpl* RenderFrameImpl::FromRoutingID(int32 routing_id) {
Charlie Reis 2014/05/15 00:32:50 This code looks fine, but any reason that it diffe
nasko 2014/05/15 18:47:13 Yes, it is identical to the code in RenderViewImpl
366 RoutingIDFrameMap* frames = g_routing_id_frame_map.Pointer();
367 RoutingIDFrameMap::iterator it = frames->find(routing_id);
368 return it == frames->end() ? NULL : it->second;
369 }
370
371 // static
361 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) { 372 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) {
362 return RenderFrameImpl::FromWebFrame(web_frame); 373 return RenderFrameImpl::FromWebFrame(web_frame);
363 } 374 }
364 375
365 RenderFrameImpl* RenderFrameImpl::FromWebFrame(blink::WebFrame* web_frame) { 376 RenderFrameImpl* RenderFrameImpl::FromWebFrame(blink::WebFrame* web_frame) {
366 FrameMap::iterator iter = g_frame_map.Get().find(web_frame); 377 FrameMap::iterator iter = g_frame_map.Get().find(web_frame);
367 if (iter != g_frame_map.Get().end()) 378 if (iter != g_frame_map.Get().end())
368 return iter->second; 379 return iter->second;
369 return NULL; 380 return NULL;
370 } 381 }
371 382
372 // static 383 // static
373 void RenderFrameImpl::InstallCreateHook( 384 void RenderFrameImpl::InstallCreateHook(
374 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 385 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) {
375 CHECK(!g_create_render_frame_impl); 386 CHECK(!g_create_render_frame_impl);
376 g_create_render_frame_impl = create_render_frame_impl; 387 g_create_render_frame_impl = create_render_frame_impl;
377 } 388 }
378 389
379 // RenderFrameImpl ---------------------------------------------------------- 390 // RenderFrameImpl ----------------------------------------------------------
380 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) 391 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id)
381 : frame_(NULL), 392 : frame_(NULL),
382 render_view_(render_view->AsWeakPtr()), 393 render_view_(render_view->AsWeakPtr()),
394 render_frame_proxy_(NULL),
383 routing_id_(routing_id), 395 routing_id_(routing_id),
384 is_swapped_out_(false), 396 is_swapped_out_(false),
385 is_detaching_(false), 397 is_detaching_(false),
386 cookie_jar_(this), 398 cookie_jar_(this),
387 selection_text_offset_(0), 399 selection_text_offset_(0),
388 selection_range_(gfx::Range::InvalidRange()), 400 selection_range_(gfx::Range::InvalidRange()),
389 handling_select_range_(false), 401 handling_select_range_(false),
390 notification_provider_(NULL), 402 notification_provider_(NULL),
391 media_stream_client_(NULL), 403 media_stream_client_(NULL),
392 web_user_media_client_(NULL), 404 web_user_media_client_(NULL),
393 weak_factory_(this) { 405 weak_factory_(this) {
394 RenderThread::Get()->AddRoute(routing_id_, this); 406 RenderThread::Get()->AddRoute(routing_id_, this);
395 407
408 std::pair<RoutingIDFrameMap::iterator, bool> result =
409 g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this));
410 CHECK(result.second) << "Inserting a duplicate item.";
411
396 #if defined(OS_ANDROID) 412 #if defined(OS_ANDROID)
397 new JavaBridgeDispatcher(this); 413 new JavaBridgeDispatcher(this);
398 #endif 414 #endif
399 415
400 #if defined(ENABLE_NOTIFICATIONS) 416 #if defined(ENABLE_NOTIFICATIONS)
401 notification_provider_ = new NotificationProvider(this); 417 notification_provider_ = new NotificationProvider(this);
402 #endif 418 #endif
403 } 419 }
404 420
405 RenderFrameImpl::~RenderFrameImpl() { 421 RenderFrameImpl::~RenderFrameImpl() {
406 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 422 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone());
407 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 423 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct());
424 g_routing_id_frame_map.Get().erase(routing_id_);
408 RenderThread::Get()->RemoveRoute(routing_id_); 425 RenderThread::Get()->RemoveRoute(routing_id_);
409 } 426 }
410 427
411 void RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) { 428 void RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) {
412 DCHECK(!frame_); 429 DCHECK(!frame_);
413 430
414 std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( 431 std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert(
415 std::make_pair(web_frame, this)); 432 std::make_pair(web_frame, this));
416 CHECK(result.second) << "Inserting a duplicate item."; 433 CHECK(result.second) << "Inserting a duplicate item.";
417 434
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 #endif // ENABLE_PLUGINS 634 #endif // ENABLE_PLUGINS
618 635
619 void RenderFrameImpl::SetMediaStreamClientForTesting( 636 void RenderFrameImpl::SetMediaStreamClientForTesting(
620 MediaStreamClient* media_stream_client) { 637 MediaStreamClient* media_stream_client) {
621 DCHECK(!media_stream_client_); 638 DCHECK(!media_stream_client_);
622 DCHECK(!web_user_media_client_); 639 DCHECK(!web_user_media_client_);
623 media_stream_client_ = media_stream_client; 640 media_stream_client_ = media_stream_client;
624 } 641 }
625 642
626 bool RenderFrameImpl::Send(IPC::Message* message) { 643 bool RenderFrameImpl::Send(IPC::Message* message) {
627 if (is_detaching_ || 644 if (is_detaching_) {
628 ((is_swapped_out_ || render_view_->is_swapped_out()) &&
629 !SwappedOutMessages::CanSendWhileSwappedOut(message))) {
630 delete message; 645 delete message;
631 return false; 646 return false;
632 } 647 }
648 if (is_swapped_out_ || render_view_->is_swapped_out()) {
649 if (render_frame_proxy_) {
650 // Some call sites use the associated RenderViewImpl routing id to send
Charlie Reis 2014/05/15 00:32:50 Whew, this is tricky! Maybe start with a sentence
nasko 2014/05/15 18:47:13 Done.
651 // messages, so it shouldn't be overwritten in that case. Additionally,
652 // The SwapOut_ACK message must be delivered to the RenderFrameHost
Charlie Reis 2014/05/15 00:32:50 nit: the
nasko 2014/05/15 18:47:13 Done.
653 // instead of the proxy object and needs to be special-cased here.
654 if (message->routing_id() == routing_id_ &&
655 message->type() != FrameHostMsg_SwapOut_ACK::ID) {
656 return render_frame_proxy_->Send(message);
657 }
658 }
659
660 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) {
Charlie Reis 2014/05/15 00:32:50 I don't think this is right. When CanSendWhileSwa
nasko 2014/05/15 18:47:13 If we ever get to call Send on the RenderFrameProx
661 delete message;
662 return false;
663 }
664 }
633 665
634 return RenderThread::Get()->Send(message); 666 return RenderThread::Get()->Send(message);
635 } 667 }
636 668
637 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 669 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
638 GetContentClient()->SetActiveURL(frame_->document().url()); 670 GetContentClient()->SetActiveURL(frame_->document().url());
639 671
640 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 672 ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
641 RenderFrameObserver* observer; 673 RenderFrameObserver* observer;
642 while ((observer = it.GetNext()) != NULL) { 674 while ((observer = it.GetNext()) != NULL) {
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 CHECK(!frame_->parent()); 916 CHECK(!frame_->parent());
885 917
886 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 918 base::TimeTicks before_unload_start_time = base::TimeTicks::Now();
887 bool proceed = frame_->dispatchBeforeUnloadEvent(); 919 bool proceed = frame_->dispatchBeforeUnloadEvent();
888 base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 920 base::TimeTicks before_unload_end_time = base::TimeTicks::Now();
889 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed, 921 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed,
890 before_unload_start_time, 922 before_unload_start_time,
891 before_unload_end_time)); 923 before_unload_end_time));
892 } 924 }
893 925
894 void RenderFrameImpl::OnSwapOut() { 926 void RenderFrameImpl::OnSwapOut(int proxy_routing_id) {
895 // Only run unload if we're not swapped out yet, but send the ack either way. 927 // Only run unload if we're not swapped out yet, but send the ack either way.
896 if (!is_swapped_out_ || !render_view_->is_swapped_out_) { 928 if (!is_swapped_out_ || !render_view_->is_swapped_out_) {
897 // Swap this RenderFrame out so the frame can navigate to a page rendered by 929 // Swap this RenderFrame out so the frame can navigate to a page rendered by
898 // a different process. This involves running the unload handler and 930 // a different process. This involves running the unload handler and
899 // clearing the page. Once WasSwappedOut is called, we also allow this 931 // clearing the page. Once WasSwappedOut is called, we also allow this
900 // process to exit if there are no other active RenderFrames in it. 932 // process to exit if there are no other active RenderFrames in it.
933 RenderFrameProxy* proxy = RenderFrameProxy::CreateFrameProxy(
Charlie Reis 2014/05/15 00:32:50 I'm unclear on why this is declared up here, rathe
nasko 2014/05/15 18:47:13 I think it should be created prior to running the
934 proxy_routing_id, routing_id_);
901 935
902 // Send an UpdateState message before we get swapped out. 936 // Send an UpdateState message before we get swapped out.
903 render_view_->SyncNavigationState(); 937 render_view_->SyncNavigationState();
904 938
905 // Synchronously run the unload handler before sending the ACK. 939 // Synchronously run the unload handler before sending the ACK.
906 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support 940 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support
907 // unload on subframes as well. 941 // unload on subframes as well.
908 if (!frame_->parent()) 942 if (!frame_->parent())
909 frame_->dispatchUnloadEvent(); 943 frame_->dispatchUnloadEvent();
910 944
911 // Swap out and stop sending any IPC messages that are not ACKs. 945 // Swap out and stop sending any IPC messages that are not ACKs.
912 if (!frame_->parent()) 946 if (!frame_->parent())
913 render_view_->SetSwappedOut(true); 947 render_view_->SetSwappedOut(true);
914 is_swapped_out_ = true; 948 is_swapped_out_ = true;
949 set_render_frame_proxy(proxy);
915 950
916 // Now that we're swapped out and filtering IPC messages, stop loading to 951 // Now that we're swapped out and filtering IPC messages, stop loading to
917 // ensure that no other in-progress navigation continues. We do this here 952 // ensure that no other in-progress navigation continues. We do this here
918 // to avoid sending a DidStopLoading message to the browser process. 953 // to avoid sending a DidStopLoading message to the browser process.
919 // TODO(creis): Should we be stopping all frames here and using 954 // TODO(creis): Should we be stopping all frames here and using
920 // StopAltErrorPageFetcher with RenderView::OnStop, or just stopping this 955 // StopAltErrorPageFetcher with RenderView::OnStop, or just stopping this
921 // frame? 956 // frame?
922 if (!frame_->parent()) 957 if (!frame_->parent())
923 render_view_->OnStop(); 958 render_view_->OnStop();
924 else 959 else
(...skipping 2545 matching lines...) Expand 10 before | Expand all | Expand 10 after
3470 weak_factory_.GetWeakPtr(), 3505 weak_factory_.GetWeakPtr(),
3471 render_view_->media_player_manager_, 3506 render_view_->media_player_manager_,
3472 stream_texture_factory, 3507 stream_texture_factory,
3473 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3508 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(),
3474 new RenderMediaLog()); 3509 new RenderMediaLog());
3475 } 3510 }
3476 3511
3477 #endif 3512 #endif
3478 3513
3479 } // namespace content 3514 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698