| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |