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/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, | 107 RenderFrameImpl* RenderFrameImpl::Create(RenderViewImpl* render_view, |
108 int32 routing_id) { | 108 int32 routing_id) { |
109 DCHECK(routing_id != MSG_ROUTING_NONE); | 109 DCHECK(routing_id != MSG_ROUTING_NONE); |
110 | 110 |
111 if (g_create_render_frame_impl) | 111 if (g_create_render_frame_impl) |
112 return g_create_render_frame_impl(render_view, routing_id); | 112 return g_create_render_frame_impl(render_view, routing_id); |
113 else | 113 else |
114 return new RenderFrameImpl(render_view, routing_id); | 114 return new RenderFrameImpl(render_view, routing_id); |
115 } | 115 } |
116 | 116 |
| 117 RenderFrameImpl* RenderFrameImpl::FindByWebFrame(blink::WebFrame* web_frame) { |
| 118 return g_child_frame_map.Get().find(web_frame)->second; |
| 119 } |
| 120 |
117 // static | 121 // static |
118 void RenderFrameImpl::InstallCreateHook( | 122 void RenderFrameImpl::InstallCreateHook( |
119 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { | 123 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { |
120 CHECK(!g_create_render_frame_impl); | 124 CHECK(!g_create_render_frame_impl); |
121 g_create_render_frame_impl = create_render_frame_impl; | 125 g_create_render_frame_impl = create_render_frame_impl; |
122 } | 126 } |
123 | 127 |
124 // RenderFrameImpl ---------------------------------------------------------- | 128 // RenderFrameImpl ---------------------------------------------------------- |
125 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) | 129 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) |
126 : render_view_(render_view), | 130 : frame_(NULL), |
| 131 render_view_(render_view), |
127 routing_id_(routing_id), | 132 routing_id_(routing_id), |
128 is_swapped_out_(false), | 133 is_swapped_out_(false), |
129 is_detaching_(false) { | 134 is_detaching_(false) { |
130 RenderThread::Get()->AddRoute(routing_id_, this); | 135 RenderThread::Get()->AddRoute(routing_id_, this); |
131 #if defined(ENABLE_PLUGINS) | 136 #if defined(ENABLE_PLUGINS) |
132 new PepperBrowserConnection(this); | 137 new PepperBrowserConnection(this); |
133 #endif | 138 #endif |
134 new SharedWorkerRepository(this); | 139 new SharedWorkerRepository(this); |
135 | 140 |
136 GetContentClient()->renderer()->RenderFrameCreated(this); | 141 GetContentClient()->renderer()->RenderFrameCreated(this); |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 } | 459 } |
455 | 460 |
456 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { | 461 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { |
457 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); | 462 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); |
458 RenderFrameObserver* observer; | 463 RenderFrameObserver* observer; |
459 while ((observer = it.GetNext()) != NULL) { | 464 while ((observer = it.GetNext()) != NULL) { |
460 if (observer->OnMessageReceived(msg)) | 465 if (observer->OnMessageReceived(msg)) |
461 return true; | 466 return true; |
462 } | 467 } |
463 | 468 |
464 // TODO(ajwong): Fill in with message handlers as various components | 469 bool handled = true; |
465 // are migrated over to understand frames. | 470 bool msg_is_ok = true; |
466 return false; | 471 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameImpl, msg, msg_is_ok) |
| 472 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut) |
| 473 |
| 474 IPC_END_MESSAGE_MAP() |
| 475 |
| 476 if (!msg_is_ok) { |
| 477 // The message had a handler, but its deserialization failed. |
| 478 // Kill the renderer to avoid potential spoofing attacks. |
| 479 CHECK(false) << "Unable to deserialize message in RenderFrameImpl."; |
| 480 } |
| 481 |
| 482 return handled; |
| 483 } |
| 484 |
| 485 void RenderFrameImpl::OnSwapOut() { |
| 486 // Only run unload if we're not swapped out yet, but send the ack either way. |
| 487 if (!is_swapped_out_) { |
| 488 // Swap this RenderView out so the tab can navigate to a page rendered by a |
| 489 // different process. This involves running the unload handler and clearing |
| 490 // the page. Once WasSwappedOut is called, we also allow this process to |
| 491 // exit if there are no other active RenderViews in it. |
| 492 |
| 493 // Send an UpdateState message before we get swapped out. |
| 494 render_view_->SyncNavigationState(); |
| 495 |
| 496 // Synchronously run the unload handler before sending the ACK. |
| 497 // TODO(creis): Add a WebFrame::dispatchUnloadEvent. |
| 498 //webview()->dispatchUnloadEvent(); |
| 499 |
| 500 // Swap out and stop sending any IPC messages that are not ACKs. |
| 501 is_swapped_out_ = true; |
| 502 |
| 503 // Now that we're swapped out and filtering IPC messages, stop loading to |
| 504 // ensure that no other in-progress navigation continues. We do this here |
| 505 // to avoid sending a DidStopLoading message to the browser process. |
| 506 frame_->stopLoading(); |
| 507 |
| 508 // Replace the page with a blank dummy URL. The unload handler will not be |
| 509 // run a second time, thanks to a check in FrameLoader::stopLoading. |
| 510 // TODO(creis): Need to add a better way to do this that avoids running the |
| 511 // beforeunload handler. For now, we just run it a second time silently. |
| 512 render_view_->NavigateToSwappedOutURL(frame_); |
| 513 } |
| 514 |
| 515 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); |
467 } | 516 } |
468 | 517 |
469 RenderView* RenderFrameImpl::GetRenderView() { | 518 RenderView* RenderFrameImpl::GetRenderView() { |
470 return render_view_; | 519 return render_view_; |
471 } | 520 } |
472 | 521 |
473 int RenderFrameImpl::GetRoutingID() { | 522 int RenderFrameImpl::GetRoutingID() { |
474 return routing_id_; | 523 return routing_id_; |
475 } | 524 } |
476 | 525 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 | 647 |
599 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { | 648 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { |
600 render_view_->didAccessInitialDocument(frame); | 649 render_view_->didAccessInitialDocument(frame); |
601 } | 650 } |
602 | 651 |
603 blink::WebFrame* RenderFrameImpl::createChildFrame( | 652 blink::WebFrame* RenderFrameImpl::createChildFrame( |
604 blink::WebFrame* parent, | 653 blink::WebFrame* parent, |
605 const blink::WebString& name) { | 654 const blink::WebString& name) { |
606 RenderFrameImpl* child_render_frame = this; | 655 RenderFrameImpl* child_render_frame = this; |
607 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); | 656 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); |
608 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 657 // Synchronously notify the browser of a child frame creation to get the |
609 // Synchronously notify the browser of a child frame creation to get the | 658 // routing_id for the RenderFrame. |
610 // routing_id for the RenderFrame. | 659 int routing_id; |
611 int routing_id; | 660 Send(new FrameHostMsg_CreateChildFrame(routing_id_, |
612 Send(new FrameHostMsg_CreateChildFrame(routing_id_, | 661 parent->identifier(), |
613 parent->identifier(), | 662 child_frame_identifier, |
614 child_frame_identifier, | 663 UTF16ToUTF8(name), |
615 UTF16ToUTF8(name), | 664 &routing_id)); |
616 &routing_id)); | 665 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); |
617 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); | |
618 } | |
619 | 666 |
620 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, | 667 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, |
621 child_frame_identifier); | 668 child_frame_identifier); |
| 669 child_render_frame->set_web_frame(web_frame); |
622 | 670 |
623 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 671 g_child_frame_map.Get().insert( |
624 g_child_frame_map.Get().insert( | 672 std::make_pair(web_frame, child_render_frame)); |
625 std::make_pair(web_frame, child_render_frame)); | 673 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
626 } else { | 674 WebFrameCreated(web_frame)); |
627 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | |
628 WebFrameCreated(web_frame)); | |
629 } | |
630 | 675 |
631 return web_frame; | 676 return web_frame; |
632 } | 677 } |
633 | 678 |
634 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { | 679 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { |
635 render_view_->didDisownOpener(frame); | 680 render_view_->didDisownOpener(frame); |
636 } | 681 } |
637 | 682 |
638 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { | 683 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { |
639 // NOTE: This function is called on the frame that is being detached and not | 684 // NOTE: This function is called on the frame that is being detached and not |
640 // the parent frame. This is different from createChildFrame() which is | 685 // the parent frame. This is different from createChildFrame() which is |
641 // called on the parent frame. | 686 // called on the parent frame. |
642 CHECK(!is_detaching_); | 687 CHECK(!is_detaching_); |
643 | 688 |
644 int64 parent_frame_id = -1; | 689 int64 parent_frame_id = -1; |
645 if (frame->parent()) | 690 if (frame->parent()) |
646 parent_frame_id = frame->parent()->identifier(); | 691 parent_frame_id = frame->parent()->identifier(); |
647 | 692 |
648 Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, | 693 Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, |
649 frame->identifier())); | 694 frame->identifier())); |
650 | 695 |
651 // Currently multiple WebCore::Frames can send frameDetached to a single | 696 // Currently multiple WebCore::Frames can send frameDetached to a single |
652 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served | 697 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served |
653 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also | 698 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also |
654 // prevents this class from entering the |is_detaching_| state because | 699 // prevents this class from entering the |is_detaching_| state because |
655 // even though one WebCore::Frame may have detached itself, others will | 700 // even though one WebCore::Frame may have detached itself, others will |
656 // still need to use this object. | 701 // still need to use this object. |
657 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 702 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be |
658 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be | 703 // sent before setting |is_detaching_| to true. In contrast, Observers |
659 // sent before setting |is_detaching_| to true. In contrast, Observers | 704 // should only be notified afterwards so they cannot call back into and |
660 // should only be notified afterwards so they cannot call back into and | 705 // have IPCs fired off. |
661 // have IPCs fired off. | 706 is_detaching_ = true; |
662 is_detaching_ = true; | |
663 } | |
664 | 707 |
665 // Call back to RenderViewImpl for observers to be notified. | 708 // Call back to RenderViewImpl for observers to be notified. |
666 // TODO(nasko): Remove once we have RenderFrameObserver. | 709 // TODO(nasko): Remove once we have RenderFrameObserver. |
667 render_view_->frameDetached(frame); | 710 render_view_->frameDetached(frame); |
668 | 711 |
669 frame->close(); | 712 frame->close(); |
670 | 713 |
671 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 714 // If the frame does not have a parent, it is the main frame. The main |
672 // If the frame does not have a parent, it is the main frame. The main | 715 // frame is owned by the containing RenderViewHost so it does not require |
673 // frame is owned by the containing RenderViewHost so it does not require | 716 // any cleanup here. |
674 // any cleanup here. | 717 if (frame->parent()) { |
675 if (frame->parent()) { | 718 FrameMap::iterator it = g_child_frame_map.Get().find(frame); |
676 FrameMap::iterator it = g_child_frame_map.Get().find(frame); | 719 DCHECK(it != g_child_frame_map.Get().end()); |
677 DCHECK(it != g_child_frame_map.Get().end()); | 720 DCHECK_EQ(it->second, this); |
678 DCHECK_EQ(it->second, this); | 721 g_child_frame_map.Get().erase(it); |
679 g_child_frame_map.Get().erase(it); | 722 delete this; |
680 delete this; | 723 // Object is invalid after this point. |
681 // Object is invalid after this point. | |
682 } | |
683 } | 724 } |
684 } | 725 } |
685 | 726 |
686 void RenderFrameImpl::willClose(blink::WebFrame* frame) { | 727 void RenderFrameImpl::willClose(blink::WebFrame* frame) { |
687 // Call back to RenderViewImpl for observers to be notified. | 728 // Call back to RenderViewImpl for observers to be notified. |
688 // TODO(nasko): Remove once we have RenderFrameObserver. | 729 // TODO(nasko): Remove once we have RenderFrameObserver. |
689 render_view_->willClose(frame); | 730 render_view_->willClose(frame); |
690 } | 731 } |
691 | 732 |
692 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, | 733 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 | 839 |
799 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 840 // In fast/loader/stop-provisional-loads.html, we abort the load before this |
800 // callback is invoked. | 841 // callback is invoked. |
801 if (!ds) | 842 if (!ds) |
802 return; | 843 return; |
803 | 844 |
804 DocumentState* document_state = DocumentState::FromDataSource(ds); | 845 DocumentState* document_state = DocumentState::FromDataSource(ds); |
805 | 846 |
806 // We should only navigate to swappedout:// when is_swapped_out_ is true. | 847 // We should only navigate to swappedout:// when is_swapped_out_ is true. |
807 CHECK((ds->request().url() != GURL(kSwappedOutURL)) || | 848 CHECK((ds->request().url() != GURL(kSwappedOutURL)) || |
| 849 is_swapped_out_ || |
808 render_view_->is_swapped_out()) << | 850 render_view_->is_swapped_out()) << |
809 "Heard swappedout:// when not swapped out."; | 851 "Heard swappedout:// when not swapped out."; |
810 | 852 |
811 // Update the request time if WebKit has better knowledge of it. | 853 // Update the request time if WebKit has better knowledge of it. |
812 if (document_state->request_time().is_null()) { | 854 if (document_state->request_time().is_null()) { |
813 double event_time = ds->triggeringEventTime(); | 855 double event_time = ds->triggeringEventTime(); |
814 if (event_time != 0.0) | 856 if (event_time != 0.0) |
815 document_state->set_request_time(Time::FromDoubleT(event_time)); | 857 document_state->set_request_time(Time::FromDoubleT(event_time)); |
816 } | 858 } |
817 | 859 |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { | 1417 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { |
1376 observers_.AddObserver(observer); | 1418 observers_.AddObserver(observer); |
1377 } | 1419 } |
1378 | 1420 |
1379 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { | 1421 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { |
1380 observer->RenderFrameGone(); | 1422 observer->RenderFrameGone(); |
1381 observers_.RemoveObserver(observer); | 1423 observers_.RemoveObserver(observer); |
1382 } | 1424 } |
1383 | 1425 |
1384 } // namespace content | 1426 } // namespace content |
OLD | NEW |