Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |