blob: c69edeb7c73dca78581f0a80e8d8ef91d42ef4c9 [file] [log] [blame]
/*
* Copyright (C) 2006 Apple Computer, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef FrameTree_h
#define FrameTree_h
#include "core/CoreExport.h"
#include "platform/heap/Handle.h"
#include "wtf/text/AtomicString.h"
namespace blink {
class Frame;
class CORE_EXPORT FrameTree final {
WTF_MAKE_NONCOPYABLE(FrameTree);
DISALLOW_NEW();
public:
explicit FrameTree(Frame* thisFrame);
~FrameTree();
const AtomicString& name() const { return m_name; }
void setName(const AtomicString&);
// Unique name of a frame (unique per page). Mainly used to identify the
// frame for session history purposes, but also used in expected results
// of layout tests.
//
// The value should be treated as an unstructured, opaque string.
const AtomicString& uniqueName() const { return m_uniqueName; }
// Directly assigns both the name and uniqueName. Can be used when
// |uniqueName| is already known (i.e. when it has been precalculated by
// calculateUniqueNameForNewChildFrame OR when replicating the name between
// LocalFrames and RemoteFrames for the same logical frame).
void setPrecalculatedName(const AtomicString& name,
const AtomicString& uniqueName);
Frame* parent() const;
Frame* top() const;
Frame* nextSibling() const;
Frame* firstChild() const;
bool isDescendantOf(const Frame* ancestor) const;
Frame* traverseNext(const Frame* stayWithin = nullptr) const;
Frame* find(const AtomicString& name) const;
unsigned childCount() const;
Frame* scopedChild(unsigned index) const;
Frame* scopedChild(const AtomicString& name) const;
unsigned scopedChildCount() const;
void invalidateScopedChildCount();
DECLARE_TRACE();
AtomicString calculateUniqueNameForNewChildFrame(
const AtomicString& name,
const AtomicString& fallbackName = nullAtom) const;
private:
// Returns true if one of frames in the tree already has unique name equal
// to |uniqueNameCandidate|.
bool uniqueNameExists(const String& uniqueNameCandidate) const;
// Generates a hopefully-but-not-necessarily unique name based on frame's
// relative position in the tree and on unique names of ancestors.
String generateUniqueNameCandidate(bool existingChildFrame) const;
// Generates a hopefully-but-not-necessarily unique suffix based on |child|
// absolute position in the tree. If |child| is nullptr, calculations are
// made for a position that a new child of |this| would have.
String generateFramePosition(Frame* child) const;
// Concatenates |prefix|, |likelyUniqueSuffix| (and additional, internally
// generated suffix) until the result is a unique name, that doesn't exist
// elsewhere in the frame tree. Returns the unique name built in this way.
AtomicString appendUniqueSuffix(const String& prefix,
const String& likelyUniqueSuffix) const;
// Calculates a unique name for |child| frame (which might be nullptr if the
// child has not yet been created - i.e. when we need unique name for a new
// frame). Tries to use the |assignedName| or |fallbackName| if possible,
// otherwise falls back to generating a deterministic,
// stable-across-page-reloads string based on |child| position in the tree.
AtomicString calculateUniqueNameForChildFrame(
Frame* child,
const AtomicString& assignedName,
const AtomicString& fallbackName = nullAtom) const;
// Sets |m_uniqueName| and asserts its uniqueness.
void setUniqueName(const AtomicString&);
Member<Frame> m_thisFrame;
AtomicString m_name; // The actual frame name (may be empty).
AtomicString m_uniqueName;
mutable unsigned m_scopedChildCount;
};
} // namespace blink
#ifndef NDEBUG
// Outside the WebCore namespace for ease of invocation from gdb.
void showFrameTree(const blink::Frame*);
#endif
#endif // FrameTree_h