| Index: content/browser/frame_host/frame_tree_node.h
|
| diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h
|
| index 21fbf2785803dd05954053b255da7c95e817f143..19f87a3563b50260d1a191686ef5d9f2a1159224 100644
|
| --- a/content/browser/frame_host/frame_tree_node.h
|
| +++ b/content/browser/frame_host/frame_tree_node.h
|
| @@ -31,6 +31,14 @@ class RenderFrameHostImpl;
|
| // are frame-specific (as opposed to page-specific).
|
| class CONTENT_EXPORT FrameTreeNode {
|
| public:
|
| + class Observer {
|
| + public:
|
| + // Invoked when a FrameTreeNode is being destroyed.
|
| + virtual void OnFrameTreeNodeDestroyed(FrameTreeNode* node) {}
|
| +
|
| + virtual ~Observer() {}
|
| + };
|
| +
|
| // Returns the FrameTreeNode with the given global |frame_tree_node_id|,
|
| // regardless of which FrameTree it is in.
|
| static FrameTreeNode* GloballyFindByID(int frame_tree_node_id);
|
| @@ -47,6 +55,9 @@ class CONTENT_EXPORT FrameTreeNode {
|
|
|
| ~FrameTreeNode();
|
|
|
| + void AddObserver(Observer* observer);
|
| + void RemoveObserver(Observer* observer);
|
| +
|
| bool IsMainFrame() const;
|
|
|
| void AddChild(scoped_ptr<FrameTreeNode> child,
|
| @@ -83,6 +94,13 @@ class CONTENT_EXPORT FrameTreeNode {
|
|
|
| FrameTreeNode* parent() const { return parent_; }
|
|
|
| + FrameTreeNode* opener() const { return opener_; }
|
| +
|
| + // Assigns a new opener for this node and, if |opener| is non-null, registers
|
| + // an observer that will clear this node's opener if |opener| is ever
|
| + // destroyed.
|
| + void SetOpener(FrameTreeNode* opener);
|
| +
|
| FrameTreeNode* child_at(size_t index) const {
|
| return children_[index];
|
| }
|
| @@ -172,6 +190,8 @@ class CONTENT_EXPORT FrameTreeNode {
|
| void DidChangeLoadProgress(double load_progress);
|
|
|
| private:
|
| + class OpenerDestroyedObserver;
|
| +
|
| void set_parent(FrameTreeNode* parent) { parent_ = parent; }
|
|
|
| // The next available browser-global FrameTreeNode ID.
|
| @@ -198,6 +218,18 @@ class CONTENT_EXPORT FrameTreeNode {
|
| // not yet been attached to the frame tree.
|
| FrameTreeNode* parent_;
|
|
|
| + // The frame that opened this frame, if any. Will be set to null if the
|
| + // opener is closed, or if this frame disowns its opener by setting its
|
| + // window.opener to null.
|
| + FrameTreeNode* opener_;
|
| +
|
| + // An observer that clears this node's |opener_| if the opener is destroyed.
|
| + // This observer is added to the |opener_|'s observer list when the |opener_|
|
| + // is set to a non-null node, and it is removed from that list when |opener_|
|
| + // changes or when this node is destroyed. It is also cleared if |opener_|
|
| + // is disowned.
|
| + scoped_ptr<OpenerDestroyedObserver> opener_observer_;
|
| +
|
| // The immediate children of this specific frame.
|
| ScopedVector<FrameTreeNode> children_;
|
|
|
| @@ -229,6 +261,9 @@ class CONTENT_EXPORT FrameTreeNode {
|
| // be reset and a RenderFrameHost will be responsible for the navigation.
|
| scoped_ptr<NavigationRequest> navigation_request_;
|
|
|
| + // List of objects observing this FrameTreeNode.
|
| + base::ObserverList<Observer> observers_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(FrameTreeNode);
|
| };
|
|
|
|
|