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) { | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |