summaryrefslogtreecommitdiffstats
path: root/layout/base/nsFrameManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'layout/base/nsFrameManager.h')
-rw-r--r--layout/base/nsFrameManager.h222
1 files changed, 222 insertions, 0 deletions
diff --git a/layout/base/nsFrameManager.h b/layout/base/nsFrameManager.h
new file mode 100644
index 000000000..1b9148314
--- /dev/null
+++ b/layout/base/nsFrameManager.h
@@ -0,0 +1,222 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim:cindent:ts=2:et:sw=2:
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This Original Code has been modified by IBM Corporation. Modifications made
+ * by IBM described herein are Copyright (c) International Business Machines
+ * Corporation, 2000. Modifications to Mozilla code or documentation identified
+ * per MPL Section 3.3
+ *
+ * Date Modified by Description of modification
+ * 04/20/2000 IBM Corp. OS/2 VisualAge build.
+ */
+
+/* storage of the frame tree and information about it */
+
+#ifndef _nsFrameManager_h_
+#define _nsFrameManager_h_
+
+#include "nsFrameManagerBase.h"
+
+#include "nsFrameList.h"
+#include "nsIContent.h"
+#include "nsStyleContext.h"
+
+class nsContainerFrame;
+class nsPlaceholderFrame;
+
+namespace mozilla {
+/**
+ * Node in a linked list, containing the style for an element that
+ * does not have a frame but whose parent does have a frame.
+ */
+struct UndisplayedNode {
+ UndisplayedNode(nsIContent* aContent, nsStyleContext* aStyle)
+ : mContent(aContent),
+ mStyle(aStyle),
+ mNext(nullptr)
+ {
+ MOZ_COUNT_CTOR(mozilla::UndisplayedNode);
+ }
+
+ ~UndisplayedNode()
+ {
+ MOZ_COUNT_DTOR(mozilla::UndisplayedNode);
+
+ // Delete mNext iteratively to avoid blowing up the stack (bug 460461).
+ UndisplayedNode* cur = mNext;
+ while (cur) {
+ UndisplayedNode* next = cur->mNext;
+ cur->mNext = nullptr;
+ delete cur;
+ cur = next;
+ }
+ }
+
+ nsCOMPtr<nsIContent> mContent;
+ RefPtr<nsStyleContext> mStyle;
+ UndisplayedNode* mNext;
+};
+
+} // namespace mozilla
+
+/**
+ * Frame manager interface. The frame manager serves two purposes:
+ * <li>provides a service for mapping from content to frame and from
+ * out-of-flow frame to placeholder frame.
+ * <li>handles structural modifications to the frame model. If the frame model
+ * lock can be acquired, then the changes are processed immediately; otherwise,
+ * they're queued and processed later.
+ *
+ * Do not add virtual methods (a vtable pointer) or members to this class, or
+ * else you'll break the validity of the reinterpret_cast in nsIPresShell's
+ * FrameManager() method.
+ */
+
+class nsFrameManager : public nsFrameManagerBase
+{
+ typedef mozilla::layout::FrameChildListID ChildListID;
+
+public:
+ explicit nsFrameManager(nsIPresShell* aPresShell) {
+ mPresShell = aPresShell;
+ MOZ_ASSERT(mPresShell, "need a pres shell");
+ }
+ ~nsFrameManager();
+
+ /*
+ * After Destroy is called, it is an error to call any FrameManager methods.
+ * Destroy should be called when the frame tree managed by the frame
+ * manager is no longer being displayed.
+ */
+ void Destroy();
+
+ // Placeholder frame functions
+ nsPlaceholderFrame* GetPlaceholderFrameFor(const nsIFrame* aFrame);
+ void RegisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame);
+ void UnregisterPlaceholderFrame(nsPlaceholderFrame* aPlaceholderFrame);
+
+ void ClearPlaceholderFrameMap();
+
+ // Mapping undisplayed content
+ nsStyleContext* GetUndisplayedContent(nsIContent* aContent)
+ {
+ if (!mUndisplayedMap) {
+ return nullptr;
+ }
+ return GetStyleContextInMap(mUndisplayedMap, aContent);
+ }
+ mozilla::UndisplayedNode*
+ GetAllUndisplayedContentIn(nsIContent* aParentContent);
+ void SetUndisplayedContent(nsIContent* aContent,
+ nsStyleContext* aStyleContext);
+ void ChangeUndisplayedContent(nsIContent* aContent,
+ nsStyleContext* aStyleContext)
+ {
+ ChangeStyleContextInMap(mUndisplayedMap, aContent, aStyleContext);
+ }
+
+ void ClearUndisplayedContentIn(nsIContent* aContent,
+ nsIContent* aParentContent);
+ void ClearAllUndisplayedContentIn(nsIContent* aParentContent);
+
+ // display:contents related methods:
+ /**
+ * Return the registered display:contents style context for aContent, if any.
+ */
+ nsStyleContext* GetDisplayContentsStyleFor(nsIContent* aContent)
+ {
+ if (!mDisplayContentsMap) {
+ return nullptr;
+ }
+ return GetStyleContextInMap(mDisplayContentsMap, aContent);
+ }
+
+ /**
+ * Return the linked list of UndisplayedNodes containing the registered
+ * display:contents children of aParentContent, if any.
+ */
+ mozilla::UndisplayedNode* GetAllDisplayContentsIn(nsIContent* aParentContent);
+ /**
+ * Register aContent having a display:contents style context.
+ */
+ void SetDisplayContents(nsIContent* aContent,
+ nsStyleContext* aStyleContext);
+ /**
+ * Change the registered style context for aContent to aStyleContext.
+ */
+ void ChangeDisplayContents(nsIContent* aContent,
+ nsStyleContext* aStyleContext)
+ {
+ ChangeStyleContextInMap(mDisplayContentsMap, aContent, aStyleContext);
+ }
+
+ /**
+ * Unregister the display:contents style context for aContent, if any.
+ * If found, then also unregister any display:contents and display:none
+ * style contexts for its descendants.
+ */
+ void ClearDisplayContentsIn(nsIContent* aContent,
+ nsIContent* aParentContent);
+ void ClearAllDisplayContentsIn(nsIContent* aParentContent);
+
+ // Functions for manipulating the frame model
+ void AppendFrames(nsContainerFrame* aParentFrame,
+ ChildListID aListID,
+ nsFrameList& aFrameList);
+
+ void InsertFrames(nsContainerFrame* aParentFrame,
+ ChildListID aListID,
+ nsIFrame* aPrevFrame,
+ nsFrameList& aFrameList);
+
+ void RemoveFrame(ChildListID aListID,
+ nsIFrame* aOldFrame);
+
+ /*
+ * Notification that a frame is about to be destroyed. This allows any
+ * outstanding references to the frame to be cleaned up.
+ */
+ void NotifyDestroyingFrame(nsIFrame* aFrame);
+
+ /*
+ * Capture/restore frame state for the frame subtree rooted at aFrame.
+ * aState is the document state storage object onto which each frame
+ * stores its state. Callers of CaptureFrameState are responsible for
+ * traversing next continuations of special siblings of aFrame as
+ * needed; this method will only work with actual frametree descendants
+ * of aFrame.
+ */
+
+ void CaptureFrameState(nsIFrame* aFrame,
+ nsILayoutHistoryState* aState);
+
+ void RestoreFrameState(nsIFrame* aFrame,
+ nsILayoutHistoryState* aState);
+
+ /*
+ * Add/restore state for one frame
+ */
+ void CaptureFrameStateFor(nsIFrame* aFrame,
+ nsILayoutHistoryState* aState);
+
+ void RestoreFrameStateFor(nsIFrame* aFrame,
+ nsILayoutHistoryState* aState);
+protected:
+ static nsStyleContext* GetStyleContextInMap(UndisplayedMap* aMap,
+ nsIContent* aContent);
+ static mozilla::UndisplayedNode*
+ GetAllUndisplayedNodesInMapFor(UndisplayedMap* aMap,
+ nsIContent* aParentContent);
+ static void SetStyleContextInMap(UndisplayedMap* aMap,
+ nsIContent* aContent,
+ nsStyleContext* aStyleContext);
+ static void ChangeStyleContextInMap(UndisplayedMap* aMap,
+ nsIContent* aContent,
+ nsStyleContext* aStyleContext);
+};
+
+#endif