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