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

Side by Side Diff: content/browser/frame_host/frame_tree_node.cc

Issue 1086283002: Track frame openers in FrameTreeNodes instead of WebContents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup in WebContentsImpl Created 5 years, 6 months 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
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/browser/frame_host/frame_tree_node.h" 5 #include "content/browser/frame_host/frame_tree_node.h"
6 6
7 #include <queue> 7 #include <queue>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/profiler/scoped_tracker.h" 10 #include "base/profiler/scoped_tracker.h"
(...skipping 19 matching lines...) Expand all
30 30
31 // These values indicate the loading progress status. The minimum progress 31 // These values indicate the loading progress status. The minimum progress
32 // value matches what Blink's ProgressTracker has traditionally used for a 32 // value matches what Blink's ProgressTracker has traditionally used for a
33 // minimum progress value. 33 // minimum progress value.
34 const double kLoadingProgressNotStarted = 0.0; 34 const double kLoadingProgressNotStarted = 0.0;
35 const double kLoadingProgressMinimum = 0.1; 35 const double kLoadingProgressMinimum = 0.1;
36 const double kLoadingProgressDone = 1.0; 36 const double kLoadingProgressDone = 1.0;
37 37
38 } // namespace 38 } // namespace
39 39
40 // This observer watches the opener of its owner FrameTreeNode and clears the
41 // owner's opener if the opener is destroyed.
42 class FrameTreeNode::OpenerDestroyedObserver : public FrameTreeNode::Observer {
43 public:
44 OpenerDestroyedObserver(FrameTreeNode* owner) : owner_(owner) {}
45
46 // FrameTreeNode::Observer
47 void OnFrameTreeNodeDestroyed(FrameTreeNode* node) override {
48 CHECK(owner_->opener() == node);
Charlie Reis 2015/06/03 20:01:36 CHECK_EQ
alexmos 2015/06/05 22:34:30 Done.
49 owner_->SetOpener(nullptr);
50 }
51
52 private:
53 FrameTreeNode* owner_;
54
55 DISALLOW_COPY_AND_ASSIGN(OpenerDestroyedObserver);
56 };
57
40 int FrameTreeNode::next_frame_tree_node_id_ = 1; 58 int FrameTreeNode::next_frame_tree_node_id_ = 1;
41 59
42 // static 60 // static
43 FrameTreeNode* FrameTreeNode::GloballyFindByID(int frame_tree_node_id) { 61 FrameTreeNode* FrameTreeNode::GloballyFindByID(int frame_tree_node_id) {
44 DCHECK_CURRENTLY_ON(BrowserThread::UI); 62 DCHECK_CURRENTLY_ON(BrowserThread::UI);
45 FrameTreeNodeIDMap* nodes = g_frame_tree_node_id_map.Pointer(); 63 FrameTreeNodeIDMap* nodes = g_frame_tree_node_id_map.Pointer();
46 FrameTreeNodeIDMap::iterator it = nodes->find(frame_tree_node_id); 64 FrameTreeNodeIDMap::iterator it = nodes->find(frame_tree_node_id);
47 return it == nodes->end() ? nullptr : it->second; 65 return it == nodes->end() ? nullptr : it->second;
48 } 66 }
49 67
50 FrameTreeNode::FrameTreeNode(FrameTree* frame_tree, 68 FrameTreeNode::FrameTreeNode(FrameTree* frame_tree,
51 Navigator* navigator, 69 Navigator* navigator,
52 RenderFrameHostDelegate* render_frame_delegate, 70 RenderFrameHostDelegate* render_frame_delegate,
53 RenderViewHostDelegate* render_view_delegate, 71 RenderViewHostDelegate* render_view_delegate,
54 RenderWidgetHostDelegate* render_widget_delegate, 72 RenderWidgetHostDelegate* render_widget_delegate,
55 RenderFrameHostManager::Delegate* manager_delegate, 73 RenderFrameHostManager::Delegate* manager_delegate,
56 blink::WebTreeScopeType scope, 74 blink::WebTreeScopeType scope,
57 const std::string& name, 75 const std::string& name,
58 blink::WebSandboxFlags sandbox_flags) 76 blink::WebSandboxFlags sandbox_flags)
59 : frame_tree_(frame_tree), 77 : frame_tree_(frame_tree),
60 navigator_(navigator), 78 navigator_(navigator),
61 render_manager_(this, 79 render_manager_(this,
62 render_frame_delegate, 80 render_frame_delegate,
63 render_view_delegate, 81 render_view_delegate,
64 render_widget_delegate, 82 render_widget_delegate,
65 manager_delegate), 83 manager_delegate),
66 frame_tree_node_id_(next_frame_tree_node_id_++), 84 frame_tree_node_id_(next_frame_tree_node_id_++),
67 parent_(NULL), 85 parent_(NULL),
86 opener_(nullptr),
87 opener_observer_(nullptr),
68 replication_state_(scope, name, sandbox_flags), 88 replication_state_(scope, name, sandbox_flags),
69 // Effective sandbox flags also need to be set, since initial sandbox 89 // Effective sandbox flags also need to be set, since initial sandbox
70 // flags should apply to the initial empty document in the frame. 90 // flags should apply to the initial empty document in the frame.
71 effective_sandbox_flags_(sandbox_flags), 91 effective_sandbox_flags_(sandbox_flags),
72 loading_progress_(kLoadingProgressNotStarted) { 92 loading_progress_(kLoadingProgressNotStarted) {
73 std::pair<FrameTreeNodeIDMap::iterator, bool> result = 93 std::pair<FrameTreeNodeIDMap::iterator, bool> result =
74 g_frame_tree_node_id_map.Get().insert( 94 g_frame_tree_node_id_map.Get().insert(
75 std::make_pair(frame_tree_node_id_, this)); 95 std::make_pair(frame_tree_node_id_, this));
76 CHECK(result.second); 96 CHECK(result.second);
77 } 97 }
78 98
79 FrameTreeNode::~FrameTreeNode() { 99 FrameTreeNode::~FrameTreeNode() {
80 frame_tree_->FrameRemoved(this); 100 frame_tree_->FrameRemoved(this);
101 FOR_EACH_OBSERVER(Observer, observers_, OnFrameTreeNodeDestroyed(this));
102
103 if (opener_)
104 opener_->RemoveObserver(opener_observer_.get());
81 105
82 g_frame_tree_node_id_map.Get().erase(frame_tree_node_id_); 106 g_frame_tree_node_id_map.Get().erase(frame_tree_node_id_);
83 } 107 }
84 108
109 void FrameTreeNode::AddObserver(Observer* observer) {
110 observers_.AddObserver(observer);
111 }
112
113 void FrameTreeNode::RemoveObserver(Observer* observer) {
114 observers_.RemoveObserver(observer);
115 }
116
85 bool FrameTreeNode::IsMainFrame() const { 117 bool FrameTreeNode::IsMainFrame() const {
86 return frame_tree_->root() == this; 118 return frame_tree_->root() == this;
87 } 119 }
88 120
89 void FrameTreeNode::AddChild(scoped_ptr<FrameTreeNode> child, 121 void FrameTreeNode::AddChild(scoped_ptr<FrameTreeNode> child,
90 int process_id, 122 int process_id,
91 int frame_routing_id) { 123 int frame_routing_id) {
92 // Child frame must always be created in the same process as the parent. 124 // Child frame must always be created in the same process as the parent.
93 CHECK_EQ(process_id, render_manager_.current_host()->GetProcess()->GetID()); 125 CHECK_EQ(process_id, render_manager_.current_host()->GetProcess()->GetID());
94 126
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 void FrameTreeNode::ResetForNewProcess() { 164 void FrameTreeNode::ResetForNewProcess() {
133 current_url_ = GURL(); 165 current_url_ = GURL();
134 166
135 // The children may not have been cleared if a cross-process navigation 167 // The children may not have been cleared if a cross-process navigation
136 // commits before the old process cleans everything up. Make sure the child 168 // commits before the old process cleans everything up. Make sure the child
137 // nodes get deleted before swapping to a new process. 169 // nodes get deleted before swapping to a new process.
138 ScopedVector<FrameTreeNode> old_children = children_.Pass(); 170 ScopedVector<FrameTreeNode> old_children = children_.Pass();
139 old_children.clear(); // May notify observers. 171 old_children.clear(); // May notify observers.
140 } 172 }
141 173
174 void FrameTreeNode::SetOpener(FrameTreeNode* opener) {
175 if (opener_)
176 opener_->RemoveObserver(opener_observer_.get());
Charlie Reis 2015/06/03 20:01:36 Maybe also clear opener_observer_ if |opener| is n
alexmos 2015/06/05 22:34:31 Done.
177
178 opener_ = opener;
179
180 if (opener_) {
181 if (!opener_observer_)
182 opener_observer_ = make_scoped_ptr(new OpenerDestroyedObserver(this));
183 opener_->AddObserver(opener_observer_.get());
184 }
185 }
186
142 void FrameTreeNode::SetCurrentOrigin(const url::Origin& origin) { 187 void FrameTreeNode::SetCurrentOrigin(const url::Origin& origin) {
143 if (!origin.IsSameAs(replication_state_.origin)) 188 if (!origin.IsSameAs(replication_state_.origin))
144 render_manager_.OnDidUpdateOrigin(origin); 189 render_manager_.OnDidUpdateOrigin(origin);
145 replication_state_.origin = origin; 190 replication_state_.origin = origin;
146 } 191 }
147 192
148 void FrameTreeNode::SetFrameName(const std::string& name) { 193 void FrameTreeNode::SetFrameName(const std::string& name) {
149 if (name != replication_state_.name) 194 if (name != replication_state_.name)
150 render_manager_.OnDidUpdateName(name); 195 render_manager_.OnDidUpdateName(name);
151 replication_state_.name = name; 196 replication_state_.name = name;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 FROM_HERE_WITH_EXPLICIT_FUNCTION( 345 FROM_HERE_WITH_EXPLICIT_FUNCTION(
301 "465796 FrameTreeNode::DidStopLoading::End")); 346 "465796 FrameTreeNode::DidStopLoading::End"));
302 } 347 }
303 348
304 void FrameTreeNode::DidChangeLoadProgress(double load_progress) { 349 void FrameTreeNode::DidChangeLoadProgress(double load_progress) {
305 loading_progress_ = load_progress; 350 loading_progress_ = load_progress;
306 frame_tree_->UpdateLoadProgress(); 351 frame_tree_->UpdateLoadProgress();
307 } 352 }
308 353
309 } // namespace content 354 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698