| 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) |
| 485 IPC_END_MESSAGE_MAP_EX() |
| 486 |
| 487 if (!msg_is_ok) { |
| 488 // The message had a handler, but its deserialization failed. |
| 489 // Kill the renderer to avoid potential spoofing attacks. |
| 490 CHECK(false) << "Unable to deserialize message in RenderFrameImpl."; |
| 491 } |
| 492 |
| 493 return handled; |
| 494 } |
| 495 |
| 496 void RenderFrameImpl::OnSwapOut() { |
| 497 // Only run unload if we're not swapped out yet, but send the ack either way. |
| 498 if (!is_swapped_out_) { |
| 499 // Swap this RenderView out so the tab can navigate to a page rendered by a |
| 500 // different process. This involves running the unload handler and clearing |
| 501 // the page. Once WasSwappedOut is called, we also allow this process to |
| 502 // exit if there are no other active RenderViews in it. |
| 503 |
| 504 // Send an UpdateState message before we get swapped out. |
| 505 render_view_->SyncNavigationState(); |
| 506 |
| 507 // Synchronously run the unload handler before sending the ACK. |
| 508 // TODO(creis): Add a WebFrame::dispatchUnloadEvent and call it here. |
| 509 |
| 510 // Swap out and stop sending any IPC messages that are not ACKs. |
| 511 is_swapped_out_ = true; |
| 512 |
| 513 // Now that we're swapped out and filtering IPC messages, stop loading to |
| 514 // ensure that no other in-progress navigation continues. We do this here |
| 515 // to avoid sending a DidStopLoading message to the browser process. |
| 516 // TODO(creis): Should we be stopping all frames here and using |
| 517 // StopAltErrorPageFetcher with RenderView::OnStop, or just stopping this |
| 518 // frame? |
| 519 frame_->stopLoading(); |
| 520 |
| 521 // Replace the page with a blank dummy URL. The unload handler will not be |
| 522 // run a second time, thanks to a check in FrameLoader::stopLoading. |
| 523 // TODO(creis): Need to add a better way to do this that avoids running the |
| 524 // beforeunload handler. For now, we just run it a second time silently. |
| 525 render_view_->NavigateToSwappedOutURL(frame_); |
| 526 } |
| 527 |
| 528 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); |
| 467 } | 529 } |
| 468 | 530 |
| 469 RenderView* RenderFrameImpl::GetRenderView() { | 531 RenderView* RenderFrameImpl::GetRenderView() { |
| 470 return render_view_; | 532 return render_view_; |
| 471 } | 533 } |
| 472 | 534 |
| 473 int RenderFrameImpl::GetRoutingID() { | 535 int RenderFrameImpl::GetRoutingID() { |
| 474 return routing_id_; | 536 return routing_id_; |
| 475 } | 537 } |
| 476 | 538 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 child_frame_identifier, | 676 child_frame_identifier, |
| 615 UTF16ToUTF8(name), | 677 UTF16ToUTF8(name), |
| 616 &routing_id)); | 678 &routing_id)); |
| 617 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); | 679 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); |
| 618 } | 680 } |
| 619 | 681 |
| 620 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, | 682 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, |
| 621 child_frame_identifier); | 683 child_frame_identifier); |
| 622 | 684 |
| 623 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 685 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { |
| 686 child_render_frame->SetWebFrame(web_frame); |
| 624 g_child_frame_map.Get().insert( | 687 g_child_frame_map.Get().insert( |
| 625 std::make_pair(web_frame, child_render_frame)); | 688 std::make_pair(web_frame, child_render_frame)); |
| 626 } else { | 689 } else { |
| 627 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | 690 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
| 628 WebFrameCreated(web_frame)); | 691 WebFrameCreated(web_frame)); |
| 629 } | 692 } |
| 630 | 693 |
| 631 return web_frame; | 694 return web_frame; |
| 632 } | 695 } |
| 633 | 696 |
| (...skipping 164 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 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1375 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { | 1439 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { |
| 1376 observers_.AddObserver(observer); | 1440 observers_.AddObserver(observer); |
| 1377 } | 1441 } |
| 1378 | 1442 |
| 1379 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { | 1443 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { |
| 1380 observer->RenderFrameGone(); | 1444 observer->RenderFrameGone(); |
| 1381 observers_.RemoveObserver(observer); | 1445 observers_.RemoveObserver(observer); |
| 1382 } | 1446 } |
| 1383 | 1447 |
| 1384 } // namespace content | 1448 } // namespace content |
| OLD | NEW |