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

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: All comments addressed. 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) {
366 RoutingIDFrameMap::iterator iter =
367 g_routing_id_frame_map.Get().find(routing_id);
368 if (iter != g_routing_id_frame_map.Get().end())
369 return iter->second;
370 return NULL;
371 }
372
373 // static
361 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) { 374 RenderFrame* RenderFrame::FromWebFrame(blink::WebFrame* web_frame) {
362 return RenderFrameImpl::FromWebFrame(web_frame); 375 return RenderFrameImpl::FromWebFrame(web_frame);
363 } 376 }
364 377
365 RenderFrameImpl* RenderFrameImpl::FromWebFrame(blink::WebFrame* web_frame) { 378 RenderFrameImpl* RenderFrameImpl::FromWebFrame(blink::WebFrame* web_frame) {
366 FrameMap::iterator iter = g_frame_map.Get().find(web_frame); 379 FrameMap::iterator iter = g_frame_map.Get().find(web_frame);
367 if (iter != g_frame_map.Get().end()) 380 if (iter != g_frame_map.Get().end())
368 return iter->second; 381 return iter->second;
369 return NULL; 382 return NULL;
370 } 383 }
371 384
372 // static 385 // static
373 void RenderFrameImpl::InstallCreateHook( 386 void RenderFrameImpl::InstallCreateHook(
374 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 387 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) {
375 CHECK(!g_create_render_frame_impl); 388 CHECK(!g_create_render_frame_impl);
376 g_create_render_frame_impl = create_render_frame_impl; 389 g_create_render_frame_impl = create_render_frame_impl;
377 } 390 }
378 391
379 // RenderFrameImpl ---------------------------------------------------------- 392 // RenderFrameImpl ----------------------------------------------------------
380 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) 393 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id)
381 : frame_(NULL), 394 : frame_(NULL),
382 render_view_(render_view->AsWeakPtr()), 395 render_view_(render_view->AsWeakPtr()),
383 routing_id_(routing_id), 396 routing_id_(routing_id),
384 is_swapped_out_(false), 397 is_swapped_out_(false),
398 render_frame_proxy_(NULL),
385 is_detaching_(false), 399 is_detaching_(false),
386 cookie_jar_(this), 400 cookie_jar_(this),
387 selection_text_offset_(0), 401 selection_text_offset_(0),
388 selection_range_(gfx::Range::InvalidRange()), 402 selection_range_(gfx::Range::InvalidRange()),
389 handling_select_range_(false), 403 handling_select_range_(false),
390 notification_provider_(NULL), 404 notification_provider_(NULL),
391 media_stream_client_(NULL), 405 media_stream_client_(NULL),
392 web_user_media_client_(NULL), 406 web_user_media_client_(NULL),
393 weak_factory_(this) { 407 weak_factory_(this) {
394 RenderThread::Get()->AddRoute(routing_id_, this); 408 RenderThread::Get()->AddRoute(routing_id_, this);
395 409
410 std::pair<RoutingIDFrameMap::iterator, bool> result =
411 g_routing_id_frame_map.Get().insert(std::make_pair(routing_id_, this));
412 CHECK(result.second) << "Inserting a duplicate item.";
413
396 #if defined(OS_ANDROID) 414 #if defined(OS_ANDROID)
397 new JavaBridgeDispatcher(this); 415 new JavaBridgeDispatcher(this);
398 #endif 416 #endif
399 417
400 #if defined(ENABLE_NOTIFICATIONS) 418 #if defined(ENABLE_NOTIFICATIONS)
401 notification_provider_ = new NotificationProvider(this); 419 notification_provider_ = new NotificationProvider(this);
402 #endif 420 #endif
403 } 421 }
404 422
405 RenderFrameImpl::~RenderFrameImpl() { 423 RenderFrameImpl::~RenderFrameImpl() {
406 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 424 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone());
407 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 425 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct());
426 g_routing_id_frame_map.Get().erase(routing_id_);
408 RenderThread::Get()->RemoveRoute(routing_id_); 427 RenderThread::Get()->RemoveRoute(routing_id_);
409 } 428 }
410 429
411 void RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) { 430 void RenderFrameImpl::SetWebFrame(blink::WebLocalFrame* web_frame) {
412 DCHECK(!frame_); 431 DCHECK(!frame_);
413 432
414 std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert( 433 std::pair<FrameMap::iterator, bool> result = g_frame_map.Get().insert(
415 std::make_pair(web_frame, this)); 434 std::make_pair(web_frame, this));
416 CHECK(result.second) << "Inserting a duplicate item."; 435 CHECK(result.second) << "Inserting a duplicate item.";
417 436
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 635
617 #endif // ENABLE_PLUGINS 636 #endif // ENABLE_PLUGINS
618 637
619 void RenderFrameImpl::SetMediaStreamClientForTesting( 638 void RenderFrameImpl::SetMediaStreamClientForTesting(
620 MediaStreamClient* media_stream_client) { 639 MediaStreamClient* media_stream_client) {
621 DCHECK(!media_stream_client_); 640 DCHECK(!media_stream_client_);
622 DCHECK(!web_user_media_client_); 641 DCHECK(!web_user_media_client_);
623 media_stream_client_ = media_stream_client; 642 media_stream_client_ = media_stream_client;
624 } 643 }
625 644
626 bool RenderFrameImpl::Send(IPC::Message* message) { 645 bool RenderFrameImpl::Send(IPC::Message* message) {
Charlie Reis 2014/05/15 22:55:00 Thanks-- the changes here are much nicer.
nasko 2014/05/15 23:36:49 Done.
627 if (is_detaching_ || 646 if (is_detaching_) {
628 ((is_swapped_out_ || render_view_->is_swapped_out()) &&
629 !SwappedOutMessages::CanSendWhileSwappedOut(message))) {
630 delete message; 647 delete message;
631 return false; 648 return false;
632 } 649 }
650 if (is_swapped_out_ || render_view_->is_swapped_out()) {
651 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) {
652 delete message;
653 return false;
654 }
655 // In most cases, send IPCs through the proxy when swapped out. In some
656 // calls the associated RenderViewImpl routing id is used to send
657 // messages, so don't use the proxy.
658 if (render_frame_proxy_ && message->routing_id() == routing_id_) {
659 return render_frame_proxy_->Send(message);
Charlie Reis 2014/05/15 22:55:00 nit: Wrong indent and no braces needed.
nasko 2014/05/15 23:36:49 Done.
660 }
661 }
633 662
634 return RenderThread::Get()->Send(message); 663 return RenderThread::Get()->Send(message);
635 } 664 }
636 665
637 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 666 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
638 GetContentClient()->SetActiveURL(frame_->document().url()); 667 GetContentClient()->SetActiveURL(frame_->document().url());
639 668
640 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 669 ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
641 RenderFrameObserver* observer; 670 RenderFrameObserver* observer;
642 while ((observer = it.GetNext()) != NULL) { 671 while ((observer = it.GetNext()) != NULL) {
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 CHECK(!frame_->parent()); 913 CHECK(!frame_->parent());
885 914
886 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 915 base::TimeTicks before_unload_start_time = base::TimeTicks::Now();
887 bool proceed = frame_->dispatchBeforeUnloadEvent(); 916 bool proceed = frame_->dispatchBeforeUnloadEvent();
888 base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 917 base::TimeTicks before_unload_end_time = base::TimeTicks::Now();
889 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed, 918 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed,
890 before_unload_start_time, 919 before_unload_start_time,
891 before_unload_end_time)); 920 before_unload_end_time));
892 } 921 }
893 922
894 void RenderFrameImpl::OnSwapOut() { 923 void RenderFrameImpl::OnSwapOut(int proxy_routing_id) {
924 RenderFrameProxy* proxy = NULL;
925
895 // Only run unload if we're not swapped out yet, but send the ack either way. 926 // 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_) { 927 if (!is_swapped_out_ || !render_view_->is_swapped_out_) {
897 // Swap this RenderFrame out so the frame can navigate to a page rendered by 928 // 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 929 // a different process. This involves running the unload handler and
899 // clearing the page. Once WasSwappedOut is called, we also allow this 930 // clearing the page. Once WasSwappedOut is called, we also allow this
900 // process to exit if there are no other active RenderFrames in it. 931 // process to exit if there are no other active RenderFrames in it.
901 932
902 // Send an UpdateState message before we get swapped out. 933 // Send an UpdateState message before we get swapped out. Create the
934 // RenderFrameProxy as well so its routing id is registered for receiving
935 // IPC messages.
903 render_view_->SyncNavigationState(); 936 render_view_->SyncNavigationState();
937 proxy = RenderFrameProxy::CreateFrameProxy(proxy_routing_id, routing_id_);
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);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 blink::WebPageVisibilityStateHidden, false); 980 blink::WebPageVisibilityStateHidden, false);
947 } 981 }
948 } 982 }
949 983
950 // It is now safe to show modal dialogs again. 984 // It is now safe to show modal dialogs again.
951 // TODO(creis): Deal with modal dialogs from subframes. 985 // TODO(creis): Deal with modal dialogs from subframes.
952 if (!frame_->parent()) 986 if (!frame_->parent())
953 render_view_->suppress_dialogs_until_swap_out_ = false; 987 render_view_->suppress_dialogs_until_swap_out_ = false;
954 988
955 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); 989 Send(new FrameHostMsg_SwapOut_ACK(routing_id_));
990
991 // Now that all of the cleanup is complete and the browser side is notified,
992 // start using the RenderFrameProxy, if one is created.
993 if (proxy)
994 set_render_frame_proxy(proxy);
956 } 995 }
957 996
958 void RenderFrameImpl::OnBuffersSwapped( 997 void RenderFrameImpl::OnBuffersSwapped(
959 const FrameMsg_BuffersSwapped_Params& params) { 998 const FrameMsg_BuffersSwapped_Params& params) {
960 if (!compositing_helper_.get()) { 999 if (!compositing_helper_.get()) {
961 compositing_helper_ = 1000 compositing_helper_ =
962 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( 1001 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame(
963 frame_, this, routing_id_); 1002 frame_, this, routing_id_);
964 compositing_helper_->EnableCompositing(true); 1003 compositing_helper_->EnableCompositing(true);
965 } 1004 }
(...skipping 2504 matching lines...) Expand 10 before | Expand all | Expand 10 after
3470 weak_factory_.GetWeakPtr(), 3509 weak_factory_.GetWeakPtr(),
3471 render_view_->media_player_manager_, 3510 render_view_->media_player_manager_,
3472 stream_texture_factory, 3511 stream_texture_factory,
3473 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3512 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(),
3474 new RenderMediaLog()); 3513 new RenderMediaLog());
3475 } 3514 }
3476 3515
3477 #endif 3516 #endif
3478 3517
3479 } // namespace content 3518 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698