| 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;
|
|
|