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