| 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 return g_child_frame_map.Get().find(web_frame)->second; |
| 119 } |
| 120 |
| 117 // static | 121 // static |
| 118 void RenderFrameImpl::InstallCreateHook( | 122 void RenderFrameImpl::InstallCreateHook( |
| 119 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { | 123 RenderFrameImpl* (*create_render_frame_impl)(RenderViewImpl*, int32)) { |
| 120 CHECK(!g_create_render_frame_impl); | 124 CHECK(!g_create_render_frame_impl); |
| 121 g_create_render_frame_impl = create_render_frame_impl; | 125 g_create_render_frame_impl = create_render_frame_impl; |
| 122 } | 126 } |
| 123 | 127 |
| 124 // RenderFrameImpl ---------------------------------------------------------- | 128 // RenderFrameImpl ---------------------------------------------------------- |
| 125 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) | 129 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) |
| 126 : render_view_(render_view), | 130 : frame_(NULL), |
| 131 render_view_(render_view), |
| 127 routing_id_(routing_id), | 132 routing_id_(routing_id), |
| 128 is_swapped_out_(false), | 133 is_swapped_out_(false), |
| 129 is_detaching_(false) { | 134 is_detaching_(false) { |
| 130 RenderThread::Get()->AddRoute(routing_id_, this); | 135 RenderThread::Get()->AddRoute(routing_id_, this); |
| 131 #if defined(ENABLE_PLUGINS) | 136 #if defined(ENABLE_PLUGINS) |
| 132 new PepperBrowserConnection(this); | 137 new PepperBrowserConnection(this); |
| 133 #endif | 138 #endif |
| 134 new SharedWorkerRepository(this); | 139 new SharedWorkerRepository(this); |
| 135 | 140 |
| 136 GetContentClient()->renderer()->RenderFrameCreated(this); | 141 GetContentClient()->renderer()->RenderFrameCreated(this); |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 } | 459 } |
| 455 | 460 |
| 456 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { | 461 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) { |
| 457 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); | 462 ObserverListBase<RenderFrameObserver>::Iterator it(observers_); |
| 458 RenderFrameObserver* observer; | 463 RenderFrameObserver* observer; |
| 459 while ((observer = it.GetNext()) != NULL) { | 464 while ((observer = it.GetNext()) != NULL) { |
| 460 if (observer->OnMessageReceived(msg)) | 465 if (observer->OnMessageReceived(msg)) |
| 461 return true; | 466 return true; |
| 462 } | 467 } |
| 463 | 468 |
| 464 // TODO(ajwong): Fill in with message handlers as various components | 469 bool handled = true; |
| 465 // are migrated over to understand frames. | 470 bool msg_is_ok = true; |
| 466 return false; | 471 IPC_BEGIN_MESSAGE_MAP_EX(RenderFrameImpl, msg, msg_is_ok) |
| 472 IPC_MESSAGE_HANDLER(FrameMsg_SwapOut, OnSwapOut) |
| 473 |
| 474 IPC_END_MESSAGE_MAP() |
| 475 |
| 476 if (!msg_is_ok) { |
| 477 // The message had a handler, but its deserialization failed. |
| 478 // Kill the renderer to avoid potential spoofing attacks. |
| 479 CHECK(false) << "Unable to deserialize message in RenderFrameImpl."; |
| 480 } |
| 481 |
| 482 return handled; |
| 483 } |
| 484 |
| 485 void RenderFrameImpl::OnSwapOut() { |
| 486 // Only run unload if we're not swapped out yet, but send the ack either way. |
| 487 if (!is_swapped_out_) { |
| 488 // Swap this RenderView out so the tab can navigate to a page rendered by a |
| 489 // different process. This involves running the unload handler and clearing |
| 490 // the page. Once WasSwappedOut is called, we also allow this process to |
| 491 // exit if there are no other active RenderViews in it. |
| 492 |
| 493 // Send an UpdateState message before we get swapped out. |
| 494 render_view_->SyncNavigationState(); |
| 495 |
| 496 // Synchronously run the unload handler before sending the ACK. |
| 497 // TODO(creis): Add a WebFrame::dispatchUnloadEvent. |
| 498 //webview()->dispatchUnloadEvent(); |
| 499 |
| 500 // Swap out and stop sending any IPC messages that are not ACKs. |
| 501 is_swapped_out_ = true; |
| 502 |
| 503 // Now that we're swapped out and filtering IPC messages, stop loading to |
| 504 // ensure that no other in-progress navigation continues. We do this here |
| 505 // to avoid sending a DidStopLoading message to the browser process. |
| 506 frame_->stopLoading(); |
| 507 |
| 508 // Replace the page with a blank dummy URL. The unload handler will not be |
| 509 // run a second time, thanks to a check in FrameLoader::stopLoading. |
| 510 // TODO(creis): Need to add a better way to do this that avoids running the |
| 511 // beforeunload handler. For now, we just run it a second time silently. |
| 512 render_view_->NavigateToSwappedOutURL(frame_); |
| 513 } |
| 514 |
| 515 Send(new FrameHostMsg_SwapOut_ACK(routing_id_)); |
| 467 } | 516 } |
| 468 | 517 |
| 469 RenderView* RenderFrameImpl::GetRenderView() { | 518 RenderView* RenderFrameImpl::GetRenderView() { |
| 470 return render_view_; | 519 return render_view_; |
| 471 } | 520 } |
| 472 | 521 |
| 473 int RenderFrameImpl::GetRoutingID() { | 522 int RenderFrameImpl::GetRoutingID() { |
| 474 return routing_id_; | 523 return routing_id_; |
| 475 } | 524 } |
| 476 | 525 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 598 | 647 |
| 599 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { | 648 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { |
| 600 render_view_->didAccessInitialDocument(frame); | 649 render_view_->didAccessInitialDocument(frame); |
| 601 } | 650 } |
| 602 | 651 |
| 603 blink::WebFrame* RenderFrameImpl::createChildFrame( | 652 blink::WebFrame* RenderFrameImpl::createChildFrame( |
| 604 blink::WebFrame* parent, | 653 blink::WebFrame* parent, |
| 605 const blink::WebString& name) { | 654 const blink::WebString& name) { |
| 606 RenderFrameImpl* child_render_frame = this; | 655 RenderFrameImpl* child_render_frame = this; |
| 607 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); | 656 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); |
| 608 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 657 // Synchronously notify the browser of a child frame creation to get the |
| 609 // Synchronously notify the browser of a child frame creation to get the | 658 // routing_id for the RenderFrame. |
| 610 // routing_id for the RenderFrame. | 659 int routing_id; |
| 611 int routing_id; | 660 Send(new FrameHostMsg_CreateChildFrame(routing_id_, |
| 612 Send(new FrameHostMsg_CreateChildFrame(routing_id_, | 661 parent->identifier(), |
| 613 parent->identifier(), | 662 child_frame_identifier, |
| 614 child_frame_identifier, | 663 UTF16ToUTF8(name), |
| 615 UTF16ToUTF8(name), | 664 &routing_id)); |
| 616 &routing_id)); | 665 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); |
| 617 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); | |
| 618 } | |
| 619 | 666 |
| 620 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, | 667 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, |
| 621 child_frame_identifier); | 668 child_frame_identifier); |
| 669 child_render_frame->set_web_frame(web_frame); |
| 622 | 670 |
| 623 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 671 g_child_frame_map.Get().insert( |
| 624 g_child_frame_map.Get().insert( | 672 std::make_pair(web_frame, child_render_frame)); |
| 625 std::make_pair(web_frame, child_render_frame)); | 673 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
| 626 } else { | 674 WebFrameCreated(web_frame)); |
| 627 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | |
| 628 WebFrameCreated(web_frame)); | |
| 629 } | |
| 630 | 675 |
| 631 return web_frame; | 676 return web_frame; |
| 632 } | 677 } |
| 633 | 678 |
| 634 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { | 679 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { |
| 635 render_view_->didDisownOpener(frame); | 680 render_view_->didDisownOpener(frame); |
| 636 } | 681 } |
| 637 | 682 |
| 638 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { | 683 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { |
| 639 // NOTE: This function is called on the frame that is being detached and not | 684 // NOTE: This function is called on the frame that is being detached and not |
| 640 // the parent frame. This is different from createChildFrame() which is | 685 // the parent frame. This is different from createChildFrame() which is |
| 641 // called on the parent frame. | 686 // called on the parent frame. |
| 642 CHECK(!is_detaching_); | 687 CHECK(!is_detaching_); |
| 643 | 688 |
| 644 int64 parent_frame_id = -1; | 689 int64 parent_frame_id = -1; |
| 645 if (frame->parent()) | 690 if (frame->parent()) |
| 646 parent_frame_id = frame->parent()->identifier(); | 691 parent_frame_id = frame->parent()->identifier(); |
| 647 | 692 |
| 648 Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, | 693 Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, |
| 649 frame->identifier())); | 694 frame->identifier())); |
| 650 | 695 |
| 651 // Currently multiple WebCore::Frames can send frameDetached to a single | 696 // Currently multiple WebCore::Frames can send frameDetached to a single |
| 652 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served | 697 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served |
| 653 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also | 698 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also |
| 654 // prevents this class from entering the |is_detaching_| state because | 699 // prevents this class from entering the |is_detaching_| state because |
| 655 // even though one WebCore::Frame may have detached itself, others will | 700 // even though one WebCore::Frame may have detached itself, others will |
| 656 // still need to use this object. | 701 // still need to use this object. |
| 657 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 702 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be |
| 658 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be | 703 // sent before setting |is_detaching_| to true. In contrast, Observers |
| 659 // sent before setting |is_detaching_| to true. In contrast, Observers | 704 // should only be notified afterwards so they cannot call back into and |
| 660 // should only be notified afterwards so they cannot call back into and | 705 // have IPCs fired off. |
| 661 // have IPCs fired off. | 706 is_detaching_ = true; |
| 662 is_detaching_ = true; | |
| 663 } | |
| 664 | 707 |
| 665 // Call back to RenderViewImpl for observers to be notified. | 708 // Call back to RenderViewImpl for observers to be notified. |
| 666 // TODO(nasko): Remove once we have RenderFrameObserver. | 709 // TODO(nasko): Remove once we have RenderFrameObserver. |
| 667 render_view_->frameDetached(frame); | 710 render_view_->frameDetached(frame); |
| 668 | 711 |
| 669 frame->close(); | 712 frame->close(); |
| 670 | 713 |
| 671 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 714 // If the frame does not have a parent, it is the main frame. The main |
| 672 // If the frame does not have a parent, it is the main frame. The main | 715 // frame is owned by the containing RenderViewHost so it does not require |
| 673 // frame is owned by the containing RenderViewHost so it does not require | 716 // any cleanup here. |
| 674 // any cleanup here. | 717 if (frame->parent()) { |
| 675 if (frame->parent()) { | 718 FrameMap::iterator it = g_child_frame_map.Get().find(frame); |
| 676 FrameMap::iterator it = g_child_frame_map.Get().find(frame); | 719 DCHECK(it != g_child_frame_map.Get().end()); |
| 677 DCHECK(it != g_child_frame_map.Get().end()); | 720 DCHECK_EQ(it->second, this); |
| 678 DCHECK_EQ(it->second, this); | 721 g_child_frame_map.Get().erase(it); |
| 679 g_child_frame_map.Get().erase(it); | 722 delete this; |
| 680 delete this; | 723 // Object is invalid after this point. |
| 681 // Object is invalid after this point. | |
| 682 } | |
| 683 } | 724 } |
| 684 } | 725 } |
| 685 | 726 |
| 686 void RenderFrameImpl::willClose(blink::WebFrame* frame) { | 727 void RenderFrameImpl::willClose(blink::WebFrame* frame) { |
| 687 // Call back to RenderViewImpl for observers to be notified. | 728 // Call back to RenderViewImpl for observers to be notified. |
| 688 // TODO(nasko): Remove once we have RenderFrameObserver. | 729 // TODO(nasko): Remove once we have RenderFrameObserver. |
| 689 render_view_->willClose(frame); | 730 render_view_->willClose(frame); |
| 690 } | 731 } |
| 691 | 732 |
| 692 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, | 733 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 798 | 839 |
| 799 // In fast/loader/stop-provisional-loads.html, we abort the load before this | 840 // In fast/loader/stop-provisional-loads.html, we abort the load before this |
| 800 // callback is invoked. | 841 // callback is invoked. |
| 801 if (!ds) | 842 if (!ds) |
| 802 return; | 843 return; |
| 803 | 844 |
| 804 DocumentState* document_state = DocumentState::FromDataSource(ds); | 845 DocumentState* document_state = DocumentState::FromDataSource(ds); |
| 805 | 846 |
| 806 // We should only navigate to swappedout:// when is_swapped_out_ is true. | 847 // We should only navigate to swappedout:// when is_swapped_out_ is true. |
| 807 CHECK((ds->request().url() != GURL(kSwappedOutURL)) || | 848 CHECK((ds->request().url() != GURL(kSwappedOutURL)) || |
| 849 is_swapped_out_ || |
| 808 render_view_->is_swapped_out()) << | 850 render_view_->is_swapped_out()) << |
| 809 "Heard swappedout:// when not swapped out."; | 851 "Heard swappedout:// when not swapped out."; |
| 810 | 852 |
| 811 // Update the request time if WebKit has better knowledge of it. | 853 // Update the request time if WebKit has better knowledge of it. |
| 812 if (document_state->request_time().is_null()) { | 854 if (document_state->request_time().is_null()) { |
| 813 double event_time = ds->triggeringEventTime(); | 855 double event_time = ds->triggeringEventTime(); |
| 814 if (event_time != 0.0) | 856 if (event_time != 0.0) |
| 815 document_state->set_request_time(Time::FromDoubleT(event_time)); | 857 document_state->set_request_time(Time::FromDoubleT(event_time)); |
| 816 } | 858 } |
| 817 | 859 |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1375 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { | 1417 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { |
| 1376 observers_.AddObserver(observer); | 1418 observers_.AddObserver(observer); |
| 1377 } | 1419 } |
| 1378 | 1420 |
| 1379 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { | 1421 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { |
| 1380 observer->RenderFrameGone(); | 1422 observer->RenderFrameGone(); |
| 1381 observers_.RemoveObserver(observer); | 1423 observers_.RemoveObserver(observer); |
| 1382 } | 1424 } |
| 1383 | 1425 |
| 1384 } // namespace content | 1426 } // namespace content |
| OLD | NEW |