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

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

Issue 2661403003: Track the original opener of a webcontents so we can rely on it for popups (Closed)
Patch Set: typo Created 3 years, 10 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 #include <utility> 8 #include <utility>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 void RecordUniqueNameLength(size_t length) { 44 void RecordUniqueNameLength(size_t length) {
45 UMA_HISTOGRAM_COUNTS("SessionRestore.FrameUniqueNameLength", length); 45 UMA_HISTOGRAM_COUNTS("SessionRestore.FrameUniqueNameLength", length);
46 } 46 }
47 47
48 } // namespace 48 } // namespace
49 49
50 // This observer watches the opener of its owner FrameTreeNode and clears the 50 // This observer watches the opener of its owner FrameTreeNode and clears the
51 // owner's opener if the opener is destroyed. 51 // owner's opener if the opener is destroyed.
52 class FrameTreeNode::OpenerDestroyedObserver : public FrameTreeNode::Observer { 52 class FrameTreeNode::OpenerDestroyedObserver : public FrameTreeNode::Observer {
53 public: 53 public:
54 OpenerDestroyedObserver(FrameTreeNode* owner) : owner_(owner) {} 54 OpenerDestroyedObserver(FrameTreeNode* owner, bool observing_original_opener)
55 : owner_(owner), observing_original_opener_(observing_original_opener) {}
55 56
56 // FrameTreeNode::Observer 57 // FrameTreeNode::Observer
57 void OnFrameTreeNodeDestroyed(FrameTreeNode* node) override { 58 void OnFrameTreeNodeDestroyed(FrameTreeNode* node) override {
58 CHECK_EQ(owner_->opener(), node); 59 if (observing_original_opener_) {
59 owner_->SetOpener(nullptr); 60 CHECK_EQ(owner_->original_opener(), node);
61 owner_->SetOriginalOpener(nullptr);
62 } else {
63 CHECK_EQ(owner_->opener(), node);
64 owner_->SetOpener(nullptr);
65 }
60 } 66 }
61 67
62 private: 68 private:
63 FrameTreeNode* owner_; 69 FrameTreeNode* owner_;
70 bool observing_original_opener_;
64 71
65 DISALLOW_COPY_AND_ASSIGN(OpenerDestroyedObserver); 72 DISALLOW_COPY_AND_ASSIGN(OpenerDestroyedObserver);
66 }; 73 };
67 74
68 int FrameTreeNode::next_frame_tree_node_id_ = 1; 75 int FrameTreeNode::next_frame_tree_node_id_ = 1;
69 76
70 // static 77 // static
71 FrameTreeNode* FrameTreeNode::GloballyFindByID(int frame_tree_node_id) { 78 FrameTreeNode* FrameTreeNode::GloballyFindByID(int frame_tree_node_id) {
72 DCHECK_CURRENTLY_ON(BrowserThread::UI); 79 DCHECK_CURRENTLY_ON(BrowserThread::UI);
73 FrameTreeNodeIdMap* nodes = g_frame_tree_node_id_map.Pointer(); 80 FrameTreeNodeIdMap* nodes = g_frame_tree_node_id_map.Pointer();
(...skipping 14 matching lines...) Expand all
88 : frame_tree_(frame_tree), 95 : frame_tree_(frame_tree),
89 navigator_(navigator), 96 navigator_(navigator),
90 render_manager_(this, 97 render_manager_(this,
91 render_frame_delegate, 98 render_frame_delegate,
92 render_widget_delegate, 99 render_widget_delegate,
93 manager_delegate), 100 manager_delegate),
94 frame_tree_node_id_(next_frame_tree_node_id_++), 101 frame_tree_node_id_(next_frame_tree_node_id_++),
95 parent_(parent), 102 parent_(parent),
96 opener_(nullptr), 103 opener_(nullptr),
97 opener_observer_(nullptr), 104 opener_observer_(nullptr),
105 original_opener_(nullptr),
106 original_opener_observer_(nullptr),
98 has_committed_real_load_(false), 107 has_committed_real_load_(false),
99 replication_state_( 108 replication_state_(
100 scope, 109 scope,
101 name, 110 name,
102 unique_name, 111 unique_name,
103 blink::WebSandboxFlags::None, 112 blink::WebSandboxFlags::None,
104 false /* should enforce strict mixed content checking */, 113 false /* should enforce strict mixed content checking */,
105 false /* is a potentially trustworthy unique origin */, 114 false /* is a potentially trustworthy unique origin */,
106 false /* has received a user gesture */), 115 false /* has received a user gesture */),
107 pending_sandbox_flags_(blink::WebSandboxFlags::None), 116 pending_sandbox_flags_(blink::WebSandboxFlags::None),
(...skipping 12 matching lines...) Expand all
120 } 129 }
121 130
122 FrameTreeNode::~FrameTreeNode() { 131 FrameTreeNode::~FrameTreeNode() {
123 std::vector<std::unique_ptr<FrameTreeNode>>().swap(children_); 132 std::vector<std::unique_ptr<FrameTreeNode>>().swap(children_);
124 frame_tree_->FrameRemoved(this); 133 frame_tree_->FrameRemoved(this);
125 for (auto& observer : observers_) 134 for (auto& observer : observers_)
126 observer.OnFrameTreeNodeDestroyed(this); 135 observer.OnFrameTreeNodeDestroyed(this);
127 136
128 if (opener_) 137 if (opener_)
129 opener_->RemoveObserver(opener_observer_.get()); 138 opener_->RemoveObserver(opener_observer_.get());
139 if (original_opener_)
140 original_opener_->RemoveObserver(original_opener_observer_.get());
130 141
131 g_frame_tree_node_id_map.Get().erase(frame_tree_node_id_); 142 g_frame_tree_node_id_map.Get().erase(frame_tree_node_id_);
132 143
133 if (navigation_request_) { 144 if (navigation_request_) {
134 // PlzNavigate: if a frame with a pending navigation is detached, make sure 145 // PlzNavigate: if a frame with a pending navigation is detached, make sure
135 // the WebContents (and its observers) update their loading state. 146 // the WebContents (and its observers) update their loading state.
136 navigation_request_.reset(); 147 navigation_request_.reset();
137 DidStopLoading(); 148 DidStopLoading();
138 } 149 }
139 } 150 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 void FrameTreeNode::SetOpener(FrameTreeNode* opener) { 212 void FrameTreeNode::SetOpener(FrameTreeNode* opener) {
202 if (opener_) { 213 if (opener_) {
203 opener_->RemoveObserver(opener_observer_.get()); 214 opener_->RemoveObserver(opener_observer_.get());
204 opener_observer_.reset(); 215 opener_observer_.reset();
205 } 216 }
206 217
207 opener_ = opener; 218 opener_ = opener;
208 219
209 if (opener_) { 220 if (opener_) {
210 if (!opener_observer_) 221 if (!opener_observer_)
211 opener_observer_ = base::MakeUnique<OpenerDestroyedObserver>(this); 222 opener_observer_ = base::MakeUnique<OpenerDestroyedObserver>(this, false);
212 opener_->AddObserver(opener_observer_.get()); 223 opener_->AddObserver(opener_observer_.get());
213 } 224 }
214 } 225 }
215 226
227 void FrameTreeNode::SetOriginalOpener(FrameTreeNode* opener) {
228 DCHECK(!original_opener_ || !opener);
229
230 original_opener_ = opener;
231
232 if (original_opener_) {
233 DCHECK(!original_opener_observer_);
234 original_opener_observer_ =
235 base::MakeUnique<OpenerDestroyedObserver>(this, true);
236 original_opener_->AddObserver(original_opener_observer_.get());
237 }
238 }
239
216 void FrameTreeNode::SetCurrentURL(const GURL& url) { 240 void FrameTreeNode::SetCurrentURL(const GURL& url) {
217 if (!has_committed_real_load_ && url != url::kAboutBlankURL) 241 if (!has_committed_real_load_ && url != url::kAboutBlankURL)
218 has_committed_real_load_ = true; 242 has_committed_real_load_ = true;
219 current_frame_host()->set_last_committed_url(url); 243 current_frame_host()->set_last_committed_url(url);
220 blame_context_.TakeSnapshot(); 244 blame_context_.TakeSnapshot();
221 } 245 }
222 246
223 void FrameTreeNode::SetCurrentOrigin( 247 void FrameTreeNode::SetCurrentOrigin(
224 const url::Origin& origin, 248 const url::Origin& origin,
225 bool is_potentially_trustworthy_unique_origin) { 249 bool is_potentially_trustworthy_unique_origin) {
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 } 551 }
528 return parent_->child_at(i + relative_offset); 552 return parent_->child_at(i + relative_offset);
529 } 553 }
530 } 554 }
531 555
532 NOTREACHED() << "FrameTreeNode not found in its parent's children."; 556 NOTREACHED() << "FrameTreeNode not found in its parent's children.";
533 return nullptr; 557 return nullptr;
534 } 558 }
535 559
536 } // namespace content 560 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/frame_tree_node.h ('k') | content/browser/frame_host/render_frame_host_manager_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698