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

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

Issue 109653014: Allow RenderFrames to swap out for subframe navigations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor cleanup. 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
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 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
119 FrameMap::iterator iter = g_child_frame_map.Get().find(web_frame);
120 if (iter != g_child_frame_map.Get().end())
121 return iter->second;
122 }
123
124 return NULL;
125 }
126
117 // static 127 // static
118 void RenderFrameImpl::InstallCreateHook( 128 void RenderFrameImpl::InstallCreateHook(
119 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { 129 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) {
120 CHECK(!g_create_render_frame_impl); 130 CHECK(!g_create_render_frame_impl);
121 g_create_render_frame_impl = create_render_frame_impl; 131 g_create_render_frame_impl = create_render_frame_impl;
122 } 132 }
123 133
124 // RenderFrameImpl ---------------------------------------------------------- 134 // RenderFrameImpl ----------------------------------------------------------
125 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) 135 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id)
126 : render_view_(render_view), 136 : frame_(NULL),
137 render_view_(render_view),
127 routing_id_(routing_id), 138 routing_id_(routing_id),
128 is_swapped_out_(false), 139 is_swapped_out_(false),
129 is_detaching_(false) { 140 is_detaching_(false) {
130 RenderThread::Get()->AddRoute(routing_id_, this); 141 RenderThread::Get()->AddRoute(routing_id_, this);
131 #if defined(ENABLE_PLUGINS) 142 #if defined(ENABLE_PLUGINS)
132 new PepperBrowserConnection(this); 143 new PepperBrowserConnection(this);
133 #endif 144 #endif
134 new SharedWorkerRepository(this); 145 new SharedWorkerRepository(this);
135 146
136 GetContentClient()->renderer()->RenderFrameCreated(this); 147 GetContentClient()->renderer()->RenderFrameCreated(this);
137 } 148 }
138 149
139 RenderFrameImpl::~RenderFrameImpl() { 150 RenderFrameImpl::~RenderFrameImpl() {
140 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 151 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone());
141 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 152 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct());
142 RenderThread::Get()->RemoveRoute(routing_id_); 153 RenderThread::Get()->RemoveRoute(routing_id_);
143 } 154 }
144 155
145 void RenderFrameImpl::MainWebFrameCreated(blink::WebFrame* frame) { 156 void RenderFrameImpl::MainWebFrameCreated(blink::WebFrame* frame) {
146 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 157 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
147 WebFrameCreated(frame)); 158 WebFrameCreated(frame));
148 } 159 }
149 160
161 void RenderFrameImpl::SetWebFrame(blink::WebFrame* web_frame) {
162 DCHECK(!frame_);
163 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess))
164 frame_ = web_frame;
165 }
166
150 RenderWidget* RenderFrameImpl::GetRenderWidget() { 167 RenderWidget* RenderFrameImpl::GetRenderWidget() {
151 return render_view_; 168 return render_view_;
152 } 169 }
153 170
154 #if defined(ENABLE_PLUGINS) 171 #if defined(ENABLE_PLUGINS)
155 void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) { 172 void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) {
156 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 173 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
157 DidCreatePepperPlugin(host)); 174 DidCreatePepperPlugin(host));
158 } 175 }
159 176
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 } 471 }
455 472
456 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 473 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
457 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 474 ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
458 RenderFrameObserver* observer; 475 RenderFrameObserver* observer;
459 while ((observer = it.GetNext()) != NULL) { 476 while ((observer = it.GetNext()) != NULL) {
460 if (observer->OnMessageReceived(msg)) 477 if (observer->OnMessageReceived(msg))
461 return true; 478 return true;
462 } 479 }
463 480
464 // TODO(ajwong): Fill in with message handlers as various components 481 bool handled = true;
465 // are migrated over to understand frames. 482 bool msg_is_ok = true;
466 return false; 483 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameImpl, msg, msg_is_ok)
484 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut)
nasko 2013/12/20 22:59:51 nit: this is 3 spaces indented, should be 2. Also,
Charlie Reis 2013/12/21 00:26:42 Oops! That was a copy paste error from the other
485
486 IPC_END_MESSAGE_MAP()
487
488 if (!msg_is_ok) {
489 // The message had a handler, but its deserialization failed.
490 // Kill the renderer to avoid potential spoofing attacks.
491 CHECK(false) << "Unable to deserialize message in RenderFrameImpl.";
492 }
493
494 return handled;
495 }
496
497 void RenderFrameImpl::OnSwapOut() {
498 // Only run unload if we're not swapped out yet, but send the ack either way.
499 if (!is_swapped_out_) {
500 // Swap this RenderView out so the tab can navigate to a page rendered by a
501 // different process. This involves running the unload handler and clearing
502 // the page. Once WasSwappedOut is called, we also allow this process to
503 // exit if there are no other active RenderViews in it.
504
505 // Send an UpdateState message before we get swapped out.
506 render_view_->SyncNavigationState();
507
508 // Synchronously run the unload handler before sending the ACK.
509 // TODO(creis): Add a WebFrame::dispatchUnloadEvent and call it here.
510
511 // Swap out and stop sending any IPC messages that are not ACKs.
512 is_swapped_out_ = true;
513
514 // Now that we're swapped out and filtering IPC messages, stop loading to
515 // ensure that no other in-progress navigation continues. We do this here
516 // to avoid sending a DidStopLoading message to the browser process.
517 frame_->stopLoading();
nasko 2013/12/20 22:59:51 This seems to be missing the StopAltErrorPageFetch
Charlie Reis 2013/12/21 00:26:42 Yeah, though I'm not 100% sure it's right. I did
518
519 // Replace the page with a blank dummy URL. The unload handler will not be
520 // run a second time, thanks to a check in FrameLoader::stopLoading.
521 // TODO(creis): Need to add a better way to do this that avoids running the
522 // beforeunload handler. For now, we just run it a second time silently.
523 render_view_->NavigateToSwappedOutURL(frame_);
524 }
525
526 Send(new FrameHostMsg_SwapOut_ACK(routing_id_));
467 } 527 }
468 528
469 RenderView* RenderFrameImpl::GetRenderView() { 529 RenderView* RenderFrameImpl::GetRenderView() {
470 return render_view_; 530 return render_view_;
471 } 531 }
472 532
473 int RenderFrameImpl::GetRoutingID() { 533 int RenderFrameImpl::GetRoutingID() {
474 return routing_id_; 534 return routing_id_;
475 } 535 }
476 536
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 child_frame_identifier, 674 child_frame_identifier,
615 UTF16ToUTF8(name), 675 UTF16ToUTF8(name),
616 &routing_id)); 676 &routing_id));
617 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); 677 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id);
618 } 678 }
619 679
620 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, 680 blink::WebFrame* web_frame = WebFrame::create(child_render_frame,
621 child_frame_identifier); 681 child_frame_identifier);
622 682
623 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 683 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
684 child_render_frame->SetWebFrame(web_frame);
624 g_child_frame_map.Get().insert( 685 g_child_frame_map.Get().insert(
625 std::make_pair(web_frame, child_render_frame)); 686 std::make_pair(web_frame, child_render_frame));
626 } else { 687 } else {
627 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 688 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
628 WebFrameCreated(web_frame)); 689 WebFrameCreated(web_frame));
629 } 690 }
630 691
631 return web_frame; 692 return web_frame;
632 } 693 }
633 694
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 859
799 // In fast/loader/stop-provisional-loads.html, we abort the load before this 860 // In fast/loader/stop-provisional-loads.html, we abort the load before this
800 // callback is invoked. 861 // callback is invoked.
801 if (!ds) 862 if (!ds)
802 return; 863 return;
803 864
804 DocumentState* document_state = DocumentState::FromDataSource(ds); 865 DocumentState* document_state = DocumentState::FromDataSource(ds);
805 866
806 // We should only navigate to swappedout:// when is_swapped_out_ is true. 867 // We should only navigate to swappedout:// when is_swapped_out_ is true.
807 CHECK((ds->request().url() != GURL(kSwappedOutURL)) || 868 CHECK((ds->request().url() != GURL(kSwappedOutURL)) ||
869 is_swapped_out_ ||
808 render_view_->is_swapped_out()) << 870 render_view_->is_swapped_out()) <<
809 "Heard swappedout:// when not swapped out."; 871 "Heard swappedout:// when not swapped out.";
810 872
811 // Update the request time if WebKit has better knowledge of it. 873 // Update the request time if WebKit has better knowledge of it.
812 if (document_state->request_time().is_null()) { 874 if (document_state->request_time().is_null()) {
813 double event_time = ds->triggeringEventTime(); 875 double event_time = ds->triggeringEventTime();
814 if (event_time != 0.0) 876 if (event_time != 0.0)
815 document_state->set_request_time(Time::FromDoubleT(event_time)); 877 document_state->set_request_time(Time::FromDoubleT(event_time));
816 } 878 }
817 879
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1375 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { 1437 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) {
1376 observers_.AddObserver(observer); 1438 observers_.AddObserver(observer);
1377 } 1439 }
1378 1440
1379 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { 1441 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) {
1380 observer->RenderFrameGone(); 1442 observer->RenderFrameGone();
1381 observers_.RemoveObserver(observer); 1443 observers_.RemoveObserver(observer);
1382 } 1444 }
1383 1445
1384 } // namespace content 1446 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698