Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 117603002: Always create FrameTreeNodes and RenderFrameHosts for every frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move memset to operator delete. Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698