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

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: Fix an error during merge. Created 6 years, 11 months 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 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 cookie_jar_(this) { 141 cookie_jar_(this) {
131 RenderThread::Get()->AddRoute(routing_id_, this); 142 RenderThread::Get()->AddRoute(routing_id_, this);
132 #if defined(ENABLE_PLUGINS) 143 #if defined(ENABLE_PLUGINS)
133 new PepperBrowserConnection(this); 144 new PepperBrowserConnection(this);
134 #endif 145 #endif
135 new SharedWorkerRepository(this); 146 new SharedWorkerRepository(this);
136 147
137 GetContentClient()->renderer()->RenderFrameCreated(this); 148 GetContentClient()->renderer()->RenderFrameCreated(this);
138 } 149 }
139 150
140 RenderFrameImpl::~RenderFrameImpl() { 151 RenderFrameImpl::~RenderFrameImpl() {
141 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); 152 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone());
142 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); 153 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct());
143 RenderThread::Get()->RemoveRoute(routing_id_); 154 RenderThread::Get()->RemoveRoute(routing_id_);
144 } 155 }
145 156
146 void RenderFrameImpl::MainWebFrameCreated(blink::WebFrame* frame) { 157 void RenderFrameImpl::MainWebFrameCreated(blink::WebFrame* frame) {
147 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 158 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
148 WebFrameCreated(frame)); 159 WebFrameCreated(frame));
149 } 160 }
150 161
162 void RenderFrameImpl::SetWebFrame(blink::WebFrame* web_frame) {
163 DCHECK(!frame_);
164 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess))
165 frame_ = web_frame;
166 }
167
151 RenderWidget* RenderFrameImpl::GetRenderWidget() { 168 RenderWidget* RenderFrameImpl::GetRenderWidget() {
152 return render_view_; 169 return render_view_;
153 } 170 }
154 171
155 #if defined(ENABLE_PLUGINS) 172 #if defined(ENABLE_PLUGINS)
156 void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) { 173 void RenderFrameImpl::PepperPluginCreated(RendererPpapiHost* host) {
157 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 174 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
158 DidCreatePepperPlugin(host)); 175 DidCreatePepperPlugin(host));
159 } 176 }
160 177
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 } 472 }
456 473
457 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { 474 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
458 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); 475 ObserverListBase<RenderFrameObserver>::Iterator it(observers_);
459 RenderFrameObserver* observer; 476 RenderFrameObserver* observer;
460 while ((observer = it.GetNext()) != NULL) { 477 while ((observer = it.GetNext()) != NULL) {
461 if (observer->OnMessageReceived(msg)) 478 if (observer->OnMessageReceived(msg))
462 return true; 479 return true;
463 } 480 }
464 481
465 // TODO(ajwong): Fill in with message handlers as various components 482 bool handled = true;
466 // are migrated over to understand frames. 483 bool msg_is_ok = true;
467 return false; 484 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameImpl, msg, msg_is_ok)
485 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut)
486 IPC_END_MESSAGE_MAP_EX()
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 // TODO(creis): Should we be stopping all frames here and using
518 // StopAltErrorPageFetcher with RenderView::OnStop, or just stopping this
519 // frame?
520 frame_->stopLoading();
521
522 // Replace the page with a blank dummy URL. The unload handler will not be
523 // run a second time, thanks to a check in FrameLoader::stopLoading.
524 // TODO(creis): Need to add a better way to do this that avoids running the
525 // beforeunload handler. For now, we just run it a second time silently.
526 render_view_->NavigateToSwappedOutURL(frame_);
527 }
528
529 Send(new FrameHostMsg_SwapOut_ACK(routing_id_));
468 } 530 }
469 531
470 RenderView* RenderFrameImpl::GetRenderView() { 532 RenderView* RenderFrameImpl::GetRenderView() {
471 return render_view_; 533 return render_view_;
472 } 534 }
473 535
474 int RenderFrameImpl::GetRoutingID() { 536 int RenderFrameImpl::GetRoutingID() {
475 return routing_id_; 537 return routing_id_;
476 } 538 }
477 539
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 child_frame_identifier, 675 child_frame_identifier,
614 base::UTF16ToUTF8(name), 676 base::UTF16ToUTF8(name),
615 &routing_id)); 677 &routing_id));
616 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); 678 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id);
617 } 679 }
618 680
619 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, 681 blink::WebFrame* web_frame = WebFrame::create(child_render_frame,
620 child_frame_identifier); 682 child_frame_identifier);
621 683
622 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { 684 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) {
685 child_render_frame->SetWebFrame(web_frame);
623 g_child_frame_map.Get().insert( 686 g_child_frame_map.Get().insert(
624 std::make_pair(web_frame, child_render_frame)); 687 std::make_pair(web_frame, child_render_frame));
625 } else { 688 } else {
626 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 689 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
627 WebFrameCreated(web_frame)); 690 WebFrameCreated(web_frame));
628 } 691 }
629 692
630 return web_frame; 693 return web_frame;
631 } 694 }
632 695
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 861
799 // In fast/loader/stop-provisional-loads.html, we abort the load before this 862 // In fast/loader/stop-provisional-loads.html, we abort the load before this
800 // callback is invoked. 863 // callback is invoked.
801 if (!ds) 864 if (!ds)
802 return; 865 return;
803 866
804 DocumentState* document_state = DocumentState::FromDataSource(ds); 867 DocumentState* document_state = DocumentState::FromDataSource(ds);
805 868
806 // We should only navigate to swappedout:// when is_swapped_out_ is true. 869 // We should only navigate to swappedout:// when is_swapped_out_ is true.
807 CHECK((ds->request().url() != GURL(kSwappedOutURL)) || 870 CHECK((ds->request().url() != GURL(kSwappedOutURL)) ||
871 is_swapped_out_ ||
808 render_view_->is_swapped_out()) << 872 render_view_->is_swapped_out()) <<
809 "Heard swappedout:// when not swapped out."; 873 "Heard swappedout:// when not swapped out.";
810 874
811 // Update the request time if WebKit has better knowledge of it. 875 // Update the request time if WebKit has better knowledge of it.
812 if (document_state->request_time().is_null()) { 876 if (document_state->request_time().is_null()) {
813 double event_time = ds->triggeringEventTime(); 877 double event_time = ds->triggeringEventTime();
814 if (event_time != 0.0) 878 if (event_time != 0.0)
815 document_state->set_request_time(Time::FromDoubleT(event_time)); 879 document_state->set_request_time(Time::FromDoubleT(event_time));
816 } 880 }
817 881
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
1367 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { 1431 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) {
1368 observers_.AddObserver(observer); 1432 observers_.AddObserver(observer);
1369 } 1433 }
1370 1434
1371 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { 1435 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) {
1372 observer->RenderFrameGone(); 1436 observer->RenderFrameGone();
1373 observers_.RemoveObserver(observer); 1437 observers_.RemoveObserver(observer);
1374 } 1438 }
1375 1439
1376 } // namespace content 1440 } // 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