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" | |
| 11 #include "base/i18n/char_iterator.h" | 10 #include "base/i18n/char_iterator.h" |
| 12 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 14 #include "content/child/appcache/appcache_dispatcher.h" | 13 #include "content/child/appcache/appcache_dispatcher.h" |
| 15 #include "content/child/plugin_messages.h" | 14 #include "content/child/plugin_messages.h" |
| 16 #include "content/child/quota_dispatcher.h" | 15 #include "content/child/quota_dispatcher.h" |
| 17 #include "content/child/request_extra_data.h" | 16 #include "content/child/request_extra_data.h" |
| 18 #include "content/child/service_worker/web_service_worker_provider_impl.h" | 17 #include "content/child/service_worker/web_service_worker_provider_impl.h" |
| 19 #include "content/common/frame_messages.h" | 18 #include "content/common/frame_messages.h" |
| 20 #include "content/common/socket_stream_handle_data.h" | 19 #include "content/common/socket_stream_handle_data.h" |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 133 | 132 |
| 134 GetContentClient()->renderer()->RenderFrameCreated(this); | 133 GetContentClient()->renderer()->RenderFrameCreated(this); |
| 135 } | 134 } |
| 136 | 135 |
| 137 RenderFrameImpl::~RenderFrameImpl() { | 136 RenderFrameImpl::~RenderFrameImpl() { |
| 138 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); | 137 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, RenderFrameGone()); |
| 139 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); | 138 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, OnDestruct()); |
| 140 RenderThread::Get()->RemoveRoute(routing_id_); | 139 RenderThread::Get()->RemoveRoute(routing_id_); |
| 141 } | 140 } |
| 142 | 141 |
| 142 // TODO(nasko): Remove this hack once the bug is found. | |
|
Charlie Reis
2013/12/20 01:42:57
Please add a comment saying how this will help cat
nasko
2013/12/27 21:49:47
Done.
| |
| 143 void RenderFrameImpl::operator delete(void* ptr) { | |
| 144 memset(ptr, 0xAF, sizeof(RenderFrameImpl)); | |
|
Charlie Reis
2013/12/20 01:42:57
Albert, can you take a look at this part? I'd lik
awong
2013/12/20 02:06:42
Yep...this is the way partition alloc works.
I th
| |
| 145 } | |
| 146 | |
| 143 void RenderFrameImpl::MainWebFrameCreated(blink::WebFrame* frame) { | 147 void RenderFrameImpl::MainWebFrameCreated(blink::WebFrame* frame) { |
| 144 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | 148 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
| 145 WebFrameCreated(frame)); | 149 WebFrameCreated(frame)); |
| 146 } | 150 } |
| 147 | 151 |
| 148 RenderWidget* RenderFrameImpl::GetRenderWidget() { | 152 RenderWidget* RenderFrameImpl::GetRenderWidget() { |
| 149 return render_view_; | 153 return render_view_; |
| 150 } | 154 } |
| 151 | 155 |
| 152 #if defined(ENABLE_PLUGINS) | 156 #if defined(ENABLE_PLUGINS) |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 594 make_scoped_ptr(client)); | 598 make_scoped_ptr(client)); |
| 595 } | 599 } |
| 596 | 600 |
| 597 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { | 601 void RenderFrameImpl::didAccessInitialDocument(blink::WebFrame* frame) { |
| 598 render_view_->didAccessInitialDocument(frame); | 602 render_view_->didAccessInitialDocument(frame); |
| 599 } | 603 } |
| 600 | 604 |
| 601 blink::WebFrame* RenderFrameImpl::createChildFrame( | 605 blink::WebFrame* RenderFrameImpl::createChildFrame( |
| 602 blink::WebFrame* parent, | 606 blink::WebFrame* parent, |
| 603 const blink::WebString& name) { | 607 const blink::WebString& name) { |
| 604 RenderFrameImpl* child_render_frame = this; | |
| 605 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); | 608 long long child_frame_identifier = WebFrame::generateEmbedderIdentifier(); |
| 606 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 609 // Synchronously notify the browser of a child frame creation to get the |
| 607 // Synchronously notify the browser of a child frame creation to get the | 610 // routing_id for the RenderFrame. |
| 608 // routing_id for the RenderFrame. | 611 int routing_id = MSG_ROUTING_NONE; |
| 609 int routing_id; | 612 Send(new FrameHostMsg_CreateChildFrame(routing_id_, |
| 610 Send(new FrameHostMsg_CreateChildFrame(routing_id_, | 613 parent->identifier(), |
| 611 parent->identifier(), | 614 child_frame_identifier, |
| 612 child_frame_identifier, | 615 UTF16ToUTF8(name), |
| 613 UTF16ToUTF8(name), | 616 &routing_id)); |
| 614 &routing_id)); | 617 if (routing_id == MSG_ROUTING_NONE) |
| 615 child_render_frame = RenderFrameImpl::Create(render_view_, routing_id); | 618 return NULL; |
| 616 } | 619 RenderFrameImpl* child_render_frame = RenderFrameImpl::Create(render_view_, |
| 620 routing_id); | |
| 617 | 621 |
| 618 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, | 622 blink::WebFrame* web_frame = WebFrame::create(child_render_frame, |
| 619 child_frame_identifier); | 623 child_frame_identifier); |
| 620 | 624 |
| 621 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 625 g_child_frame_map.Get().insert( |
| 622 g_child_frame_map.Get().insert( | 626 std::make_pair(web_frame, child_render_frame)); |
| 623 std::make_pair(web_frame, child_render_frame)); | |
| 624 } else { | |
| 625 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | |
| 626 WebFrameCreated(web_frame)); | |
| 627 } | |
| 628 | 627 |
| 628 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, | |
| 629 WebFrameCreated(web_frame)); | |
| 629 return web_frame; | 630 return web_frame; |
| 630 } | 631 } |
| 631 | 632 |
| 632 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { | 633 void RenderFrameImpl::didDisownOpener(blink::WebFrame* frame) { |
| 633 render_view_->didDisownOpener(frame); | 634 render_view_->didDisownOpener(frame); |
| 634 } | 635 } |
| 635 | 636 |
| 636 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { | 637 void RenderFrameImpl::frameDetached(blink::WebFrame* frame) { |
| 637 // NOTE: This function is called on the frame that is being detached and not | 638 // NOTE: This function is called on the frame that is being detached and not |
| 638 // the parent frame. This is different from createChildFrame() which is | 639 // the parent frame. This is different from createChildFrame() which is |
| 639 // called on the parent frame. | 640 // called on the parent frame. |
| 640 CHECK(!is_detaching_); | 641 CHECK(!is_detaching_); |
| 641 | 642 |
| 643 bool is_subframe = !!frame->parent(); | |
| 642 int64 parent_frame_id = -1; | 644 int64 parent_frame_id = -1; |
| 643 if (frame->parent()) | 645 if (is_subframe) |
| 644 parent_frame_id = frame->parent()->identifier(); | 646 parent_frame_id = frame->parent()->identifier(); |
| 645 | 647 |
| 646 Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, | 648 Send(new FrameHostMsg_Detach(routing_id_, parent_frame_id, |
| 647 frame->identifier())); | 649 frame->identifier())); |
| 648 | 650 |
| 649 // Currently multiple WebCore::Frames can send frameDetached to a single | 651 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be |
| 650 // RenderFrameImpl. This is legacy behavior from when RenderViewImpl served | 652 // sent before setting |is_detaching_| to true. In contrast, Observers |
| 651 // as a shared WebFrameClient for multiple Webcore::Frame objects. It also | 653 // should only be notified afterwards so they cannot call back into and |
| 652 // prevents this class from entering the |is_detaching_| state because | 654 // have IPCs fired off. |
| 653 // even though one WebCore::Frame may have detached itself, others will | 655 is_detaching_ = true; |
| 654 // still need to use this object. | |
| 655 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | |
| 656 // The |is_detaching_| flag disables Send(). FrameHostMsg_Detach must be | |
| 657 // sent before setting |is_detaching_| to true. In contrast, Observers | |
| 658 // should only be notified afterwards so they cannot call back into and | |
| 659 // have IPCs fired off. | |
| 660 is_detaching_ = true; | |
| 661 } | |
| 662 | 656 |
| 663 // Call back to RenderViewImpl for observers to be notified. | 657 // Call back to RenderViewImpl for observers to be notified. |
| 664 // TODO(nasko): Remove once we have RenderFrameObserver. | 658 // TODO(nasko): Remove once we have RenderFrameObserver. |
| 665 render_view_->frameDetached(frame); | 659 render_view_->frameDetached(frame); |
| 666 | 660 |
| 661 // We need to clean up subframes by removing them from the map and deleting | |
| 662 // the RenderFrameImpl. In contrast, the main frame is owned by its | |
| 663 // containing RenderViewHost (so that they have the same lifetime), so it does | |
| 664 // not require any cleanup here. | |
| 665 if (is_subframe) { | |
| 666 FrameMap::iterator it = g_child_frame_map.Get().find(frame); | |
| 667 CHECK(it != g_child_frame_map.Get().end()); | |
| 668 CHECK_EQ(it->second, this); | |
| 669 g_child_frame_map.Get().erase(it); | |
| 670 } | |
| 671 | |
| 672 // |frame| is invalid after here. | |
| 667 frame->close(); | 673 frame->close(); |
| 668 | 674 |
| 669 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess)) { | 675 if (is_subframe) { |
| 670 // If the frame does not have a parent, it is the main frame. The main | 676 delete this; |
| 671 // frame is owned by the containing RenderViewHost so it does not require | 677 // Object is invalid after this point. |
| 672 // any cleanup here. | |
| 673 if (frame->parent()) { | |
| 674 FrameMap::iterator it = g_child_frame_map.Get().find(frame); | |
| 675 DCHECK(it != g_child_frame_map.Get().end()); | |
| 676 DCHECK_EQ(it->second, this); | |
| 677 g_child_frame_map.Get().erase(it); | |
| 678 delete this; | |
| 679 // Object is invalid after this point. | |
| 680 } | |
| 681 } | 678 } |
| 682 } | 679 } |
| 683 | 680 |
| 684 void RenderFrameImpl::willClose(blink::WebFrame* frame) { | 681 void RenderFrameImpl::willClose(blink::WebFrame* frame) { |
| 685 // Call back to RenderViewImpl for observers to be notified. | 682 // Call back to RenderViewImpl for observers to be notified. |
| 686 // TODO(nasko): Remove once we have RenderFrameObserver. | 683 // TODO(nasko): Remove once we have RenderFrameObserver. |
| 687 render_view_->willClose(frame); | 684 render_view_->willClose(frame); |
| 688 } | 685 } |
| 689 | 686 |
| 690 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, | 687 void RenderFrameImpl::didChangeName(blink::WebFrame* frame, |
| (...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1373 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { | 1370 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { |
| 1374 observers_.AddObserver(observer); | 1371 observers_.AddObserver(observer); |
| 1375 } | 1372 } |
| 1376 | 1373 |
| 1377 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { | 1374 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { |
| 1378 observer->RenderFrameGone(); | 1375 observer->RenderFrameGone(); |
| 1379 observers_.RemoveObserver(observer); | 1376 observers_.RemoveObserver(observer); |
| 1380 } | 1377 } |
| 1381 | 1378 |
| 1382 } // namespace content | 1379 } // namespace content |
| OLD | NEW |