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

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: Fix IPC_BEGIN_MESSAGE_MAP macro, as _EX version doesn't exist anymore. 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
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_frame_proxy.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 CHECK(!frame_->parent()); 904 CHECK(!frame_->parent());
877 905
878 base::TimeTicks before_unload_start_time = base::TimeTicks::Now(); 906 base::TimeTicks before_unload_start_time = base::TimeTicks::Now();
879 bool proceed = frame_->dispatchBeforeUnloadEvent(); 907 bool proceed = frame_->dispatchBeforeUnloadEvent();
880 base::TimeTicks before_unload_end_time = base::TimeTicks::Now(); 908 base::TimeTicks before_unload_end_time = base::TimeTicks::Now();
881 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed, 909 Send(new FrameHostMsg_BeforeUnload_ACK(routing_id_, proceed,
882 before_unload_start_time, 910 before_unload_start_time,
883 before_unload_end_time)); 911 before_unload_end_time));
884 } 912 }
885 913
886 void RenderFrameImpl::OnSwapOut() { 914 void RenderFrameImpl::OnSwapOut(int proxy_routing_id) {
915 RenderFrameProxy* proxy = NULL;
916
887 // Only run unload if we're not swapped out yet, but send the ack either way. 917 // Only run unload if we're not swapped out yet, but send the ack either way.
888 if (!is_swapped_out_ || !render_view_->is_swapped_out_) { 918 if (!is_swapped_out_ || !render_view_->is_swapped_out_) {
889 // Swap this RenderFrame out so the frame can navigate to a page rendered by 919 // Swap this RenderFrame out so the frame can navigate to a page rendered by
890 // a different process. This involves running the unload handler and 920 // a different process. This involves running the unload handler and
891 // clearing the page. Once WasSwappedOut is called, we also allow this 921 // clearing the page. Once WasSwappedOut is called, we also allow this
892 // process to exit if there are no other active RenderFrames in it. 922 // process to exit if there are no other active RenderFrames in it.
893 923
894 // Send an UpdateState message before we get swapped out. 924 // Send an UpdateState message before we get swapped out. Create the
925 // RenderFrameProxy as well so its routing id is registered for receiving
926 // IPC messages.
895 render_view_->SyncNavigationState(); 927 render_view_->SyncNavigationState();
928 proxy = RenderFrameProxy::CreateFrameProxy(proxy_routing_id, routing_id_);
896 929
897 // Synchronously run the unload handler before sending the ACK. 930 // Synchronously run the unload handler before sending the ACK.
898 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support 931 // TODO(creis): Call dispatchUnloadEvent unconditionally here to support
899 // unload on subframes as well. 932 // unload on subframes as well.
900 if (!frame_->parent()) 933 if (!frame_->parent())
901 frame_->dispatchUnloadEvent(); 934 frame_->dispatchUnloadEvent();
902 935
903 // Swap out and stop sending any IPC messages that are not ACKs. 936 // Swap out and stop sending any IPC messages that are not ACKs.
904 if (!frame_->parent()) 937 if (!frame_->parent())
905 render_view_->SetSwappedOut(true); 938 render_view_->SetSwappedOut(true);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 blink::WebPageVisibilityStateHidden, false); 971 blink::WebPageVisibilityStateHidden, false);
939 } 972 }
940 } 973 }
941 974
942 // It is now safe to show modal dialogs again. 975 // It is now safe to show modal dialogs again.
943 // TODO(creis): Deal with modal dialogs from subframes. 976 // TODO(creis): Deal with modal dialogs from subframes.
944 if (!frame_->parent()) 977 if (!frame_->parent())
945 render_view_->suppress_dialogs_until_swap_out_ = false; 978 render_view_->suppress_dialogs_until_swap_out_ = false;
946 979
947 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); 980 Send(new FrameHostMsg_SwapOut_ACK(routing_id_));
981
982 // Now that all of the cleanup is complete and the browser side is notified,
983 // start using the RenderFrameProxy, if one is created.
984 if (proxy)
985 set_render_frame_proxy(proxy);
948 } 986 }
949 987
950 void RenderFrameImpl::OnBuffersSwapped( 988 void RenderFrameImpl::OnBuffersSwapped(
951 const FrameMsg_BuffersSwapped_Params& params) { 989 const FrameMsg_BuffersSwapped_Params& params) {
952 if (!compositing_helper_.get()) { 990 if (!compositing_helper_.get()) {
953 compositing_helper_ = 991 compositing_helper_ =
954 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( 992 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame(
955 frame_, this, routing_id_); 993 frame_, this, routing_id_);
956 compositing_helper_->EnableCompositing(true); 994 compositing_helper_->EnableCompositing(true);
957 } 995 }
(...skipping 2505 matching lines...) Expand 10 before | Expand all | Expand 10 after
3463 weak_factory_.GetWeakPtr(), 3501 weak_factory_.GetWeakPtr(),
3464 render_view_->media_player_manager_, 3502 render_view_->media_player_manager_,
3465 stream_texture_factory, 3503 stream_texture_factory,
3466 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(), 3504 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(),
3467 new RenderMediaLog()); 3505 new RenderMediaLog());
3468 } 3506 }
3469 3507
3470 #endif 3508 #endif
3471 3509
3472 } // namespace content 3510 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_frame_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698