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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 30323002: [DRAFT] Create RenderFrameHostManager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Misc fixes Created 7 years 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_view_impl.cc » ('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/command_line.h" 10 #include "base/command_line.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698