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

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: s/render_view_host/GetRenderViewHost/ 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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
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) {
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);
660 }
633 661
634 return RenderThread::Get()->Send(message); 662 return RenderThread::Get()->Send(message);
635 } 663 }
636 664
637 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 665 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
638 GetContentClient()->SetActiveURL(frame_->document().url()); 666 GetContentClient()->SetActiveURL(frame_->document().url());
639 667
640 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 668 ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
641 RenderFrameObserver* observer; 669 RenderFrameObserver* observer;
642 while ((observer = it.GetNext()) != NULL) { 670 while ((observer = it.GetNext()) != NULL) {
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 CHECK(!frame_->parent()); 912 CHECK(!frame_->parent());
885 913
886 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 914 base::TimeTicks before_unload_start_time = base::TimeTicks::Now();
887 bool proceed = frame_->dispatchBeforeUnloadEvent(); 915 bool proceed = frame_->dispatchBeforeUnloadEvent();
888 base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 916 base::TimeTicks before_unload_end_time = base::TimeTicks::Now();
889 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed, 917 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed,
890 before_unload_start_time, 918 before_unload_start_time,
891 before_unload_end_time)); 919 before_unload_end_time));
892 } 920 }
893 921
894 void RenderFrameImpl::OnSwapOut() { 922 void RenderFrameImpl::OnSwapOut(int proxy_routing_id) {
923 RenderFrameProxy* proxy = NULL;
924
895 // Only run unload if we're not swapped out yet, but send the ack either way. 925 // 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_) { 926 if (!is_swapped_out_ || !render_view_->is_swapped_out_) {
897 // Swap this RenderFrame out so the frame can navigate to a page rendered by 927 // 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 928 // a different process. This involves running the unload handler and
899 // clearing the page. Once WasSwappedOut is called, we also allow this 929 // clearing the page. Once WasSwappedOut is called, we also allow this
900 // process to exit if there are no other active RenderFrames in it. 930 // process to exit if there are no other active RenderFrames in it.
901 931
902 // Send an UpdateState message before we get swapped out. 932 // Send an UpdateState message before we get swapped out. Create the
933 // RenderFrameProxy as well so its routing id is registered for receiving
934 // IPC messages.
903 render_view_->SyncNavigationState(); 935 render_view_->SyncNavigationState();
936 proxy = RenderFrameProxy::CreateFrameProxy(proxy_routing_id, routing_id_);
904 937
905 // Synchronously run the unload handler before sending the ACK. 938 // Synchronously run the unload handler before sending the ACK.
906 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support 939 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support
907 // unload on subframes as well. 940 // unload on subframes as well.
908 if (!frame_->parent()) 941 if (!frame_->parent())
909 frame_->dispatchUnloadEvent(); 942 frame_->dispatchUnloadEvent();
910 943
911 // Swap out and stop sending any IPC messages that are not ACKs. 944 // Swap out and stop sending any IPC messages that are not ACKs.
912 if (!frame_->parent()) 945 if (!frame_->parent())
913 render_view_->SetSwappedOut(true); 946 render_view_->SetSwappedOut(true);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 blink::WebPageVisibilityStateHidden, false); 979 blink::WebPageVisibilityStateHidden, false);
947 } 980 }
948 } 981 }
949 982
950 // It is now safe to show modal dialogs again. 983 // It is now safe to show modal dialogs again.
951 // TODO(creis): Deal with modal dialogs from subframes. 984 // TODO(creis): Deal with modal dialogs from subframes.
952 if (!frame_->parent()) 985 if (!frame_->parent())
953 render_view_->suppress_dialogs_until_swap_out_ = false; 986 render_view_->suppress_dialogs_until_swap_out_ = false;
954 987
955 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); 988 Send(new FrameHostMsg_SwapOut_ACK(routing_id_));
989
990 // Now that all of the cleanup is complete and the browser side is notified,
991 // start using the RenderFrameProxy, if one is created.
992 if (proxy)
993 set_render_frame_proxy(proxy);
956 } 994 }
957 995
958 void RenderFrameImpl::OnBuffersSwapped( 996 void RenderFrameImpl::OnBuffersSwapped(
959 const FrameMsg_BuffersSwapped_Params& params) { 997 const FrameMsg_BuffersSwapped_Params& params) {
960 if (!compositing_helper_.get()) { 998 if (!compositing_helper_.get()) {
961 compositing_helper_ = 999 compositing_helper_ =
962 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( 1000 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame(
963 frame_, this, routing_id_); 1001 frame_, this, routing_id_);
964 compositing_helper_->EnableCompositing(true); 1002 compositing_helper_->EnableCompositing(true);
965 } 1003 }
(...skipping 2504 matching lines...) Expand 10 before | Expand all | Expand 10 after
3470 weak_factory_.GetWeakPtr(), 3508 weak_factory_.GetWeakPtr(),
3471 render_view_->media_player_manager_, 3509 render_view_->media_player_manager_,
3472 stream_texture_factory, 3510 stream_texture_factory,
3473 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3511 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(),
3474 new RenderMediaLog()); 3512 new RenderMediaLog());
3475 } 3513 }
3476 3514
3477 #endif 3515 #endif
3478 3516
3479 } // namespace content 3517 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698