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

Unified Diff: content/browser/frame_host/frame_tree_node.cc

Issue 2679513002: Track the original opener of a webcontents so we can rely on it for popups (Closed)
Patch Set: 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/frame_host/frame_tree_node.cc
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index 57d92fd0121bb483226b603598b31b3ce545161b..5dc0d481db150a0423f8c1b338c1d76af4f76c28 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -51,16 +51,23 @@ void RecordUniqueNameLength(size_t length) {
// owner's opener if the opener is destroyed.
class FrameTreeNode::OpenerDestroyedObserver : public FrameTreeNode::Observer {
public:
- OpenerDestroyedObserver(FrameTreeNode* owner) : owner_(owner) {}
+ OpenerDestroyedObserver(FrameTreeNode* owner, bool observing_original_opener)
+ : owner_(owner), observing_original_opener_(observing_original_opener) {}
// FrameTreeNode::Observer
void OnFrameTreeNodeDestroyed(FrameTreeNode* node) override {
- CHECK_EQ(owner_->opener(), node);
- owner_->SetOpener(nullptr);
+ if (observing_original_opener_) {
+ CHECK_EQ(owner_->original_opener(), node);
+ owner_->SetOriginalOpener(nullptr);
+ } else {
+ CHECK_EQ(owner_->opener(), node);
+ owner_->SetOpener(nullptr);
+ }
}
private:
FrameTreeNode* owner_;
+ bool observing_original_opener_;
DISALLOW_COPY_AND_ASSIGN(OpenerDestroyedObserver);
};
@@ -95,6 +102,8 @@ FrameTreeNode::FrameTreeNode(FrameTree* frame_tree,
parent_(parent),
opener_(nullptr),
opener_observer_(nullptr),
+ original_opener_(nullptr),
+ original_opener_observer_(nullptr),
has_committed_real_load_(false),
replication_state_(
scope,
@@ -127,6 +136,8 @@ FrameTreeNode::~FrameTreeNode() {
if (opener_)
opener_->RemoveObserver(opener_observer_.get());
+ if (original_opener_)
+ original_opener_->RemoveObserver(original_opener_observer_.get());
g_frame_tree_node_id_map.Get().erase(frame_tree_node_id_);
@@ -208,11 +219,24 @@ void FrameTreeNode::SetOpener(FrameTreeNode* opener) {
if (opener_) {
if (!opener_observer_)
- opener_observer_ = base::MakeUnique<OpenerDestroyedObserver>(this);
+ opener_observer_ = base::MakeUnique<OpenerDestroyedObserver>(this, false);
opener_->AddObserver(opener_observer_.get());
}
}
+void FrameTreeNode::SetOriginalOpener(FrameTreeNode* opener) {
+ DCHECK(!original_opener_ || !opener);
+
+ original_opener_ = opener;
+
+ if (original_opener_) {
+ DCHECK(!original_opener_observer_);
+ original_opener_observer_ =
+ base::MakeUnique<OpenerDestroyedObserver>(this, true);
+ original_opener_->AddObserver(original_opener_observer_.get());
+ }
+}
+
void FrameTreeNode::SetCurrentURL(const GURL& url) {
if (!has_committed_real_load_ && url != url::kAboutBlankURL)
has_committed_real_load_ = true;
« 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