diff --git a/mozilla/content/xul/document/src/nsXULDocument.cpp b/mozilla/content/xul/document/src/nsXULDocument.cpp
index e906ac39b1a..436f913dd0d 100644
--- a/mozilla/content/xul/document/src/nsXULDocument.cpp
+++ b/mozilla/content/xul/document/src/nsXULDocument.cpp
@@ -63,7 +63,6 @@
#include "nsIDTD.h"
#include "nsIDocumentObserver.h"
#include "nsIFormControl.h"
-#include "nsIFrameReflow.h"
#include "nsIHTMLContent.h"
#include "nsIHTMLElementFactory.h"
#include "nsIInputStream.h"
@@ -112,6 +111,7 @@
#include "prlog.h"
#include "rdf.h"
#include "rdfutil.h"
+#include "nsIFrame.h"
//----------------------------------------------------------------------
//
diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp
index 49dd114d2e7..ef37fe8a2a7 100644
--- a/mozilla/docshell/base/nsWebShell.cpp
+++ b/mozilla/docshell/base/nsWebShell.cpp
@@ -47,6 +47,7 @@
#include "prprf.h"
#include "nsIPluginHost.h"
#include "nsplugin.h"
+#include "nsIFrame.h"
//#include "nsPluginsCID.h"
#include "nsIPluginManager.h"
#include "nsIPref.h"
@@ -65,7 +66,6 @@
#include "nsIDOMHTMLDocument.h"
#include "nsLayoutCID.h"
#include "nsIDOMRange.h"
-#include "nsIFrameReflow.h"
#include "stopwatch.h"
#include "nsILocaleService.h"
diff --git a/mozilla/layout/base/nsPresShell.cpp b/mozilla/layout/base/nsPresShell.cpp
index 8920e2255a3..8070e1c9a99 100644
--- a/mozilla/layout/base/nsPresShell.cpp
+++ b/mozilla/layout/base/nsPresShell.cpp
@@ -939,7 +939,6 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
nsSize maxSize(bounds.width, bounds.height);
nsHTMLReflowMetrics desiredSize(nsnull);
nsReflowStatus status;
- nsIHTMLReflow* htmlReflow;
nsIRenderingContext* rcx = nsnull;
CreateRenderingContext(rootFrame, &rcx);
@@ -947,18 +946,16 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
nsHTMLReflowState reflowState(*mPresContext, rootFrame,
eReflowReason_Initial, rcx, maxSize);
- if (NS_OK == rootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
- rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
- mPresContext->SetVisibleArea(nsRect(0,0,desiredSize.width,desiredSize.height));
+ rootFrame->Reflow(*mPresContext, desiredSize, reflowState, status);
+ rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
+ mPresContext->SetVisibleArea(nsRect(0,0,desiredSize.width,desiredSize.height));
#ifdef NS_DEBUG
- if (nsIFrame::GetVerifyTreeEnable()) {
- rootFrame->VerifyTree();
- }
-#endif
- VERIFY_STYLE_TREE;
+ if (nsIFrame::GetVerifyTreeEnable()) {
+ rootFrame->VerifyTree();
}
+#endif
+ VERIFY_STYLE_TREE;
NS_IF_RELEASE(rcx);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::InitialReflow"));
RAPTOR_STOPWATCH_DEBUGTRACE(("Stop: Reflow: PresShell::InitialReflow(), this=%p\n", this));
@@ -1019,7 +1016,6 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight)
nsSize maxSize(bounds.width, bounds.height);
nsHTMLReflowMetrics desiredSize(nsnull);
nsReflowStatus status;
- nsIHTMLReflow* htmlReflow;
nsIRenderingContext* rcx = nsnull;
CreateRenderingContext(rootFrame, &rcx);
@@ -1027,16 +1023,14 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight)
nsHTMLReflowState reflowState(*mPresContext, rootFrame,
eReflowReason_Resize, rcx, maxSize);
- if (NS_OK == rootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
- rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
+ rootFrame->Reflow(*mPresContext, desiredSize, reflowState, status);
+ rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
#ifdef NS_DEBUG
- if (nsIFrame::GetVerifyTreeEnable()) {
- rootFrame->VerifyTree();
- }
-#endif
- VERIFY_STYLE_TREE;
+ if (nsIFrame::GetVerifyTreeEnable()) {
+ rootFrame->VerifyTree();
}
+#endif
+ VERIFY_STYLE_TREE;
NS_IF_RELEASE(rcx);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::ResizeReflow"));
@@ -1198,7 +1192,6 @@ PresShell::StyleChangeReflow()
nsSize maxSize(bounds.width, bounds.height);
nsHTMLReflowMetrics desiredSize(nsnull);
nsReflowStatus status;
- nsIHTMLReflow* htmlReflow;
nsIRenderingContext* rcx = nsnull;
CreateRenderingContext(rootFrame, &rcx);
@@ -1207,16 +1200,14 @@ PresShell::StyleChangeReflow()
nsHTMLReflowState reflowState(*mPresContext, rootFrame,
eReflowReason_Resize, rcx, maxSize);
- if (NS_OK == rootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
- rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
+ rootFrame->Reflow(*mPresContext, desiredSize, reflowState, status);
+ rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
#ifdef NS_DEBUG
- if (nsIFrame::GetVerifyTreeEnable()) {
- rootFrame->VerifyTree();
- }
-#endif
- VERIFY_STYLE_TREE;
+ if (nsIFrame::GetVerifyTreeEnable()) {
+ rootFrame->VerifyTree();
}
+#endif
+ VERIFY_STYLE_TREE;
NS_IF_RELEASE(rcx);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::StyleChangeReflow"));
}
diff --git a/mozilla/layout/base/public/nsIFrame.h b/mozilla/layout/base/public/nsIFrame.h
index 8d637f97062..75868507667 100644
--- a/mozilla/layout/base/public/nsIFrame.h
+++ b/mozilla/layout/base/public/nsIFrame.h
@@ -23,7 +23,9 @@
#include "nsISupports.h"
#include "nsSize.h"
#include "nsGUIEvent.h"
+#include "nsStyleConsts.h"
#include "nsStyleStruct.h"
+#include "nsStyleCoord.h"
class nsIAtom;
class nsIContent;
@@ -41,6 +43,9 @@ class nsAutoString;
class nsString;
class nsIFocusTracker;
class nsStyleChangeList;
+class nsISpaceManager;
+class nsBlockFrame;
+class nsLineLayout;
struct nsPeekOffsetStruct;
struct nsPoint;
@@ -49,6 +54,9 @@ struct nsStyleStruct;
class nsIDOMRange;
class nsICaret;
struct PRLogModuleInfo;
+struct nsStyleDisplay;
+struct nsStylePosition;
+struct nsStyleSpacing;
// IID for the nsIFrame interface
// a6cf9050-15b3-11d2-932e-00805f8add32
@@ -177,6 +185,489 @@ enum nsSpread {
//----------------------------------------------------------------------
+/**
+ * Reflow metrics used to return the frame's desired size and alignment
+ * information.
+ *
+ * @see #Reflow()
+ */
+struct nsHTMLReflowMetrics {
+ nscoord width, height; // [OUT] desired width and height
+ nscoord ascent, descent; // [OUT] ascent and descent information
+
+ // Set this to null if you don't need to compute the max element size
+ nsSize* maxElementSize; // [IN OUT]
+
+ // Carried out bottom margin values. This is the collapsed
+ // (generational) bottom margin value.
+ nscoord mCarriedOutBottomMargin;
+
+ // For frames that have children that stick outside their rect
+ // (NS_FRAME_OUTSIDE_CHILDREN) this rectangle will contain the
+ // absolute bounds of the frame. Since the frame doesn't know where
+ // it is going to be positioned in its parent, the assumption is
+ // that it is placed at 0,0 when computing this area.
+ nsRect mCombinedArea;
+
+ nsHTMLReflowMetrics(nsSize* aMaxElementSize) {
+ maxElementSize = aMaxElementSize;
+ mCarriedOutBottomMargin = 0;
+ mCombinedArea.x = 0;
+ mCombinedArea.y = 0;
+ mCombinedArea.width = 0;
+ mCombinedArea.height = 0;
+
+ // XXX These are OUT parameters and so they shouldn't have to be
+ // initialized, but there are some bad frame classes that aren't
+ // properly setting them when returning from Reflow()...
+ width = height = 0;
+ ascent = descent = 0;
+ }
+
+ void AddBorderPaddingToMaxElementSize(const nsMargin& aBorderPadding) {
+ maxElementSize->width += aBorderPadding.left + aBorderPadding.right;
+ maxElementSize->height += aBorderPadding.top + aBorderPadding.bottom;
+ }
+};
+
+// Carried out margin flags
+#define NS_CARRIED_TOP_MARGIN_IS_AUTO 0x1
+#define NS_CARRIED_BOTTOM_MARGIN_IS_AUTO 0x2
+
+/**
+ * Constant used to indicate an unconstrained size.
+ *
+ * @see #Reflow()
+ */
+#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE
+
+/**
+ * The reason the frame is being reflowed.
+ *
+ * XXX Should probably be a #define so it can be extended for specialized
+ * reflow interfaces...
+ *
+ * @see nsReflowState
+ */
+enum nsReflowReason {
+ eReflowReason_Initial = 0, // initial reflow of a newly created frame
+ eReflowReason_Incremental = 1, // an incremental change has occured. see the reflow command for details
+ eReflowReason_Resize = 2, // general request to determine a desired size
+ eReflowReason_StyleChange = 3 // request to reflow because of a style change. Note: you must reflow
+ // all your child frames
+};
+
+//----------------------------------------------------------------------
+
+/**
+ * CSS Frame type. Included as part of the reflow state.
+ */
+typedef PRUint32 nsCSSFrameType;
+
+#define NS_CSS_FRAME_TYPE_UNKNOWN 0
+#define NS_CSS_FRAME_TYPE_INLINE 1
+#define NS_CSS_FRAME_TYPE_BLOCK 2 /* block-level in normal flow */
+#define NS_CSS_FRAME_TYPE_FLOATING 3
+#define NS_CSS_FRAME_TYPE_ABSOLUTE 4
+#define NS_CSS_FRAME_TYPE_INTERNAL_TABLE 5 /* row group frame, row frame, cell frame, ... */
+
+/**
+ * Bit-flag that indicates whether the element is replaced. Applies to inline,
+ * block-level, floating, and absolutely positioned elements
+ */
+#define NS_CSS_FRAME_TYPE_REPLACED 0x8000
+
+/**
+ * Helper macros for telling whether items are replaced
+ */
+#define NS_FRAME_IS_REPLACED(_ft) \
+ (NS_CSS_FRAME_TYPE_REPLACED == ((_ft) & NS_CSS_FRAME_TYPE_REPLACED))
+
+#define NS_FRAME_REPLACED(_ft) \
+ (NS_CSS_FRAME_TYPE_REPLACED | (_ft))
+
+/**
+ * A macro to extract the type. Masks off the 'replaced' bit-flag
+ */
+#define NS_FRAME_GET_TYPE(_ft) \
+ ((_ft) & ~NS_CSS_FRAME_TYPE_REPLACED)
+
+//----------------------------------------------------------------------
+
+#define NS_INTRINSICSIZE NS_UNCONSTRAINEDSIZE
+#define NS_AUTOHEIGHT NS_UNCONSTRAINEDSIZE
+#define NS_AUTOMARGIN NS_UNCONSTRAINEDSIZE
+
+/**
+ * Reflow state passed to a frame during reflow. The reflow states are linked
+ * together. The availableWidth and availableHeight represent the available
+ * space in which to reflow your frame, and are computed based on the parent
+ * frame's computed width and computed height. The available space is the total
+ * space including margins, border, padding, and content area. A value of
+ * NS_UNCONSTRAINEDSIZE means you can choose whatever size you want
+ *
+ * @see #Reflow()
+ */
+struct nsHTMLReflowState {
+ // pointer to parent's reflow state
+ const nsHTMLReflowState* parentReflowState;
+
+ // the frame being reflowed
+ nsIFrame* frame;
+
+ // the reason for the reflow
+ nsReflowReason reason;
+
+ // the reflow command. only set for eReflowReason_Incremental
+ nsIReflowCommand* reflowCommand;
+
+ // the available space in which to reflow
+ nscoord availableWidth, availableHeight;
+
+ // rendering context to use for measurement
+ nsIRenderingContext* rendContext;
+
+ // is the current context at the top of a page?
+ PRPackedBool isTopOfPage;
+
+ // The type of frame, from css's perspective. This value is
+ // initialized by the Init method below.
+ nsCSSFrameType mFrameType;
+
+ nsISpaceManager* mSpaceManager;
+
+ // LineLayout object (only for inline reflow; set to NULL otherwise)
+ nsLineLayout* mLineLayout;
+
+ // The computed width specifies the frame's content width, and it does not
+ // apply to inline non-replaced elements
+ //
+ // For replaced inline frames, a value of NS_INTRINSICSIZE means you should
+ // use your intrinsic width as the computed width
+ //
+ // For block-level frames, the computed width is based on the width of the
+ // containing block, the margin/border/padding areas, and the min/max width
+ nscoord mComputedWidth;
+
+ // The computed height specifies the frame's content height, and it does
+ // not apply to inline non-replaced elements
+ //
+ // For replaced inline frames, a value of NS_INTRINSICSIZE means you should
+ // use your intrinsic height as the computed height
+ //
+ // For non-replaced block-level frames in the flow and floated, a value of
+ // NS_AUTOHEIGHT means you choose a height to shrink wrap around the normal
+ // flow child frames. The height must be within the limit of the min/max
+ // height if there is such a limit
+ //
+ // For replaced block-level frames, a value of NS_INTRINSICSIZE
+ // means you use your intrinsic height as the computed height
+ nscoord mComputedHeight;
+
+ // Computed margin values
+ nsMargin mComputedMargin;
+
+ // Cached copy of the border values
+ nsMargin mComputedBorderPadding;
+
+ // Computed padding values
+ nsMargin mComputedPadding;
+
+ // Computed values for 'left/top/right/bottom' offsets. Only applies to
+ // 'positioned' elements
+ nsMargin mComputedOffsets;
+
+ // Computed values for 'min-width/max-width' and 'min-height/max-height'
+ nscoord mComputedMinWidth, mComputedMaxWidth;
+ nscoord mComputedMinHeight, mComputedMaxHeight;
+
+ // Compact margin available space
+ nscoord mCompactMarginWidth;
+
+ // The following data members are relevant if nsStyleText.mTextAlign
+ // == NS_STYLE_TEXT_ALIGN_CHAR
+
+ // distance from reference edge (as specified in nsStyleDisplay.mDirection)
+ // to the align character (which will be specified in nsStyleTable)
+ nscoord mAlignCharOffset;
+
+ // if true, the reflow honors alignCharOffset and does not
+ // set it. if false, the reflow sets alignCharOffset
+ PRPackedBool mUseAlignCharOffset;
+
+ // Cached pointers to the various style structs used during intialization
+ const nsStyleDisplay* mStyleDisplay;
+ const nsStylePosition* mStylePosition;
+ const nsStyleSpacing* mStyleSpacing;
+
+ // This value keeps track of how deeply nested a given reflow state
+ // is from the top of the frame tree.
+ PRInt32 mReflowDepth;
+
+ // Note: The copy constructor is written by the compiler
+ // automatically. You can use that and then override specific values
+ // if you want, or you can call Init as desired...
+
+ // Initialize a root reflow state with a rendering context to
+ // use for measuring things.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ nsIFrame* aFrame,
+ nsReflowReason aReason,
+ nsIRenderingContext* aRenderingContext,
+ const nsSize& aAvailableSpace);
+
+ // Initialize a root reflow state for an incremental
+ // reflow.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ nsIFrame* aFrame,
+ nsIReflowCommand& aReflowCommand,
+ nsIRenderingContext* aRenderingContext,
+ const nsSize& aAvailableSpace);
+
+ // Initialize a reflow state for a child frames reflow. Some state
+ // is copied from the parent reflow state; the remaining state is
+ // computed.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ const nsHTMLReflowState& aParentReflowState,
+ nsIFrame* aFrame,
+ const nsSize& aAvailableSpace,
+ nsReflowReason aReason);
+
+ // Same as the previous except that the reason is taken from the
+ // parent's reflow state.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ const nsHTMLReflowState& aParentReflowState,
+ nsIFrame* aFrame,
+ const nsSize& aAvailableSpace);
+
+ // Used when you want to override the default containing block
+ // width and height. Used by absolute positioning code
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ const nsHTMLReflowState& aParentReflowState,
+ nsIFrame* aFrame,
+ const nsSize& aAvailableSpace,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ /**
+ * Get the containing block reflow state, starting from a frames
+ * parent reflow state (the parent reflow state may or may not end
+ * up being the containing block reflow state)
+ */
+ static const nsHTMLReflowState*
+ GetContainingBlockReflowState(const nsHTMLReflowState* aParentRS);
+
+ /**
+ * First find the containing block's reflow state using
+ * GetContainingBlockReflowState, then ask the containing block for
+ * it's content width using GetContentWidth
+ */
+ static nscoord
+ GetContainingBlockContentWidth(const nsHTMLReflowState* aParentRS);
+
+ /**
+ * Get the page box reflow state, starting from a frames
+ * parent reflow state (the parent reflow state may or may not end
+ * up being the containing block reflow state)
+ */
+ static const nsHTMLReflowState*
+ GetPageBoxReflowState(const nsHTMLReflowState* aParentRS);
+
+ /**
+ * Compute the border plus padding for aFrame. If a
+ * percentage needs to be computed it will be computed by finding
+ * the containing block, use GetContainingBlockReflowState.
+ * aParentReflowState is aFrame's
+ * parent's reflow state. The resulting computed border plus padding
+ * is returned in aResult.
+ */
+ static void ComputeBorderPaddingFor(nsIFrame* aFrame,
+ const nsHTMLReflowState* aParentRS,
+ nsMargin& aResult);
+
+ /**
+ * Calculate the raw line-height property for the given frame. The return
+ * value, if line-height was applied and is valid will be >= 0. Otherwise,
+ * the return value will be <0 which is illegal (CSS2 spec: section 10.8.1).
+ */
+ static nscoord CalcLineHeight(nsIPresContext& aPresContext,
+ nsIRenderingContext* aRenderingContext,
+ nsIFrame* aFrame);
+
+ static PRBool UseComputedHeight();
+
+ static nsCSSFrameType DetermineFrameType(nsIFrame* aFrame);
+
+ void ComputeContainingBlockRectangle(const nsHTMLReflowState* aContainingBlockRS,
+ nscoord& aContainingBlockWidth,
+ nscoord& aContainingBlockHeight);
+
+protected:
+ // This method initializes various data members. It is automatically
+ // called by the various constructors
+ void Init(nsIPresContext& aPresContext,
+ nscoord aContainingBlockWidth = -1,
+ nscoord aContainingBlockHeight = -1);
+
+ void InitConstraints(nsIPresContext& aPresContext,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void InitAbsoluteConstraints(nsIPresContext& aPresContext,
+ const nsHTMLReflowState* cbrs,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void ComputeRelativeOffsets(const nsHTMLReflowState* cbrs,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void ComputeBlockBoxData(nsIPresContext& aPresContext,
+ const nsHTMLReflowState* cbrs,
+ nsStyleUnit aWidthUnit,
+ nsStyleUnit aHeightUnit,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void CalculateBlockSideMargins(const nsHTMLReflowState* aContainingBlockRS,
+ nscoord aComputedWidth);
+
+ void ComputeHorizontalValue(nscoord aContainingBlockWidth,
+ nsStyleUnit aUnit,
+ const nsStyleCoord& aCoord,
+ nscoord& aResult);
+
+ void ComputeVerticalValue(nscoord aContainingBlockHeight,
+ nsStyleUnit aUnit,
+ const nsStyleCoord& aCoord,
+ nscoord& aResult);
+
+ static nsCSSFrameType DetermineFrameType(nsIFrame* aFrame,
+ const nsStylePosition* aPosition,
+ const nsStyleDisplay* aDisplay);
+
+ // Computes margin values from the specified margin style information, and
+ // fills in the mComputedMargin member
+ void ComputeMargin(nscoord aContainingBlockWidth,
+ const nsHTMLReflowState* aContainingBlockRS);
+
+ // Computes padding values from the specified padding style information, and
+ // fills in the mComputedPadding member
+ void ComputePadding(nscoord aContainingBlockWidth,
+ const nsHTMLReflowState* aContainingBlockRS);
+
+ // Calculates the computed values for the 'min-Width', 'max-Width',
+ // 'min-Height', and 'max-Height' properties, and stores them in the assorted
+ // data members
+ void ComputeMinMaxValues(nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight,
+ const nsHTMLReflowState* aContainingBlockRS);
+
+};
+
+// For HTML reflow we rename with the different paint layers are
+// actually used for.
+#define NS_FRAME_PAINT_LAYER_BACKGROUND eFramePaintLayer_Underlay
+#define NS_FRAME_PAINT_LAYER_FLOATERS eFramePaintLayer_Content
+#define NS_FRAME_PAINT_LAYER_FOREGROUND eFramePaintLayer_Overlay
+#define NS_FRAME_PAINT_LAYER_DEBUG eFramePaintLayer_Overlay
+
+/**
+ * Reflow status returned by the reflow methods.
+ *
+ * NS_FRAME_NOT_COMPLETE bit flag means the frame does not map all its
+ * content, and that the parent frame should create a continuing frame.
+ * If this bit isn't set it means the frame does map all its content.
+ *
+ * NS_FRAME_REFLOW_NEXTINFLOW bit flag means that the next-in-flow is
+ * dirty, and also needs to be reflowed. This status only makes sense
+ * for a frame that is not complete, i.e. you wouldn't set both
+ * NS_FRAME_COMPLETE and NS_FRAME_REFLOW_NEXTINFLOW
+ *
+ * The low 8 bits of the nsReflowStatus are reserved for future extensions;
+ * the remaining 24 bits are zero (and available for extensions; however
+ * API's that accept/return nsReflowStatus must not receive/return any
+ * extension bits).
+ *
+ * @see #Reflow()
+ */
+typedef PRUint32 nsReflowStatus;
+
+#define NS_FRAME_COMPLETE 0 // Note: not a bit!
+#define NS_FRAME_NOT_COMPLETE 0x1
+#define NS_FRAME_REFLOW_NEXTINFLOW 0x2
+
+#define NS_FRAME_IS_COMPLETE(status) \
+ (0 == ((status) & NS_FRAME_NOT_COMPLETE))
+
+#define NS_FRAME_IS_NOT_COMPLETE(status) \
+ (0 != ((status) & NS_FRAME_NOT_COMPLETE))
+
+// This macro tests to see if an nsReflowStatus is an error value
+// or just a regular return value
+#define NS_IS_REFLOW_ERROR(_status) (PRInt32(_status) < 0)
+
+/**
+ * Extensions to the reflow status bits defined by nsIFrameReflow
+ */
+
+// This bit is set, when a break is requested. This bit is orthogonal
+// to the nsIFrame::nsReflowStatus completion bits.
+#define NS_INLINE_BREAK 0x0100
+
+// When a break is requested, this bit when set indicates that the
+// break should occur after the frame just reflowed; when the bit is
+// clear the break should occur before the frame just reflowed.
+#define NS_INLINE_BREAK_BEFORE 0x0000
+#define NS_INLINE_BREAK_AFTER 0x0200
+
+// The type of break requested can be found in these bits.
+#define NS_INLINE_BREAK_TYPE_MASK 0xF000
+
+//----------------------------------------
+// Macros that use those bits
+
+#define NS_INLINE_IS_BREAK(_status) \
+ (0 != ((_status) & NS_INLINE_BREAK))
+
+#define NS_INLINE_IS_BREAK_AFTER(_status) \
+ (0 != ((_status) & NS_INLINE_BREAK_AFTER))
+
+#define NS_INLINE_IS_BREAK_BEFORE(_status) \
+ (NS_INLINE_BREAK == ((_status) & (NS_INLINE_BREAK|NS_INLINE_BREAK_AFTER)))
+
+#define NS_INLINE_GET_BREAK_TYPE(_status) (((_status) >> 12) & 0xF)
+
+#define NS_INLINE_MAKE_BREAK_TYPE(_type) ((_type) << 12)
+
+// Construct a line-break-before status. Note that there is no
+// completion status for a line-break before because we *know* that
+// the frame will be reflowed later and hence it's current completion
+// status doesn't matter.
+#define NS_INLINE_LINE_BREAK_BEFORE() \
+ (NS_INLINE_BREAK | NS_INLINE_BREAK_BEFORE | \
+ NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE))
+
+// Take a completion status and add to it the desire to have a
+// line-break after. For this macro we do need the completion status
+// because the user of the status will need to know whether to
+// continue the frame or not.
+#define NS_INLINE_LINE_BREAK_AFTER(_completionStatus) \
+ ((_completionStatus) | NS_INLINE_BREAK | NS_INLINE_BREAK_AFTER | \
+ NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE))
+
+//----------------------------------------------------------------------
+
+/**
+ * DidReflow status values.
+ */
+typedef PRBool nsDidReflowStatus;
+
+#define NS_FRAME_REFLOW_NOT_FINISHED PR_FALSE
+#define NS_FRAME_REFLOW_FINISHED PR_TRUE
+
+//----------------------------------------------------------------------
+
/**
* A frame in the layout model. This interface is supported by all frame
* objects.
@@ -566,6 +1057,97 @@ public:
NS_IMETHOD GetNextInFlow(nsIFrame** aNextInFlow) const = 0;
NS_IMETHOD SetNextInFlow(nsIFrame*) = 0;
+ /**
+ * Pre-reflow hook. Before a frame is reflowed this method will be called.
+ * This call will always be invoked at least once before a subsequent Reflow
+ * and DidReflow call. It may be called more than once, In general you will
+ * receive on WillReflow notification before each Reflow request.
+ *
+ * XXX Is this really the semantics we want? Because we have the NS_FRAME_IN_REFLOW
+ * bit we can ensure we don't call it more than once...
+ */
+ NS_IMETHOD WillReflow(nsIPresContext& aPresContext) = 0;
+
+ /**
+ * The frame is given a maximum size and asked for its desired size.
+ * This is the frame's opportunity to reflow its children.
+ *
+ * @param aDesiredSize out parameter where you should return the
+ * desired size and ascent/descent info. You should include any
+ * space you want for border/padding in the desired size you return.
+ *
+ * It's okay to return a desired size that exceeds the max
+ * size if that's the smallest you can be, i.e. it's your
+ * minimum size.
+ *
+ * maxElementSize is an optional parameter for returning your
+ * maximum element size. If may be null in which case you
+ * don't have to compute a maximum element size. The
+ * maximum element size must be less than or equal to your
+ * desired size.
+ *
+ * For an incremental reflow you are responsible for invalidating
+ * any area within your frame that needs repainting (including
+ * borders). If your new desired size is different than your current
+ * size, then your parent frame is responsible for making sure that
+ * the difference between the two rects is repainted
+ *
+ * @param aReflowState information about your reflow including the reason
+ * for the reflow and the available space in which to lay out. Each
+ * dimension of the available space can either be constrained or
+ * unconstrained (a value of NS_UNCONSTRAINEDSIZE). If constrained
+ * you should choose a value that's less than or equal to the
+ * constrained size. If unconstrained you can choose as
+ * large a value as you like.
+ *
+ * Note that the available space can be negative. In this case you
+ * still must return an accurate desired size. If you're a container
+ * you must always reflow at least one frame regardless of the
+ * available space
+ *
+ * @param aStatus a return value indicating whether the frame is complete
+ * and whether the next-in-flow is dirty and needs to be reflowed
+ */
+ NS_IMETHOD Reflow(nsIPresContext& aPresContext,
+ nsHTMLReflowMetrics& aReflowMetrics,
+ const nsHTMLReflowState& aReflowState,
+ nsReflowStatus& aStatus) = 0;
+
+ /**
+ * Post-reflow hook. After a frame is reflowed this method will be called
+ * informing the frame that this reflow process is complete, and telling the
+ * frame the status returned by the Reflow member function.
+ *
+ * This call may be invoked many times, while NS_FRAME_IN_REFLOW is set, before
+ * it is finally called once with a NS_FRAME_REFLOW_COMPLETE value. When called
+ * with a NS_FRAME_REFLOW_COMPLETE value the NS_FRAME_IN_REFLOW bit in the
+ * frame state will be cleared.
+ *
+ * XXX This doesn't make sense. If the frame is reflowed but not complete, then
+ * the status should be NS_FRAME_NOT_COMPLETE and not NS_FRAME_COMPLETE
+ * XXX Don't we want the semantics to dictate that we only call this once for
+ * a given reflow?
+ */
+ NS_IMETHOD DidReflow(nsIPresContext& aPresContext,
+ nsDidReflowStatus aStatus) = 0;
+
+ // XXX Maybe these three should be a separate interface?
+
+ // Helper method used by block reflow to identify runs of text so that
+ // proper word-breaking can be done.
+ NS_IMETHOD FindTextRuns(nsLineLayout& aLineLayout) = 0;
+
+ // Justification helper method used to distribute extra space in a
+ // line to leaf frames. aUsedSpace is filled in with the amount of
+ // space actually used.
+ NS_IMETHOD AdjustFrameSize(nscoord aExtraSpace, nscoord& aUsedSpace) = 0;
+
+ // Justification helper method that is used to remove trailing
+ // whitespace before justification.
+ NS_IMETHOD TrimTrailingWhiteSpace(nsIPresContext* aPresContext,
+ nsIRenderingContext& aRC,
+ nscoord& aDeltaWidth) = 0;
+
/**
* Accessor functions to get/set the associated view object
*/
diff --git a/mozilla/layout/base/public/nsIFrameReflow.h b/mozilla/layout/base/public/nsIFrameReflow.h
deleted file mode 100644
index e2c4c222b98..00000000000
--- a/mozilla/layout/base/public/nsIFrameReflow.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
-#ifndef nsIFrameReflow_h___
-#define nsIFrameReflow_h___
-
-#include "nslayout.h"
-#include "nsISupports.h"
-#include "nsSize.h"
-
-class nsIFrame;
-class nsIPresContext;
-class nsIReflowCommand;
-class nsIRenderingContext;
-
-//----------------------------------------------------------------------
-
-/**
- * Reflow metrics used to return the frame's desired size and alignment
- * information.
- *
- * @see #Reflow()
- * @see #GetReflowMetrics()
- */
-struct nsReflowMetrics {
- nscoord width, height; // [OUT] desired width and height
- nscoord ascent, descent; // [OUT] ascent and descent information
-
- // Set this to null if you don't need to compute the max element size
- nsSize* maxElementSize; // [IN OUT]
-
- nsReflowMetrics(nsSize* aMaxElementSize) {
- maxElementSize = aMaxElementSize;
-
- // XXX These are OUT parameters and so they shouldn't have to be
- // initialized, but there are some bad frame classes that aren't
- // properly setting them when returning from Reflow()...
- width = height = 0;
- ascent = descent = 0;
- }
-};
-
-//----------------------------------------------------------------------
-
-/**
- * Constant used to indicate an unconstrained size.
- *
- * @see #Reflow()
- */
-#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE
-
-//----------------------------------------------------------------------
-
-/**
- * The reason the frame is being reflowed.
- *
- * XXX Should probably be a #define so it can be extended for specialized
- * reflow interfaces...
- *
- * @see nsReflowState
- */
-enum nsReflowReason {
- eReflowReason_Initial = 0, // initial reflow of a newly created frame
- eReflowReason_Incremental = 1, // an incremental change has occured. see the reflow command for details
- eReflowReason_Resize = 2, // general request to determine a desired size
- eReflowReason_StyleChange = 3 // request to reflow because of a style change. Note: you must reflow
- // all your child frames
-};
-
-//----------------------------------------------------------------------
-
-/**
- * Reflow state passed to a frame during reflow. The reflow states are linked
- * together. The availableWidth and availableHeight represent the available
- * space in which to reflow your frame, and are computed based on the parent
- * frame's computed width and computed height. The available space is the total
- * space including margins, border, padding, and content area. A value of
- * NS_UNCONSTRAINEDSIZE means you can choose whatever size you want
- *
- * @see #Reflow()
- */
-struct nsReflowState {
- // pointer to parent's reflow state
- const nsReflowState* parentReflowState;
-
- // the frame being reflowed
- nsIFrame* frame;
-
- // the reason for the reflow
- nsReflowReason reason;
-
- // the reflow command. only set for eReflowReason_Incremental
- nsIReflowCommand* reflowCommand;
-
- // the available space in which to reflow
- nscoord availableWidth, availableHeight;
-
- // rendering context to use for measurement
- nsIRenderingContext* rendContext;
-
- // is the current context at the top of a page?
- PRPackedBool isTopOfPage;
-
- // Note: there is no copy constructor, so the compiler can generate an
- // optimal one.
-
-protected:
- nsReflowState() { }
-};
-
-//----------------------------------------------------------------------
-
-/**
- * Reflow status returned by the reflow methods.
- *
- * NS_FRAME_NOT_COMPLETE bit flag means the frame does not map all its
- * content, and that the parent frame should create a continuing frame.
- * If this bit isn't set it means the frame does map all its content.
- *
- * NS_FRAME_REFLOW_NEXTINFLOW bit flag means that the next-in-flow is
- * dirty, and also needs to be reflowed. This status only makes sense
- * for a frame that is not complete, i.e. you wouldn't set both
- * NS_FRAME_COMPLETE and NS_FRAME_REFLOW_NEXTINFLOW
- *
- * The low 8 bits of the nsReflowStatus are reserved for future extensions;
- * the remaining 24 bits are zero (and available for extensions; however
- * API's that accept/return nsReflowStatus must not receive/return any
- * extension bits).
- *
- * @see #Reflow()
- */
-typedef PRUint32 nsReflowStatus;
-
-#define NS_FRAME_COMPLETE 0 // Note: not a bit!
-#define NS_FRAME_NOT_COMPLETE 0x1
-#define NS_FRAME_REFLOW_NEXTINFLOW 0x2
-
-#define NS_FRAME_IS_COMPLETE(status) \
- (0 == ((status) & NS_FRAME_NOT_COMPLETE))
-
-#define NS_FRAME_IS_NOT_COMPLETE(status) \
- (0 != ((status) & NS_FRAME_NOT_COMPLETE))
-
-// This macro tests to see if an nsReflowStatus is an error value
-// or just a regular return value
-#define NS_IS_REFLOW_ERROR(_status) (PRInt32(_status) < 0)
-
-//----------------------------------------------------------------------
-
-/**
- * DidReflow status values.
- */
-typedef PRBool nsDidReflowStatus;
-
-#define NS_FRAME_REFLOW_NOT_FINISHED PR_FALSE
-#define NS_FRAME_REFLOW_FINISHED PR_TRUE
-
-//----------------------------------------------------------------------
-
-/**
- * Basic layout protocol.
- *
- * This template class defines the basic layout reflow protocol. You instantiate
- * a particular reflow interface by specifying the reflow state and reflow
- * metrics structures. These can be nsReflowState and nsReflowMetrics, or
- * they can be derived structures containing additional information.
- */
-template class nsIFrameReflow : public nsISupports {
-public:
- /**
- * Pre-reflow hook. Before a frame is reflowed this method will be called.
- * This call will always be invoked at least once before a subsequent Reflow
- * and DidReflow call. It may be called more than once, In general you will
- * receive on WillReflow notification before each Reflow request.
- *
- * XXX Is this really the semantics we want? Because we have the NS_FRAME_IN_REFLOW
- * bit we can ensure we don't call it more than once...
- */
- NS_IMETHOD WillReflow(nsIPresContext& aPresContext) = 0;
-
- /**
- * The frame is given a maximum size and asked for its desired size.
- * This is the frame's opportunity to reflow its children.
- *
- * @param aDesiredSize out parameter where you should return the
- * desired size and ascent/descent info. You should include any
- * space you want for border/padding in the desired size you return.
- *
- * It's okay to return a desired size that exceeds the max
- * size if that's the smallest you can be, i.e. it's your
- * minimum size.
- *
- * maxElementSize is an optional parameter for returning your
- * maximum element size. If may be null in which case you
- * don't have to compute a maximum element size. The
- * maximum element size must be less than or equal to your
- * desired size.
- *
- * For an incremental reflow you are responsible for invalidating
- * any area within your frame that needs repainting (including
- * borders). If your new desired size is different than your current
- * size, then your parent frame is responsible for making sure that
- * the difference between the two rects is repainted
- *
- * @param aReflowState information about your reflow including the reason
- * for the reflow and the available space in which to lay out. Each
- * dimension of the available space can either be constrained or
- * unconstrained (a value of NS_UNCONSTRAINEDSIZE). If constrained
- * you should choose a value that's less than or equal to the
- * constrained size. If unconstrained you can choose as
- * large a value as you like.
- *
- * Note that the available space can be negative. In this case you
- * still must return an accurate desired size. If you're a container
- * you must always reflow at least one frame regardless of the
- * available space
- *
- * @param aStatus a return value indicating whether the frame is complete
- * and whether the next-in-flow is dirty and needs to be reflowed
- */
- NS_IMETHOD Reflow(nsIPresContext& aPresContext,
- ReflowMetrics& aDesiredSize,
- const ReflowState& aReflowState,
- nsReflowStatus& aStatus) = 0;
-
- /**
- * Post-reflow hook. After a frame is reflowed this method will be called
- * informing the frame that this reflow process is complete, and telling the
- * frame the status returned by the Reflow member function.
- *
- * This call may be invoked many times, while NS_FRAME_IN_REFLOW is set, before
- * it is finally called once with a NS_FRAME_REFLOW_COMPLETE value. When called
- * with a NS_FRAME_REFLOW_COMPLETE value the NS_FRAME_IN_REFLOW bit in the
- * frame state will be cleared.
- *
- * XXX This doesn't make sense. If the frame is reflowed but not complete, then
- * the status should be NS_FRAME_NOT_COMPLETE and not NS_FRAME_COMPLETE
- * XXX Don't we want the semantics to dictate that we only call this once for
- * a given reflow?
- */
- NS_IMETHOD DidReflow(nsIPresContext& aPresContext,
- nsDidReflowStatus aStatus) = 0;
-
-private:
- NS_IMETHOD_(nsrefcnt) AddRef(void) = 0;
- NS_IMETHOD_(nsrefcnt) Release(void) = 0;
-};
-
-#endif /* nsIFrameReflow_h___ */
diff --git a/mozilla/layout/generic/nsAbsoluteContainingBlock.cpp b/mozilla/layout/generic/nsAbsoluteContainingBlock.cpp
index 4d02a172b09..742c0f48e4d 100644
--- a/mozilla/layout/generic/nsAbsoluteContainingBlock.cpp
+++ b/mozilla/layout/generic/nsAbsoluteContainingBlock.cpp
@@ -256,118 +256,114 @@ nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame* aDelegat
NS_NOTYETIMPLEMENTED("percentage border");
}
- nsIHTMLReflow* htmlReflow;
- rv = aKidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->WillReflow(aPresContext);
+ aKidFrame->WillReflow(aPresContext);
- nsSize availSize(aReflowState.mComputedWidth, NS_UNCONSTRAINEDSIZE);
- nsHTMLReflowMetrics kidDesiredSize(nsnull);
- nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
- availSize, aContainingBlockWidth,
- aContainingBlockHeight);
+ nsSize availSize(aReflowState.mComputedWidth, NS_UNCONSTRAINEDSIZE);
+ nsHTMLReflowMetrics kidDesiredSize(nsnull);
+ nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
+ availSize, aContainingBlockWidth,
+ aContainingBlockHeight);
- // If it's the initial reflow, then override the reflow reason. This is
- // used when frames are inserted incrementally
- if (aInitialReflow) {
- kidReflowState.reason = eReflowReason_Initial;
+ // If it's the initial reflow, then override the reflow reason. This is
+ // used when frames are inserted incrementally
+ if (aInitialReflow) {
+ kidReflowState.reason = eReflowReason_Initial;
+ }
+
+ rv = aKidFrame->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
+
+ // Because we don't know the size of a replaced element until after we reflow
+ // it 'auto' margins must be computed now, and we need to take into account
+ // min-max information
+ if (NS_FRAME_IS_REPLACED(kidReflowState.mFrameType)) {
+ // Factor in any minimum and maximum size information
+ if (kidDesiredSize.width > kidReflowState.mComputedMaxWidth) {
+ kidDesiredSize.width = kidReflowState.mComputedMaxWidth;
+ } else if (kidDesiredSize.width < kidReflowState.mComputedMinWidth) {
+ kidDesiredSize.width = kidReflowState.mComputedMinWidth;
+ }
+ if (kidDesiredSize.height > kidReflowState.mComputedMaxHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedMaxHeight;
+ } else if (kidDesiredSize.height < kidReflowState.mComputedMinHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedMinHeight;
}
- rv = htmlReflow->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
+ // Get the containing block width/height
+ nscoord containingBlockWidth, containingBlockHeight;
+ kidReflowState.ComputeContainingBlockRectangle(&aReflowState,
+ containingBlockWidth,
+ containingBlockHeight);
- // Because we don't know the size of a replaced element until after we reflow
- // it 'auto' margins must be computed now, and we need to take into account
- // min-max information
- if (NS_FRAME_IS_REPLACED(kidReflowState.mFrameType)) {
- // Factor in any minimum and maximum size information
- if (kidDesiredSize.width > kidReflowState.mComputedMaxWidth) {
- kidDesiredSize.width = kidReflowState.mComputedMaxWidth;
- } else if (kidDesiredSize.width < kidReflowState.mComputedMinWidth) {
- kidDesiredSize.width = kidReflowState.mComputedMinWidth;
- }
- if (kidDesiredSize.height > kidReflowState.mComputedMaxHeight) {
- kidDesiredSize.height = kidReflowState.mComputedMaxHeight;
- } else if (kidDesiredSize.height < kidReflowState.mComputedMinHeight) {
- kidDesiredSize.height = kidReflowState.mComputedMinHeight;
- }
+ // XXX This code belongs in nsHTMLReflowState...
+ if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) ||
+ (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right)) {
+ // Calculate the amount of space for margins
+ nscoord availMarginSpace = containingBlockWidth -
+ kidReflowState.mComputedOffsets.left - kidReflowState.mComputedBorderPadding.left -
+ kidDesiredSize.width - kidReflowState.mComputedBorderPadding.right -
+ kidReflowState.mComputedOffsets.right;
- // Get the containing block width/height
- nscoord containingBlockWidth, containingBlockHeight;
- kidReflowState.ComputeContainingBlockRectangle(&aReflowState,
- containingBlockWidth,
- containingBlockHeight);
-
- // XXX This code belongs in nsHTMLReflowState...
- if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) ||
- (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right)) {
- // Calculate the amount of space for margins
- nscoord availMarginSpace = containingBlockWidth -
- kidReflowState.mComputedOffsets.left - kidReflowState.mComputedBorderPadding.left -
- kidDesiredSize.width - kidReflowState.mComputedBorderPadding.right -
- kidReflowState.mComputedOffsets.right;
-
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) {
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right) {
- // Both 'margin-left' and 'margin-right' are 'auto', so they get
- // equal values
- kidReflowState.mComputedMargin.left = availMarginSpace / 2;
- kidReflowState.mComputedMargin.right = availMarginSpace -
- kidReflowState.mComputedMargin.left;
- } else {
- // Just 'margin-left' is 'auto'
- kidReflowState.mComputedMargin.left = availMarginSpace -
- kidReflowState.mComputedMargin.right;
- }
- } else {
- // Just 'margin-right' is 'auto'
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) {
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right) {
+ // Both 'margin-left' and 'margin-right' are 'auto', so they get
+ // equal values
+ kidReflowState.mComputedMargin.left = availMarginSpace / 2;
kidReflowState.mComputedMargin.right = availMarginSpace -
kidReflowState.mComputedMargin.left;
- }
- }
- if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) ||
- (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom)) {
- // Calculate the amount of space for margins
- nscoord availMarginSpace = containingBlockHeight -
- kidReflowState.mComputedOffsets.top - kidReflowState.mComputedBorderPadding.top -
- kidDesiredSize.height - kidReflowState.mComputedBorderPadding.bottom -
- kidReflowState.mComputedOffsets.bottom;
-
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) {
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom) {
- // Both 'margin-top' and 'margin-bottom' are 'auto', so they get
- // equal values
- kidReflowState.mComputedMargin.top = availMarginSpace / 2;
- kidReflowState.mComputedMargin.bottom = availMarginSpace -
- kidReflowState.mComputedMargin.top;
- } else {
- // Just 'margin-top' is 'auto'
- kidReflowState.mComputedMargin.top = availMarginSpace -
- kidReflowState.mComputedMargin.bottom;
- }
} else {
- // Just 'margin-bottom' is 'auto'
+ // Just 'margin-left' is 'auto'
+ kidReflowState.mComputedMargin.left = availMarginSpace -
+ kidReflowState.mComputedMargin.right;
+ }
+ } else {
+ // Just 'margin-right' is 'auto'
+ kidReflowState.mComputedMargin.right = availMarginSpace -
+ kidReflowState.mComputedMargin.left;
+ }
+ }
+ if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) ||
+ (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom)) {
+ // Calculate the amount of space for margins
+ nscoord availMarginSpace = containingBlockHeight -
+ kidReflowState.mComputedOffsets.top - kidReflowState.mComputedBorderPadding.top -
+ kidDesiredSize.height - kidReflowState.mComputedBorderPadding.bottom -
+ kidReflowState.mComputedOffsets.bottom;
+
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) {
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom) {
+ // Both 'margin-top' and 'margin-bottom' are 'auto', so they get
+ // equal values
+ kidReflowState.mComputedMargin.top = availMarginSpace / 2;
kidReflowState.mComputedMargin.bottom = availMarginSpace -
kidReflowState.mComputedMargin.top;
+ } else {
+ // Just 'margin-top' is 'auto'
+ kidReflowState.mComputedMargin.top = availMarginSpace -
+ kidReflowState.mComputedMargin.bottom;
}
+ } else {
+ // Just 'margin-bottom' is 'auto'
+ kidReflowState.mComputedMargin.bottom = availMarginSpace -
+ kidReflowState.mComputedMargin.top;
}
}
-
- // XXX If the child had a fixed height, then make sure it respected it...
- if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
- if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
- kidDesiredSize.height = kidReflowState.mComputedHeight;
- kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
- kidReflowState.mComputedBorderPadding.bottom;
- }
- }
-
- // Position the child relative to our padding edge
- nsRect rect(border.left + kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
- border.top + kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
- kidDesiredSize.width, kidDesiredSize.height);
- aKidFrame->SetRect(&aPresContext, rect);
}
+ // XXX If the child had a fixed height, then make sure it respected it...
+ if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
+ if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedHeight;
+ kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
+ kidReflowState.mComputedBorderPadding.bottom;
+ }
+ }
+
+ // Position the child relative to our padding edge
+ nsRect rect(border.left + kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
+ border.top + kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
+ kidDesiredSize.width, kidDesiredSize.height);
+ aKidFrame->SetRect(&aPresContext, rect);
+
return rv;
}
diff --git a/mozilla/layout/generic/nsAbsoluteContainingBlock.h b/mozilla/layout/generic/nsAbsoluteContainingBlock.h
index 83fe0155dd4..8c2a8953eb1 100644
--- a/mozilla/layout/generic/nsAbsoluteContainingBlock.h
+++ b/mozilla/layout/generic/nsAbsoluteContainingBlock.h
@@ -19,7 +19,6 @@
#define nsAbsoluteContainingBlock_h___
#include "nslayout.h"
-#include "nsIHTMLReflow.h"
#include "nsFrameList.h"
class nsIAtom;
diff --git a/mozilla/layout/generic/nsBlockBandData.cpp b/mozilla/layout/generic/nsBlockBandData.cpp
index e03fd51d62e..43c95e7ba68 100644
--- a/mozilla/layout/generic/nsBlockBandData.cpp
+++ b/mozilla/layout/generic/nsBlockBandData.cpp
@@ -19,7 +19,6 @@
#include "nsCOMPtr.h"
#include "nsBlockBandData.h"
#include "nsIFrame.h"
-#include "nsIFrameReflow.h"
#include "nsIStyleContext.h"
#include "nsIPresContext.h"
#include "nsIPresShell.h"
diff --git a/mozilla/layout/generic/nsBlockFrame.cpp b/mozilla/layout/generic/nsBlockFrame.cpp
index 2848407a179..974f0a4b354 100644
--- a/mozilla/layout/generic/nsBlockFrame.cpp
+++ b/mozilla/layout/generic/nsBlockFrame.cpp
@@ -6380,14 +6380,10 @@ nsBlockFrame::ReflowBullet(nsBlockReflowState& aState,
availSize.height = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState reflowState(*aState.mPresContext, aState.mReflowState,
mBullet, availSize);
- nsIHTMLReflow* htmlReflow;
- nsresult rv = mBullet->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- nsReflowStatus status;
- htmlReflow->WillReflow(*aState.mPresContext);
- htmlReflow->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
- htmlReflow->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ nsReflowStatus status;
+ mBullet->WillReflow(*aState.mPresContext);
+ mBullet->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
+ mBullet->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
// Place the bullet now; use its right margin to distance it
// from the rest of the frames in the line
@@ -6452,12 +6448,9 @@ nsBlockFrame::ComputeTextRuns(nsIPresContext* aPresContext)
nsIFrame* frame = line->mFirstChild;
PRInt32 n = line->GetChildCount();
while (--n >= 0) {
- nsIHTMLReflow* hr;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&hr)) {
- nsresult rv = hr->FindTextRuns(textRunThingy);
- if (NS_OK != rv) {
- return rv;
- }
+ nsresult rv = frame->FindTextRuns(textRunThingy);
+ if (NS_OK != rv) {
+ return rv;
}
else {
// A frame that doesn't implement nsIHTMLReflow isn't text
diff --git a/mozilla/layout/generic/nsBlockReflowContext.cpp b/mozilla/layout/generic/nsBlockReflowContext.cpp
index c48c29ac937..fc6498eba74 100644
--- a/mozilla/layout/generic/nsBlockReflowContext.cpp
+++ b/mozilla/layout/generic/nsBlockReflowContext.cpp
@@ -221,12 +221,7 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
mY = y;
// Let frame know that we are reflowing it
- nsIHTMLReflow* htmlReflow;
- rv = aFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_FAILED(rv)) {
- return rv;
- }
- htmlReflow->WillReflow(*mPresContext);
+ aFrame->WillReflow(*mPresContext);
#ifdef DEBUG
mMetrics.width = nscoord(0xdeadbeef);
@@ -249,8 +244,8 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
nscoord tx = x - mOuterReflowState.mComputedBorderPadding.left;
nscoord ty = y - mOuterReflowState.mComputedBorderPadding.top;
mOuterReflowState.mSpaceManager->Translate(tx, ty);
- rv = htmlReflow->Reflow(*mPresContext, mMetrics, reflowState,
- aFrameReflowStatus);
+ rv = aFrame->Reflow(*mPresContext, mMetrics, reflowState,
+ aFrameReflowStatus);
mOuterReflowState.mSpaceManager->Translate(-tx, -ty);
#ifdef DEBUG
diff --git a/mozilla/layout/generic/nsBlockReflowContext.h b/mozilla/layout/generic/nsBlockReflowContext.h
index c7d91fb47bb..38449a59906 100644
--- a/mozilla/layout/generic/nsBlockReflowContext.h
+++ b/mozilla/layout/generic/nsBlockReflowContext.h
@@ -19,7 +19,7 @@
#ifndef nsBlockReflowContext_h___
#define nsBlockReflowContext_h___
-#include "nsIHTMLReflow.h"
+#include "nsIFrame.h"
class nsBlockFrame;
class nsIFrame;
diff --git a/mozilla/layout/generic/nsBlockReflowState.cpp b/mozilla/layout/generic/nsBlockReflowState.cpp
index 2848407a179..974f0a4b354 100644
--- a/mozilla/layout/generic/nsBlockReflowState.cpp
+++ b/mozilla/layout/generic/nsBlockReflowState.cpp
@@ -6380,14 +6380,10 @@ nsBlockFrame::ReflowBullet(nsBlockReflowState& aState,
availSize.height = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState reflowState(*aState.mPresContext, aState.mReflowState,
mBullet, availSize);
- nsIHTMLReflow* htmlReflow;
- nsresult rv = mBullet->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- nsReflowStatus status;
- htmlReflow->WillReflow(*aState.mPresContext);
- htmlReflow->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
- htmlReflow->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ nsReflowStatus status;
+ mBullet->WillReflow(*aState.mPresContext);
+ mBullet->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
+ mBullet->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
// Place the bullet now; use its right margin to distance it
// from the rest of the frames in the line
@@ -6452,12 +6448,9 @@ nsBlockFrame::ComputeTextRuns(nsIPresContext* aPresContext)
nsIFrame* frame = line->mFirstChild;
PRInt32 n = line->GetChildCount();
while (--n >= 0) {
- nsIHTMLReflow* hr;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&hr)) {
- nsresult rv = hr->FindTextRuns(textRunThingy);
- if (NS_OK != rv) {
- return rv;
- }
+ nsresult rv = frame->FindTextRuns(textRunThingy);
+ if (NS_OK != rv) {
+ return rv;
}
else {
// A frame that doesn't implement nsIHTMLReflow isn't text
diff --git a/mozilla/layout/generic/nsBlockReflowState.h b/mozilla/layout/generic/nsBlockReflowState.h
index 2848407a179..974f0a4b354 100644
--- a/mozilla/layout/generic/nsBlockReflowState.h
+++ b/mozilla/layout/generic/nsBlockReflowState.h
@@ -6380,14 +6380,10 @@ nsBlockFrame::ReflowBullet(nsBlockReflowState& aState,
availSize.height = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState reflowState(*aState.mPresContext, aState.mReflowState,
mBullet, availSize);
- nsIHTMLReflow* htmlReflow;
- nsresult rv = mBullet->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- nsReflowStatus status;
- htmlReflow->WillReflow(*aState.mPresContext);
- htmlReflow->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
- htmlReflow->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ nsReflowStatus status;
+ mBullet->WillReflow(*aState.mPresContext);
+ mBullet->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
+ mBullet->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
// Place the bullet now; use its right margin to distance it
// from the rest of the frames in the line
@@ -6452,12 +6448,9 @@ nsBlockFrame::ComputeTextRuns(nsIPresContext* aPresContext)
nsIFrame* frame = line->mFirstChild;
PRInt32 n = line->GetChildCount();
while (--n >= 0) {
- nsIHTMLReflow* hr;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&hr)) {
- nsresult rv = hr->FindTextRuns(textRunThingy);
- if (NS_OK != rv) {
- return rv;
- }
+ nsresult rv = frame->FindTextRuns(textRunThingy);
+ if (NS_OK != rv) {
+ return rv;
}
else {
// A frame that doesn't implement nsIHTMLReflow isn't text
diff --git a/mozilla/layout/generic/nsContainerFrame.cpp b/mozilla/layout/generic/nsContainerFrame.cpp
index b7d4bfd1678..76102af7c36 100644
--- a/mozilla/layout/generic/nsContainerFrame.cpp
+++ b/mozilla/layout/generic/nsContainerFrame.cpp
@@ -111,12 +111,7 @@ nsContainerFrame::DidReflow(nsIPresContext& aPresContext,
nsIFrame* kid;
FirstChild(listName, &kid);
while (nsnull != kid) {
- nsIHTMLReflow* htmlReflow;
- nsresult rv;
- rv = kid->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->DidReflow(aPresContext, aStatus);
- }
+ kid->DidReflow(aPresContext, aStatus);
kid->GetNextSibling(&kid);
}
NS_IF_RELEASE(listName);
@@ -354,13 +349,7 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
{
NS_PRECONDITION(aReflowState.frame == aKidFrame, "bad reflow state");
- // Query for the nsIHTMLReflow interface
- nsIHTMLReflow* htmlReflow;
- nsresult result;
- result = aKidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_FAILED(result)) {
- return result;
- }
+ nsresult result;
#ifdef DEBUG
nsSize* saveMaxElementSize = aDesiredSize.maxElementSize;
@@ -373,9 +362,9 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
#endif
// Send the WillReflow notification, and reflow the child frame
- htmlReflow->WillReflow(aPresContext);
- result = htmlReflow->Reflow(aPresContext, aDesiredSize, aReflowState,
- aStatus);
+ aKidFrame->WillReflow(aPresContext);
+ result = aKidFrame->Reflow(aPresContext, aDesiredSize, aReflowState,
+ aStatus);
#ifdef DEBUG
if (saveMaxElementSize != aDesiredSize.maxElementSize) {
diff --git a/mozilla/layout/generic/nsFirstLetterFrame.cpp b/mozilla/layout/generic/nsFirstLetterFrame.cpp
index 35fcd26d706..00c9a5e86e9 100644
--- a/mozilla/layout/generic/nsFirstLetterFrame.cpp
+++ b/mozilla/layout/generic/nsFirstLetterFrame.cpp
@@ -153,11 +153,7 @@ nsFirstLetterFrame::FindTextRuns(nsLineLayout& aLineLayout)
{
nsIFrame* frame = mFrames.FirstChild();
while (nsnull != frame) {
- nsIHTMLReflow* ihr;
- nsresult rv = frame->QueryInterface(kIHTMLReflowIID, (void**)&ihr);
- if (NS_SUCCEEDED(rv)) {
- ihr->FindTextRuns(aLineLayout);
- }
+ frame->FindTextRuns(aLineLayout);
frame->GetNextSibling(&frame);
}
return NS_OK;
@@ -209,13 +205,8 @@ nsFirstLetterFrame::Reflow(nsIPresContext& aPresContext,
rs.mLineLayout = ≪
ll.SetFirstLetterStyleOK(PR_TRUE);
- nsIHTMLReflow* htmlReflow;
- rv = kid->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_FAILED(rv)) {
- return rv;
- }
- htmlReflow->WillReflow(aPresContext);
- htmlReflow->Reflow(aPresContext, aMetrics, rs, aReflowStatus);
+ kid->WillReflow(aPresContext);
+ kid->Reflow(aPresContext, aMetrics, rs, aReflowStatus);
ll.EndLineReflow();
}
diff --git a/mozilla/layout/generic/nsFrame.cpp b/mozilla/layout/generic/nsFrame.cpp
index ea3f45c18c5..ea1a3fa58f1 100644
--- a/mozilla/layout/generic/nsFrame.cpp
+++ b/mozilla/layout/generic/nsFrame.cpp
@@ -220,10 +220,7 @@ nsresult nsFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
}
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kClassIID, kIFrameIID);
- if (aIID.Equals(kIHTMLReflowIID)) {
- *aInstancePtr = (void*)(nsIHTMLReflow*)this;
- return NS_OK;
- } else if (aIID.Equals(kClassIID) || aIID.Equals(kISupportsIID)) {
+ if (aIID.Equals(kClassIID) || aIID.Equals(kISupportsIID)) {
*aInstancePtr = (void*)this;
return NS_OK;
}
diff --git a/mozilla/layout/generic/nsFrame.h b/mozilla/layout/generic/nsFrame.h
index 846254d191e..0f2ef84071e 100644
--- a/mozilla/layout/generic/nsFrame.h
+++ b/mozilla/layout/generic/nsFrame.h
@@ -19,7 +19,6 @@
#define nsFrame_h___
#include "nsIFrame.h"
-#include "nsIHTMLReflow.h"
#include "nsRect.h"
#include "nsString.h"
#include "prlog.h"
@@ -93,7 +92,7 @@
* Sets the NS_FRAME_SYNCHRONIZE_FRAME_AND_VIEW bit, so the default
* behavior is to keep the frame and view position and size in sync.
*/
-class nsFrame : public nsIFrame, public nsIHTMLReflow
+class nsFrame : public nsIFrame
{
public:
/**
diff --git a/mozilla/layout/generic/nsFrameFrame.cpp b/mozilla/layout/generic/nsFrameFrame.cpp
index 44d69defcdf..a5bb183de4c 100644
--- a/mozilla/layout/generic/nsFrameFrame.cpp
+++ b/mozilla/layout/generic/nsFrameFrame.cpp
@@ -350,16 +350,12 @@ nsHTMLFrameOuterFrame::Reflow(nsIPresContext& aPresContext,
nsHTMLReflowMetrics kidMetrics(aDesiredSize.maxElementSize);
nsHTMLReflowState kidReflowState(aPresContext, aReflowState, firstChild,
innerSize);
- nsIHTMLReflow* htmlReflow;
-
- if (NS_OK == firstChild->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- ReflowChild(firstChild, aPresContext, kidMetrics, kidReflowState, aStatus);
- NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
+ ReflowChild(firstChild, aPresContext, kidMetrics, kidReflowState, aStatus);
+ NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
- // Place and size the child
- nsRect rect(offset.x, offset.y, innerSize.width, innerSize.height);
- firstChild->SetRect(&aPresContext, rect);
- }
+ // Place and size the child
+ nsRect rect(offset.x, offset.y, innerSize.width, innerSize.height);
+ firstChild->SetRect(&aPresContext, rect);
// XXX what should the max-element-size of an iframe be? Shouldn't
// iframe's normally shrink wrap around their content when they
diff --git a/mozilla/layout/generic/nsFrameSetFrame.cpp b/mozilla/layout/generic/nsFrameSetFrame.cpp
index 85e022b83e6..0a00b7ccf34 100644
--- a/mozilla/layout/generic/nsFrameSetFrame.cpp
+++ b/mozilla/layout/generic/nsFrameSetFrame.cpp
@@ -771,22 +771,19 @@ nsHTMLFramesetFrame::ReflowPlaceChild(nsIFrame* aChild,
}
// reflow and place the child
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == aChild->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- nsHTMLReflowState reflowState(aPresContext, aReflowState, aChild, aSize);
- nsHTMLReflowMetrics metrics(nsnull);
- metrics.width = aSize.width;
- metrics.height= aSize.height;
- nsReflowStatus status;
+ nsHTMLReflowState reflowState(aPresContext, aReflowState, aChild, aSize);
+ nsHTMLReflowMetrics metrics(nsnull);
+ metrics.width = aSize.width;
+ metrics.height= aSize.height;
+ nsReflowStatus status;
- ReflowChild(aChild, aPresContext, metrics, reflowState, status);
- NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "bad status");
+ ReflowChild(aChild, aPresContext, metrics, reflowState, status);
+ NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "bad status");
- // Place and size the child
- nsRect rect(aOffset.x, aOffset.y, aSize.width, aSize.height);
- aChild->SetRect(&aPresContext, rect);
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED); // this call is needed
- }
+ // Place and size the child
+ nsRect rect(aOffset.x, aOffset.y, aSize.width, aSize.height);
+ aChild->SetRect(&aPresContext, rect);
+ aChild->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED); // this call is needed
}
static
diff --git a/mozilla/layout/generic/nsHTMLFrame.cpp b/mozilla/layout/generic/nsHTMLFrame.cpp
index cc21a8e4f5d..68407464664 100644
--- a/mozilla/layout/generic/nsHTMLFrame.cpp
+++ b/mozilla/layout/generic/nsHTMLFrame.cpp
@@ -319,83 +319,80 @@ RootFrame::Reflow(nsIPresContext& aPresContext,
}
// Reflow the frame
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
- aStatus);
+ ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
+ aStatus);
- // The document element's background should cover the entire canvas, so
- // take into account the combined area and any space taken up by
- // absolutely positioned elements
- nsMargin border;
- nsFrameState kidState;
+ // The document element's background should cover the entire canvas, so
+ // take into account the combined area and any space taken up by
+ // absolutely positioned elements
+ nsMargin border;
+ nsFrameState kidState;
- if (!kidReflowState.mStyleSpacing->GetBorder(border)) {
- NS_NOTYETIMPLEMENTED("percentage border");
+ if (!kidReflowState.mStyleSpacing->GetBorder(border)) {
+ NS_NOTYETIMPLEMENTED("percentage border");
+ }
+ kidFrame->GetFrameState(&kidState);
+
+ // First check the combined area
+ if (NS_FRAME_OUTSIDE_CHILDREN & kidState) {
+ // The background covers the content area and padding area, so check
+ // for children sticking outside the child frame's padding edge
+ nscoord paddingEdgeX = kidDesiredSize.width - border.right;
+ nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
+
+ if (kidDesiredSize.mCombinedArea.XMost() > paddingEdgeX) {
+ kidDesiredSize.width = kidDesiredSize.mCombinedArea.XMost() +
+ border.right;
}
- kidFrame->GetFrameState(&kidState);
-
- // First check the combined area
- if (NS_FRAME_OUTSIDE_CHILDREN & kidState) {
- // The background covers the content area and padding area, so check
- // for children sticking outside the child frame's padding edge
- nscoord paddingEdgeX = kidDesiredSize.width - border.right;
- nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
-
- if (kidDesiredSize.mCombinedArea.XMost() > paddingEdgeX) {
- kidDesiredSize.width = kidDesiredSize.mCombinedArea.XMost() +
- border.right;
- }
- if (kidDesiredSize.mCombinedArea.YMost() > paddingEdgeY) {
- kidDesiredSize.height = kidDesiredSize.mCombinedArea.YMost() +
- border.bottom;
- }
+ if (kidDesiredSize.mCombinedArea.YMost() > paddingEdgeY) {
+ kidDesiredSize.height = kidDesiredSize.mCombinedArea.YMost() +
+ border.bottom;
}
+ }
- // XXX It would be nice if this were also part of the reflow metrics...
- nsIAreaFrame* areaFrame;
- if (NS_SUCCEEDED(kidFrame->QueryInterface(kAreaFrameIID, (void**)&areaFrame))) {
- // Get the x-most and y-most of the absolutely positioned children
- nscoord positionedXMost, positionedYMost;
- areaFrame->GetPositionedInfo(positionedXMost, positionedYMost);
-
- // The background covers the content area and padding area, so check
- // for children sticking outside the padding edge
- nscoord paddingEdgeX = kidDesiredSize.width - border.right;
- nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
+ // XXX It would be nice if this were also part of the reflow metrics...
+ nsIAreaFrame* areaFrame;
+ if (NS_SUCCEEDED(kidFrame->QueryInterface(kAreaFrameIID, (void**)&areaFrame))) {
+ // Get the x-most and y-most of the absolutely positioned children
+ nscoord positionedXMost, positionedYMost;
+ areaFrame->GetPositionedInfo(positionedXMost, positionedYMost);
+
+ // The background covers the content area and padding area, so check
+ // for children sticking outside the padding edge
+ nscoord paddingEdgeX = kidDesiredSize.width - border.right;
+ nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
- if (positionedXMost > paddingEdgeX) {
- kidDesiredSize.width = positionedXMost + border.right;
- }
- if (positionedYMost > paddingEdgeY) {
- kidDesiredSize.height = positionedYMost + border.bottom;
- }
+ if (positionedXMost > paddingEdgeX) {
+ kidDesiredSize.width = positionedXMost + border.right;
}
-
- // If our height is fixed, then make sure the child frame plus its top and
- // bottom margin is at least that high as well...
- if (NS_AUTOHEIGHT != aReflowState.mComputedHeight) {
- nscoord totalHeight = kidDesiredSize.height + kidReflowState.mComputedMargin.top +
- kidReflowState.mComputedMargin.bottom;
-
- if (totalHeight < aReflowState.mComputedHeight) {
- kidDesiredSize.height += aReflowState.mComputedHeight - totalHeight;
- }
+ if (positionedYMost > paddingEdgeY) {
+ kidDesiredSize.height = positionedYMost + border.bottom;
}
+ }
- // Position and size the child frame
- nsRect rect(kidReflowState.mComputedMargin.left, kidReflowState.mComputedMargin.top,
- kidDesiredSize.width, kidDesiredSize.height);
- kidFrame->SetRect(&aPresContext, rect);
+ // If our height is fixed, then make sure the child frame plus its top and
+ // bottom margin is at least that high as well...
+ if (NS_AUTOHEIGHT != aReflowState.mComputedHeight) {
+ nscoord totalHeight = kidDesiredSize.height + kidReflowState.mComputedMargin.top +
+ kidReflowState.mComputedMargin.bottom;
- // If the child frame was just inserted, then we're responsible for making sure
- // it repaints
- if (isDirtyChildReflow) {
- // Damage the area occupied by the deleted frame
- Invalidate(&aPresContext, rect, PR_FALSE);
+ if (totalHeight < aReflowState.mComputedHeight) {
+ kidDesiredSize.height += aReflowState.mComputedHeight - totalHeight;
}
}
+ // Position and size the child frame
+ nsRect rect(kidReflowState.mComputedMargin.left, kidReflowState.mComputedMargin.top,
+ kidDesiredSize.width, kidDesiredSize.height);
+ kidFrame->SetRect(&aPresContext, rect);
+
+ // If the child frame was just inserted, then we're responsible for making sure
+ // it repaints
+ if (isDirtyChildReflow) {
+ // Damage the area occupied by the deleted frame
+ Invalidate(&aPresContext, rect, PR_FALSE);
+ }
+
// Return our desired size
aDesiredSize.width = kidDesiredSize.width + kidReflowState.mComputedMargin.left +
kidReflowState.mComputedMargin.right;
@@ -405,7 +402,7 @@ RootFrame::Reflow(nsIPresContext& aPresContext,
aDesiredSize.descent = 0;
// XXX Don't completely ignore NS_FRAME_OUTSIDE_CHILDREN for child frames
// that stick out on the left or top edges...
-
+
// XXX Temporary hack. Remember this for later when our parent resizes us.
// See SetRect()
mNaturalHeight = aDesiredSize.height;
diff --git a/mozilla/layout/generic/nsHTMLReflowCommand.cpp b/mozilla/layout/generic/nsHTMLReflowCommand.cpp
index 4cc225bfd7f..0e82ee32699 100644
--- a/mozilla/layout/generic/nsHTMLReflowCommand.cpp
+++ b/mozilla/layout/generic/nsHTMLReflowCommand.cpp
@@ -19,7 +19,6 @@
#include "nsHTMLReflowCommand.h"
#include "nsHTMLParts.h"
#include "nsIFrame.h"
-#include "nsIHTMLReflow.h"
#include "nsIPresContext.h"
#include "nsIPresShell.h"
#include "nsIContent.h"
@@ -129,13 +128,9 @@ NS_IMETHODIMP nsHTMLReflowCommand::Dispatch(nsIPresContext& aPresContext,
nsHTMLReflowState reflowState(aPresContext, root, *this,
&aRendContext, aMaxSize);
-
- nsIHTMLReflow* htmlReflow;
nsReflowStatus status;
- if (NS_OK == root->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(aPresContext, aDesiredSize, reflowState, status);
- }
+ root->Reflow(aPresContext, aDesiredSize, reflowState, status);
}
return NS_OK;
diff --git a/mozilla/layout/generic/nsHTMLReflowState.cpp b/mozilla/layout/generic/nsHTMLReflowState.cpp
index 64dfa6ab1ee..37471b48468 100644
--- a/mozilla/layout/generic/nsHTMLReflowState.cpp
+++ b/mozilla/layout/generic/nsHTMLReflowState.cpp
@@ -20,7 +20,6 @@
#include "nsIStyleContext.h"
#include "nsStyleConsts.h"
#include "nsFrame.h"
-#include "nsIHTMLReflow.h"
#include "nsIContent.h"
#include "nsHTMLAtoms.h"
#include "nsIPresContext.h"
@@ -177,7 +176,7 @@ nsHTMLReflowState::Init(nsIPresContext& aPresContext,
}
const nsHTMLReflowState*
-nsHTMLReflowState::GetContainingBlockReflowState(const nsReflowState* aParentRS)
+nsHTMLReflowState::GetContainingBlockReflowState(const nsHTMLReflowState* aParentRS)
{
while (nsnull != aParentRS) {
if (nsnull != aParentRS->frame) {
@@ -186,7 +185,7 @@ nsHTMLReflowState::GetContainingBlockReflowState(const nsReflowState* aParentRS)
// reflow state...
nsresult rv = aParentRS->frame->IsPercentageBase(isContainingBlock);
if (NS_SUCCEEDED(rv) && isContainingBlock) {
- return (const nsHTMLReflowState*) aParentRS;
+ return aParentRS;
}
}
aParentRS = aParentRS->parentReflowState;
@@ -195,20 +194,20 @@ nsHTMLReflowState::GetContainingBlockReflowState(const nsReflowState* aParentRS)
}
const nsHTMLReflowState*
-nsHTMLReflowState::GetPageBoxReflowState(const nsReflowState* aParentRS)
+nsHTMLReflowState::GetPageBoxReflowState(const nsHTMLReflowState* aParentRS)
{
// XXX write me as soon as we can ask a frame if it's a page frame...
return nsnull;
}
nscoord
-nsHTMLReflowState::GetContainingBlockContentWidth(const nsReflowState* aParentRS)
+nsHTMLReflowState::GetContainingBlockContentWidth(const nsHTMLReflowState* aParentRS)
{
nscoord width = 0;
const nsHTMLReflowState* rs =
GetContainingBlockReflowState(aParentRS);
if (nsnull != rs) {
- return ((nsHTMLReflowState*)aParentRS)->mComputedWidth;/* XXX cast */
+ return aParentRS->mComputedWidth;
}
return width;
}
diff --git a/mozilla/layout/generic/nsIFrame.h b/mozilla/layout/generic/nsIFrame.h
index 8d637f97062..75868507667 100644
--- a/mozilla/layout/generic/nsIFrame.h
+++ b/mozilla/layout/generic/nsIFrame.h
@@ -23,7 +23,9 @@
#include "nsISupports.h"
#include "nsSize.h"
#include "nsGUIEvent.h"
+#include "nsStyleConsts.h"
#include "nsStyleStruct.h"
+#include "nsStyleCoord.h"
class nsIAtom;
class nsIContent;
@@ -41,6 +43,9 @@ class nsAutoString;
class nsString;
class nsIFocusTracker;
class nsStyleChangeList;
+class nsISpaceManager;
+class nsBlockFrame;
+class nsLineLayout;
struct nsPeekOffsetStruct;
struct nsPoint;
@@ -49,6 +54,9 @@ struct nsStyleStruct;
class nsIDOMRange;
class nsICaret;
struct PRLogModuleInfo;
+struct nsStyleDisplay;
+struct nsStylePosition;
+struct nsStyleSpacing;
// IID for the nsIFrame interface
// a6cf9050-15b3-11d2-932e-00805f8add32
@@ -177,6 +185,489 @@ enum nsSpread {
//----------------------------------------------------------------------
+/**
+ * Reflow metrics used to return the frame's desired size and alignment
+ * information.
+ *
+ * @see #Reflow()
+ */
+struct nsHTMLReflowMetrics {
+ nscoord width, height; // [OUT] desired width and height
+ nscoord ascent, descent; // [OUT] ascent and descent information
+
+ // Set this to null if you don't need to compute the max element size
+ nsSize* maxElementSize; // [IN OUT]
+
+ // Carried out bottom margin values. This is the collapsed
+ // (generational) bottom margin value.
+ nscoord mCarriedOutBottomMargin;
+
+ // For frames that have children that stick outside their rect
+ // (NS_FRAME_OUTSIDE_CHILDREN) this rectangle will contain the
+ // absolute bounds of the frame. Since the frame doesn't know where
+ // it is going to be positioned in its parent, the assumption is
+ // that it is placed at 0,0 when computing this area.
+ nsRect mCombinedArea;
+
+ nsHTMLReflowMetrics(nsSize* aMaxElementSize) {
+ maxElementSize = aMaxElementSize;
+ mCarriedOutBottomMargin = 0;
+ mCombinedArea.x = 0;
+ mCombinedArea.y = 0;
+ mCombinedArea.width = 0;
+ mCombinedArea.height = 0;
+
+ // XXX These are OUT parameters and so they shouldn't have to be
+ // initialized, but there are some bad frame classes that aren't
+ // properly setting them when returning from Reflow()...
+ width = height = 0;
+ ascent = descent = 0;
+ }
+
+ void AddBorderPaddingToMaxElementSize(const nsMargin& aBorderPadding) {
+ maxElementSize->width += aBorderPadding.left + aBorderPadding.right;
+ maxElementSize->height += aBorderPadding.top + aBorderPadding.bottom;
+ }
+};
+
+// Carried out margin flags
+#define NS_CARRIED_TOP_MARGIN_IS_AUTO 0x1
+#define NS_CARRIED_BOTTOM_MARGIN_IS_AUTO 0x2
+
+/**
+ * Constant used to indicate an unconstrained size.
+ *
+ * @see #Reflow()
+ */
+#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE
+
+/**
+ * The reason the frame is being reflowed.
+ *
+ * XXX Should probably be a #define so it can be extended for specialized
+ * reflow interfaces...
+ *
+ * @see nsReflowState
+ */
+enum nsReflowReason {
+ eReflowReason_Initial = 0, // initial reflow of a newly created frame
+ eReflowReason_Incremental = 1, // an incremental change has occured. see the reflow command for details
+ eReflowReason_Resize = 2, // general request to determine a desired size
+ eReflowReason_StyleChange = 3 // request to reflow because of a style change. Note: you must reflow
+ // all your child frames
+};
+
+//----------------------------------------------------------------------
+
+/**
+ * CSS Frame type. Included as part of the reflow state.
+ */
+typedef PRUint32 nsCSSFrameType;
+
+#define NS_CSS_FRAME_TYPE_UNKNOWN 0
+#define NS_CSS_FRAME_TYPE_INLINE 1
+#define NS_CSS_FRAME_TYPE_BLOCK 2 /* block-level in normal flow */
+#define NS_CSS_FRAME_TYPE_FLOATING 3
+#define NS_CSS_FRAME_TYPE_ABSOLUTE 4
+#define NS_CSS_FRAME_TYPE_INTERNAL_TABLE 5 /* row group frame, row frame, cell frame, ... */
+
+/**
+ * Bit-flag that indicates whether the element is replaced. Applies to inline,
+ * block-level, floating, and absolutely positioned elements
+ */
+#define NS_CSS_FRAME_TYPE_REPLACED 0x8000
+
+/**
+ * Helper macros for telling whether items are replaced
+ */
+#define NS_FRAME_IS_REPLACED(_ft) \
+ (NS_CSS_FRAME_TYPE_REPLACED == ((_ft) & NS_CSS_FRAME_TYPE_REPLACED))
+
+#define NS_FRAME_REPLACED(_ft) \
+ (NS_CSS_FRAME_TYPE_REPLACED | (_ft))
+
+/**
+ * A macro to extract the type. Masks off the 'replaced' bit-flag
+ */
+#define NS_FRAME_GET_TYPE(_ft) \
+ ((_ft) & ~NS_CSS_FRAME_TYPE_REPLACED)
+
+//----------------------------------------------------------------------
+
+#define NS_INTRINSICSIZE NS_UNCONSTRAINEDSIZE
+#define NS_AUTOHEIGHT NS_UNCONSTRAINEDSIZE
+#define NS_AUTOMARGIN NS_UNCONSTRAINEDSIZE
+
+/**
+ * Reflow state passed to a frame during reflow. The reflow states are linked
+ * together. The availableWidth and availableHeight represent the available
+ * space in which to reflow your frame, and are computed based on the parent
+ * frame's computed width and computed height. The available space is the total
+ * space including margins, border, padding, and content area. A value of
+ * NS_UNCONSTRAINEDSIZE means you can choose whatever size you want
+ *
+ * @see #Reflow()
+ */
+struct nsHTMLReflowState {
+ // pointer to parent's reflow state
+ const nsHTMLReflowState* parentReflowState;
+
+ // the frame being reflowed
+ nsIFrame* frame;
+
+ // the reason for the reflow
+ nsReflowReason reason;
+
+ // the reflow command. only set for eReflowReason_Incremental
+ nsIReflowCommand* reflowCommand;
+
+ // the available space in which to reflow
+ nscoord availableWidth, availableHeight;
+
+ // rendering context to use for measurement
+ nsIRenderingContext* rendContext;
+
+ // is the current context at the top of a page?
+ PRPackedBool isTopOfPage;
+
+ // The type of frame, from css's perspective. This value is
+ // initialized by the Init method below.
+ nsCSSFrameType mFrameType;
+
+ nsISpaceManager* mSpaceManager;
+
+ // LineLayout object (only for inline reflow; set to NULL otherwise)
+ nsLineLayout* mLineLayout;
+
+ // The computed width specifies the frame's content width, and it does not
+ // apply to inline non-replaced elements
+ //
+ // For replaced inline frames, a value of NS_INTRINSICSIZE means you should
+ // use your intrinsic width as the computed width
+ //
+ // For block-level frames, the computed width is based on the width of the
+ // containing block, the margin/border/padding areas, and the min/max width
+ nscoord mComputedWidth;
+
+ // The computed height specifies the frame's content height, and it does
+ // not apply to inline non-replaced elements
+ //
+ // For replaced inline frames, a value of NS_INTRINSICSIZE means you should
+ // use your intrinsic height as the computed height
+ //
+ // For non-replaced block-level frames in the flow and floated, a value of
+ // NS_AUTOHEIGHT means you choose a height to shrink wrap around the normal
+ // flow child frames. The height must be within the limit of the min/max
+ // height if there is such a limit
+ //
+ // For replaced block-level frames, a value of NS_INTRINSICSIZE
+ // means you use your intrinsic height as the computed height
+ nscoord mComputedHeight;
+
+ // Computed margin values
+ nsMargin mComputedMargin;
+
+ // Cached copy of the border values
+ nsMargin mComputedBorderPadding;
+
+ // Computed padding values
+ nsMargin mComputedPadding;
+
+ // Computed values for 'left/top/right/bottom' offsets. Only applies to
+ // 'positioned' elements
+ nsMargin mComputedOffsets;
+
+ // Computed values for 'min-width/max-width' and 'min-height/max-height'
+ nscoord mComputedMinWidth, mComputedMaxWidth;
+ nscoord mComputedMinHeight, mComputedMaxHeight;
+
+ // Compact margin available space
+ nscoord mCompactMarginWidth;
+
+ // The following data members are relevant if nsStyleText.mTextAlign
+ // == NS_STYLE_TEXT_ALIGN_CHAR
+
+ // distance from reference edge (as specified in nsStyleDisplay.mDirection)
+ // to the align character (which will be specified in nsStyleTable)
+ nscoord mAlignCharOffset;
+
+ // if true, the reflow honors alignCharOffset and does not
+ // set it. if false, the reflow sets alignCharOffset
+ PRPackedBool mUseAlignCharOffset;
+
+ // Cached pointers to the various style structs used during intialization
+ const nsStyleDisplay* mStyleDisplay;
+ const nsStylePosition* mStylePosition;
+ const nsStyleSpacing* mStyleSpacing;
+
+ // This value keeps track of how deeply nested a given reflow state
+ // is from the top of the frame tree.
+ PRInt32 mReflowDepth;
+
+ // Note: The copy constructor is written by the compiler
+ // automatically. You can use that and then override specific values
+ // if you want, or you can call Init as desired...
+
+ // Initialize a root reflow state with a rendering context to
+ // use for measuring things.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ nsIFrame* aFrame,
+ nsReflowReason aReason,
+ nsIRenderingContext* aRenderingContext,
+ const nsSize& aAvailableSpace);
+
+ // Initialize a root reflow state for an incremental
+ // reflow.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ nsIFrame* aFrame,
+ nsIReflowCommand& aReflowCommand,
+ nsIRenderingContext* aRenderingContext,
+ const nsSize& aAvailableSpace);
+
+ // Initialize a reflow state for a child frames reflow. Some state
+ // is copied from the parent reflow state; the remaining state is
+ // computed.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ const nsHTMLReflowState& aParentReflowState,
+ nsIFrame* aFrame,
+ const nsSize& aAvailableSpace,
+ nsReflowReason aReason);
+
+ // Same as the previous except that the reason is taken from the
+ // parent's reflow state.
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ const nsHTMLReflowState& aParentReflowState,
+ nsIFrame* aFrame,
+ const nsSize& aAvailableSpace);
+
+ // Used when you want to override the default containing block
+ // width and height. Used by absolute positioning code
+ nsHTMLReflowState(nsIPresContext& aPresContext,
+ const nsHTMLReflowState& aParentReflowState,
+ nsIFrame* aFrame,
+ const nsSize& aAvailableSpace,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ /**
+ * Get the containing block reflow state, starting from a frames
+ * parent reflow state (the parent reflow state may or may not end
+ * up being the containing block reflow state)
+ */
+ static const nsHTMLReflowState*
+ GetContainingBlockReflowState(const nsHTMLReflowState* aParentRS);
+
+ /**
+ * First find the containing block's reflow state using
+ * GetContainingBlockReflowState, then ask the containing block for
+ * it's content width using GetContentWidth
+ */
+ static nscoord
+ GetContainingBlockContentWidth(const nsHTMLReflowState* aParentRS);
+
+ /**
+ * Get the page box reflow state, starting from a frames
+ * parent reflow state (the parent reflow state may or may not end
+ * up being the containing block reflow state)
+ */
+ static const nsHTMLReflowState*
+ GetPageBoxReflowState(const nsHTMLReflowState* aParentRS);
+
+ /**
+ * Compute the border plus padding for aFrame. If a
+ * percentage needs to be computed it will be computed by finding
+ * the containing block, use GetContainingBlockReflowState.
+ * aParentReflowState is aFrame's
+ * parent's reflow state. The resulting computed border plus padding
+ * is returned in aResult.
+ */
+ static void ComputeBorderPaddingFor(nsIFrame* aFrame,
+ const nsHTMLReflowState* aParentRS,
+ nsMargin& aResult);
+
+ /**
+ * Calculate the raw line-height property for the given frame. The return
+ * value, if line-height was applied and is valid will be >= 0. Otherwise,
+ * the return value will be <0 which is illegal (CSS2 spec: section 10.8.1).
+ */
+ static nscoord CalcLineHeight(nsIPresContext& aPresContext,
+ nsIRenderingContext* aRenderingContext,
+ nsIFrame* aFrame);
+
+ static PRBool UseComputedHeight();
+
+ static nsCSSFrameType DetermineFrameType(nsIFrame* aFrame);
+
+ void ComputeContainingBlockRectangle(const nsHTMLReflowState* aContainingBlockRS,
+ nscoord& aContainingBlockWidth,
+ nscoord& aContainingBlockHeight);
+
+protected:
+ // This method initializes various data members. It is automatically
+ // called by the various constructors
+ void Init(nsIPresContext& aPresContext,
+ nscoord aContainingBlockWidth = -1,
+ nscoord aContainingBlockHeight = -1);
+
+ void InitConstraints(nsIPresContext& aPresContext,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void InitAbsoluteConstraints(nsIPresContext& aPresContext,
+ const nsHTMLReflowState* cbrs,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void ComputeRelativeOffsets(const nsHTMLReflowState* cbrs,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void ComputeBlockBoxData(nsIPresContext& aPresContext,
+ const nsHTMLReflowState* cbrs,
+ nsStyleUnit aWidthUnit,
+ nsStyleUnit aHeightUnit,
+ nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight);
+
+ void CalculateBlockSideMargins(const nsHTMLReflowState* aContainingBlockRS,
+ nscoord aComputedWidth);
+
+ void ComputeHorizontalValue(nscoord aContainingBlockWidth,
+ nsStyleUnit aUnit,
+ const nsStyleCoord& aCoord,
+ nscoord& aResult);
+
+ void ComputeVerticalValue(nscoord aContainingBlockHeight,
+ nsStyleUnit aUnit,
+ const nsStyleCoord& aCoord,
+ nscoord& aResult);
+
+ static nsCSSFrameType DetermineFrameType(nsIFrame* aFrame,
+ const nsStylePosition* aPosition,
+ const nsStyleDisplay* aDisplay);
+
+ // Computes margin values from the specified margin style information, and
+ // fills in the mComputedMargin member
+ void ComputeMargin(nscoord aContainingBlockWidth,
+ const nsHTMLReflowState* aContainingBlockRS);
+
+ // Computes padding values from the specified padding style information, and
+ // fills in the mComputedPadding member
+ void ComputePadding(nscoord aContainingBlockWidth,
+ const nsHTMLReflowState* aContainingBlockRS);
+
+ // Calculates the computed values for the 'min-Width', 'max-Width',
+ // 'min-Height', and 'max-Height' properties, and stores them in the assorted
+ // data members
+ void ComputeMinMaxValues(nscoord aContainingBlockWidth,
+ nscoord aContainingBlockHeight,
+ const nsHTMLReflowState* aContainingBlockRS);
+
+};
+
+// For HTML reflow we rename with the different paint layers are
+// actually used for.
+#define NS_FRAME_PAINT_LAYER_BACKGROUND eFramePaintLayer_Underlay
+#define NS_FRAME_PAINT_LAYER_FLOATERS eFramePaintLayer_Content
+#define NS_FRAME_PAINT_LAYER_FOREGROUND eFramePaintLayer_Overlay
+#define NS_FRAME_PAINT_LAYER_DEBUG eFramePaintLayer_Overlay
+
+/**
+ * Reflow status returned by the reflow methods.
+ *
+ * NS_FRAME_NOT_COMPLETE bit flag means the frame does not map all its
+ * content, and that the parent frame should create a continuing frame.
+ * If this bit isn't set it means the frame does map all its content.
+ *
+ * NS_FRAME_REFLOW_NEXTINFLOW bit flag means that the next-in-flow is
+ * dirty, and also needs to be reflowed. This status only makes sense
+ * for a frame that is not complete, i.e. you wouldn't set both
+ * NS_FRAME_COMPLETE and NS_FRAME_REFLOW_NEXTINFLOW
+ *
+ * The low 8 bits of the nsReflowStatus are reserved for future extensions;
+ * the remaining 24 bits are zero (and available for extensions; however
+ * API's that accept/return nsReflowStatus must not receive/return any
+ * extension bits).
+ *
+ * @see #Reflow()
+ */
+typedef PRUint32 nsReflowStatus;
+
+#define NS_FRAME_COMPLETE 0 // Note: not a bit!
+#define NS_FRAME_NOT_COMPLETE 0x1
+#define NS_FRAME_REFLOW_NEXTINFLOW 0x2
+
+#define NS_FRAME_IS_COMPLETE(status) \
+ (0 == ((status) & NS_FRAME_NOT_COMPLETE))
+
+#define NS_FRAME_IS_NOT_COMPLETE(status) \
+ (0 != ((status) & NS_FRAME_NOT_COMPLETE))
+
+// This macro tests to see if an nsReflowStatus is an error value
+// or just a regular return value
+#define NS_IS_REFLOW_ERROR(_status) (PRInt32(_status) < 0)
+
+/**
+ * Extensions to the reflow status bits defined by nsIFrameReflow
+ */
+
+// This bit is set, when a break is requested. This bit is orthogonal
+// to the nsIFrame::nsReflowStatus completion bits.
+#define NS_INLINE_BREAK 0x0100
+
+// When a break is requested, this bit when set indicates that the
+// break should occur after the frame just reflowed; when the bit is
+// clear the break should occur before the frame just reflowed.
+#define NS_INLINE_BREAK_BEFORE 0x0000
+#define NS_INLINE_BREAK_AFTER 0x0200
+
+// The type of break requested can be found in these bits.
+#define NS_INLINE_BREAK_TYPE_MASK 0xF000
+
+//----------------------------------------
+// Macros that use those bits
+
+#define NS_INLINE_IS_BREAK(_status) \
+ (0 != ((_status) & NS_INLINE_BREAK))
+
+#define NS_INLINE_IS_BREAK_AFTER(_status) \
+ (0 != ((_status) & NS_INLINE_BREAK_AFTER))
+
+#define NS_INLINE_IS_BREAK_BEFORE(_status) \
+ (NS_INLINE_BREAK == ((_status) & (NS_INLINE_BREAK|NS_INLINE_BREAK_AFTER)))
+
+#define NS_INLINE_GET_BREAK_TYPE(_status) (((_status) >> 12) & 0xF)
+
+#define NS_INLINE_MAKE_BREAK_TYPE(_type) ((_type) << 12)
+
+// Construct a line-break-before status. Note that there is no
+// completion status for a line-break before because we *know* that
+// the frame will be reflowed later and hence it's current completion
+// status doesn't matter.
+#define NS_INLINE_LINE_BREAK_BEFORE() \
+ (NS_INLINE_BREAK | NS_INLINE_BREAK_BEFORE | \
+ NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE))
+
+// Take a completion status and add to it the desire to have a
+// line-break after. For this macro we do need the completion status
+// because the user of the status will need to know whether to
+// continue the frame or not.
+#define NS_INLINE_LINE_BREAK_AFTER(_completionStatus) \
+ ((_completionStatus) | NS_INLINE_BREAK | NS_INLINE_BREAK_AFTER | \
+ NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE))
+
+//----------------------------------------------------------------------
+
+/**
+ * DidReflow status values.
+ */
+typedef PRBool nsDidReflowStatus;
+
+#define NS_FRAME_REFLOW_NOT_FINISHED PR_FALSE
+#define NS_FRAME_REFLOW_FINISHED PR_TRUE
+
+//----------------------------------------------------------------------
+
/**
* A frame in the layout model. This interface is supported by all frame
* objects.
@@ -566,6 +1057,97 @@ public:
NS_IMETHOD GetNextInFlow(nsIFrame** aNextInFlow) const = 0;
NS_IMETHOD SetNextInFlow(nsIFrame*) = 0;
+ /**
+ * Pre-reflow hook. Before a frame is reflowed this method will be called.
+ * This call will always be invoked at least once before a subsequent Reflow
+ * and DidReflow call. It may be called more than once, In general you will
+ * receive on WillReflow notification before each Reflow request.
+ *
+ * XXX Is this really the semantics we want? Because we have the NS_FRAME_IN_REFLOW
+ * bit we can ensure we don't call it more than once...
+ */
+ NS_IMETHOD WillReflow(nsIPresContext& aPresContext) = 0;
+
+ /**
+ * The frame is given a maximum size and asked for its desired size.
+ * This is the frame's opportunity to reflow its children.
+ *
+ * @param aDesiredSize out parameter where you should return the
+ * desired size and ascent/descent info. You should include any
+ * space you want for border/padding in the desired size you return.
+ *
+ * It's okay to return a desired size that exceeds the max
+ * size if that's the smallest you can be, i.e. it's your
+ * minimum size.
+ *
+ * maxElementSize is an optional parameter for returning your
+ * maximum element size. If may be null in which case you
+ * don't have to compute a maximum element size. The
+ * maximum element size must be less than or equal to your
+ * desired size.
+ *
+ * For an incremental reflow you are responsible for invalidating
+ * any area within your frame that needs repainting (including
+ * borders). If your new desired size is different than your current
+ * size, then your parent frame is responsible for making sure that
+ * the difference between the two rects is repainted
+ *
+ * @param aReflowState information about your reflow including the reason
+ * for the reflow and the available space in which to lay out. Each
+ * dimension of the available space can either be constrained or
+ * unconstrained (a value of NS_UNCONSTRAINEDSIZE). If constrained
+ * you should choose a value that's less than or equal to the
+ * constrained size. If unconstrained you can choose as
+ * large a value as you like.
+ *
+ * Note that the available space can be negative. In this case you
+ * still must return an accurate desired size. If you're a container
+ * you must always reflow at least one frame regardless of the
+ * available space
+ *
+ * @param aStatus a return value indicating whether the frame is complete
+ * and whether the next-in-flow is dirty and needs to be reflowed
+ */
+ NS_IMETHOD Reflow(nsIPresContext& aPresContext,
+ nsHTMLReflowMetrics& aReflowMetrics,
+ const nsHTMLReflowState& aReflowState,
+ nsReflowStatus& aStatus) = 0;
+
+ /**
+ * Post-reflow hook. After a frame is reflowed this method will be called
+ * informing the frame that this reflow process is complete, and telling the
+ * frame the status returned by the Reflow member function.
+ *
+ * This call may be invoked many times, while NS_FRAME_IN_REFLOW is set, before
+ * it is finally called once with a NS_FRAME_REFLOW_COMPLETE value. When called
+ * with a NS_FRAME_REFLOW_COMPLETE value the NS_FRAME_IN_REFLOW bit in the
+ * frame state will be cleared.
+ *
+ * XXX This doesn't make sense. If the frame is reflowed but not complete, then
+ * the status should be NS_FRAME_NOT_COMPLETE and not NS_FRAME_COMPLETE
+ * XXX Don't we want the semantics to dictate that we only call this once for
+ * a given reflow?
+ */
+ NS_IMETHOD DidReflow(nsIPresContext& aPresContext,
+ nsDidReflowStatus aStatus) = 0;
+
+ // XXX Maybe these three should be a separate interface?
+
+ // Helper method used by block reflow to identify runs of text so that
+ // proper word-breaking can be done.
+ NS_IMETHOD FindTextRuns(nsLineLayout& aLineLayout) = 0;
+
+ // Justification helper method used to distribute extra space in a
+ // line to leaf frames. aUsedSpace is filled in with the amount of
+ // space actually used.
+ NS_IMETHOD AdjustFrameSize(nscoord aExtraSpace, nscoord& aUsedSpace) = 0;
+
+ // Justification helper method that is used to remove trailing
+ // whitespace before justification.
+ NS_IMETHOD TrimTrailingWhiteSpace(nsIPresContext* aPresContext,
+ nsIRenderingContext& aRC,
+ nscoord& aDeltaWidth) = 0;
+
/**
* Accessor functions to get/set the associated view object
*/
diff --git a/mozilla/layout/generic/nsInlineFrame.cpp b/mozilla/layout/generic/nsInlineFrame.cpp
index 10e6cac1c25..6b1a04b6719 100644
--- a/mozilla/layout/generic/nsInlineFrame.cpp
+++ b/mozilla/layout/generic/nsInlineFrame.cpp
@@ -1331,11 +1331,7 @@ nsInlineFrame::FindTextRuns(nsLineLayout& aLineLayout)
else {
nsIFrame* frame = mFrames.FirstChild();
while (nsnull != frame) {
- nsIHTMLReflow* ihr;
- nsresult rv = frame->QueryInterface(kIHTMLReflowIID, (void**)&ihr);
- if (NS_SUCCEEDED(rv)) {
- ihr->FindTextRuns(aLineLayout);
- }
+ frame->FindTextRuns(aLineLayout);
frame->GetNextSibling(&frame);
}
}
@@ -1353,9 +1349,6 @@ nsInlineFrame::DrainOverflow(nsIPresContext* aPresContext)
if (prevOverflowFrames) {
// When pushing and pulling frames we need to check for whether any
// views need to be reparented.
- // XXX Doing it this way means an extra pass over the frames. We could
- // change InsertFrames() to do this, but that's a general purpose
- // function and it doesn't seem like this functionality belongs there...
for (nsIFrame* f = prevOverflowFrames; f; f->GetNextSibling(&f)) {
nsHTMLContainerFrame::ReparentFrameView(aPresContext, f, prevInFlow, this);
}
diff --git a/mozilla/layout/generic/nsLineLayout.cpp b/mozilla/layout/generic/nsLineLayout.cpp
index 36101189146..ede0c3d1f0e 100644
--- a/mozilla/layout/generic/nsLineLayout.cpp
+++ b/mozilla/layout/generic/nsLineLayout.cpp
@@ -843,7 +843,7 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
reason = eReflowReason_StyleChange;
}
else {
- const nsReflowState* rs = psd->mReflowState;
+ const nsHTMLReflowState* rs = psd->mReflowState;
if (rs->reason == eReflowReason_Incremental) {
// If the incremental reflow command is a StyleChanged reflow and
// it's target is the current span, then make sure we send
@@ -906,10 +906,8 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
// Let frame know that are reflowing it
nscoord x = pfd->mBounds.x;
nscoord y = pfd->mBounds.y;
- nsIHTMLReflow* htmlReflow;
- aFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- htmlReflow->WillReflow(mPresContext);
+ aFrame->WillReflow(mPresContext);
// Adjust spacemanager coordinate system for the frame. The
// spacemanager coordinates are inside the current spans
@@ -935,7 +933,7 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
nscoord tx = x - psd->mReflowState->mComputedBorderPadding.left;
nscoord ty = y - psd->mReflowState->mComputedBorderPadding.top;
mSpaceManager->Translate(tx, ty);
- htmlReflow->Reflow(mPresContext, metrics, reflowState, aReflowStatus);
+ aFrame->Reflow(mPresContext, metrics, reflowState, aReflowStatus);
// XXX See if the frame is a placeholderFrame and if it is process
// the floater.
@@ -2177,46 +2175,42 @@ nsLineLayout::TrimTrailingWhiteSpaceIn(PerSpanData* psd,
}
else if (pfd->mIsNonEmptyTextFrame) {
nscoord deltaWidth = 0;
- nsIHTMLReflow* hr;
- nsresult rv = pfd->mFrame->QueryInterface(kIHTMLReflowIID, (void**)&hr);
- if (NS_SUCCEEDED(rv)) {
- hr->TrimTrailingWhiteSpace(&mPresContext,
- *mBlockReflowState->rendContext,
- deltaWidth);
+ pfd->mFrame->TrimTrailingWhiteSpace(&mPresContext,
+ *mBlockReflowState->rendContext,
+ deltaWidth);
#ifdef NOISY_TRIM
- nsFrame::ListTag(stdout, (psd == mRootSpan
- ? mBlockReflowState->frame
- : psd->mFrame->mFrame));
- printf(": trim of ");
- nsFrame::ListTag(stdout, pfd->mFrame);
- printf(" returned %d\n", deltaWidth);
+ nsFrame::ListTag(stdout, (psd == mRootSpan
+ ? mBlockReflowState->frame
+ : psd->mFrame->mFrame));
+ printf(": trim of ");
+ nsFrame::ListTag(stdout, pfd->mFrame);
+ printf(" returned %d\n", deltaWidth);
#endif
- if (deltaWidth) {
- pfd->mBounds.width -= deltaWidth;
- pfd->mCombinedArea.width -= deltaWidth;
- if (0 == pfd->mBounds.width) {
- pfd->mMaxElementSize.width = 0;
- pfd->mMaxElementSize.height = 0;
- }
+ if (deltaWidth) {
+ pfd->mBounds.width -= deltaWidth;
+ pfd->mCombinedArea.width -= deltaWidth;
+ if (0 == pfd->mBounds.width) {
+ pfd->mMaxElementSize.width = 0;
+ pfd->mMaxElementSize.height = 0;
+ }
- // See if the text frame has already been placed in its parent
- if (psd != mRootSpan) {
- // The frame was already placed during psd's
- // reflow. Update the frames rectangle now.
- pfd->mFrame->SetRect(&mPresContext, pfd->mBounds);
- }
+ // See if the text frame has already been placed in its parent
+ if (psd != mRootSpan) {
+ // The frame was already placed during psd's
+ // reflow. Update the frames rectangle now.
+ pfd->mFrame->SetRect(&mPresContext, pfd->mBounds);
+ }
- // Adjust containing span's right edge
- psd->mX -= deltaWidth;
+ // Adjust containing span's right edge
+ psd->mX -= deltaWidth;
- // Slide any frames that follow the text frame over by the
- // right amount. The only thing that can follow the text
- // frame is empty stuff, so we are just making things
- // sensible (keeping the combined area honest).
- while (pfd->mNext) {
- pfd = pfd->mNext;
- pfd->mBounds.x -= deltaWidth;
- }
+ // Slide any frames that follow the text frame over by the
+ // right amount. The only thing that can follow the text
+ // frame is empty stuff, so we are just making things
+ // sensible (keeping the combined area honest).
+ while (pfd->mNext) {
+ pfd = pfd->mNext;
+ pfd->mBounds.x -= deltaWidth;
}
}
@@ -2226,6 +2220,7 @@ nsLineLayout::TrimTrailingWhiteSpaceIn(PerSpanData* psd,
}
pfd = pfd->mPrev;
}
+
*aDeltaWidth = 0;
return PR_FALSE;
}
diff --git a/mozilla/layout/generic/nsPageFrame.cpp b/mozilla/layout/generic/nsPageFrame.cpp
index 4afafc251d8..96e1d5712c9 100644
--- a/mozilla/layout/generic/nsPageFrame.cpp
+++ b/mozilla/layout/generic/nsPageFrame.cpp
@@ -117,29 +117,26 @@ NS_METHOD nsPageFrame::Reflow(nsIPresContext& aPresContext,
maxSize);
kidReflowState.isTopOfPage = PR_TRUE;
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- // Get the child's desired size
- ReflowChild(frame, aPresContext, aDesiredSize, kidReflowState, aStatus);
-
- // Make sure the child is at least as tall as our max size (the containing window)
- if (aDesiredSize.height < aReflowState.availableHeight) {
- aDesiredSize.height = aReflowState.availableHeight;
- }
-
- // Place and size the child
- nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height);
- frame->SetRect(&aPresContext, rect);
- // XXX Should we be sending the DidReflow?
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
-
- // Is the frame complete?
- if (NS_FRAME_IS_COMPLETE(aStatus)) {
- nsIFrame* childNextInFlow;
-
- frame->GetNextInFlow(&childNextInFlow);
- NS_ASSERTION(nsnull == childNextInFlow, "bad child flow list");
- }
+ // Get the child's desired size
+ ReflowChild(frame, aPresContext, aDesiredSize, kidReflowState, aStatus);
+
+ // Make sure the child is at least as tall as our max size (the containing window)
+ if (aDesiredSize.height < aReflowState.availableHeight) {
+ aDesiredSize.height = aReflowState.availableHeight;
+ }
+
+ // Place and size the child
+ nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height);
+ frame->SetRect(&aPresContext, rect);
+ // XXX Should we be sending the DidReflow?
+ frame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
+
+ // Is the frame complete?
+ if (NS_FRAME_IS_COMPLETE(aStatus)) {
+ nsIFrame* childNextInFlow;
+
+ frame->GetNextInFlow(&childNextInFlow);
+ NS_ASSERTION(nsnull == childNextInFlow, "bad child flow list");
}
}
diff --git a/mozilla/layout/generic/nsViewportFrame.cpp b/mozilla/layout/generic/nsViewportFrame.cpp
index 4b981bedc44..422a545b561 100644
--- a/mozilla/layout/generic/nsViewportFrame.cpp
+++ b/mozilla/layout/generic/nsViewportFrame.cpp
@@ -326,42 +326,38 @@ ViewportFrame::ReflowFixedFrame(nsIPresContext& aPresContext,
nsReflowStatus& aStatus) const
{
// Reflow the frame
- nsIHTMLReflow* htmlReflow;
- nsresult rv;
+ nsresult rv;
- rv = aKidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->WillReflow(aPresContext);
+ aKidFrame->WillReflow(aPresContext);
- nsHTMLReflowMetrics kidDesiredSize(nsnull);
- nsSize availSize(aReflowState.availableWidth, NS_UNCONSTRAINEDSIZE);
- nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
- availSize);
+ nsHTMLReflowMetrics kidDesiredSize(nsnull);
+ nsSize availSize(aReflowState.availableWidth, NS_UNCONSTRAINEDSIZE);
+ nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
+ availSize);
- // If it's the initial reflow, then override the reflow reason. This is
- // used when frames are inserted incrementally
- if (aInitialReflow) {
- kidReflowState.reason = eReflowReason_Initial;
- }
-
- htmlReflow->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
-
- // XXX If the child had a fixed height, then make sure it respected it...
- if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
- if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
- kidDesiredSize.height = kidReflowState.mComputedHeight;
- kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
- kidReflowState.mComputedBorderPadding.bottom;
- }
- }
-
- // Position the child
- nsRect rect(kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
- kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
- kidDesiredSize.width, kidDesiredSize.height);
- aKidFrame->SetRect(&aPresContext, rect);
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
+ // If it's the initial reflow, then override the reflow reason. This is
+ // used when frames are inserted incrementally
+ if (aInitialReflow) {
+ kidReflowState.reason = eReflowReason_Initial;
}
+
+ rv = aKidFrame->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
+
+ // XXX If the child had a fixed height, then make sure it respected it...
+ if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
+ if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedHeight;
+ kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
+ kidReflowState.mComputedBorderPadding.bottom;
+ }
+ }
+
+ // Position the child
+ nsRect rect(kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
+ kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
+ kidDesiredSize.width, kidDesiredSize.height);
+ aKidFrame->SetRect(&aPresContext, rect);
+ aKidFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
return rv;
}
@@ -507,20 +503,17 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
kidFrame, availableSpace);
// Reflow the frame
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- kidReflowState.mComputedHeight = aReflowState.availableHeight;
- ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
- aStatus);
+ kidReflowState.mComputedHeight = aReflowState.availableHeight;
+ ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
+ aStatus);
- nsRect rect(0, 0, kidDesiredSize.width, kidDesiredSize.height);
- kidFrame->SetRect(&aPresContext, rect);
- kidRect = rect;
+ nsRect rect(0, 0, kidDesiredSize.width, kidDesiredSize.height);
+ kidFrame->SetRect(&aPresContext, rect);
+ kidRect = rect;
- // XXX We should resolve the details of who/when DidReflow()
- // notifications are sent...
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ // XXX We should resolve the details of who/when DidReflow()
+ // notifications are sent...
+ kidFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
}
// If it's a 'initial', 'resize', or 'style change' reflow command (anything
diff --git a/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.cpp b/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.cpp
index 4d02a172b09..742c0f48e4d 100644
--- a/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.cpp
+++ b/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.cpp
@@ -256,118 +256,114 @@ nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame* aDelegat
NS_NOTYETIMPLEMENTED("percentage border");
}
- nsIHTMLReflow* htmlReflow;
- rv = aKidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->WillReflow(aPresContext);
+ aKidFrame->WillReflow(aPresContext);
- nsSize availSize(aReflowState.mComputedWidth, NS_UNCONSTRAINEDSIZE);
- nsHTMLReflowMetrics kidDesiredSize(nsnull);
- nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
- availSize, aContainingBlockWidth,
- aContainingBlockHeight);
+ nsSize availSize(aReflowState.mComputedWidth, NS_UNCONSTRAINEDSIZE);
+ nsHTMLReflowMetrics kidDesiredSize(nsnull);
+ nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
+ availSize, aContainingBlockWidth,
+ aContainingBlockHeight);
- // If it's the initial reflow, then override the reflow reason. This is
- // used when frames are inserted incrementally
- if (aInitialReflow) {
- kidReflowState.reason = eReflowReason_Initial;
+ // If it's the initial reflow, then override the reflow reason. This is
+ // used when frames are inserted incrementally
+ if (aInitialReflow) {
+ kidReflowState.reason = eReflowReason_Initial;
+ }
+
+ rv = aKidFrame->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
+
+ // Because we don't know the size of a replaced element until after we reflow
+ // it 'auto' margins must be computed now, and we need to take into account
+ // min-max information
+ if (NS_FRAME_IS_REPLACED(kidReflowState.mFrameType)) {
+ // Factor in any minimum and maximum size information
+ if (kidDesiredSize.width > kidReflowState.mComputedMaxWidth) {
+ kidDesiredSize.width = kidReflowState.mComputedMaxWidth;
+ } else if (kidDesiredSize.width < kidReflowState.mComputedMinWidth) {
+ kidDesiredSize.width = kidReflowState.mComputedMinWidth;
+ }
+ if (kidDesiredSize.height > kidReflowState.mComputedMaxHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedMaxHeight;
+ } else if (kidDesiredSize.height < kidReflowState.mComputedMinHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedMinHeight;
}
- rv = htmlReflow->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
+ // Get the containing block width/height
+ nscoord containingBlockWidth, containingBlockHeight;
+ kidReflowState.ComputeContainingBlockRectangle(&aReflowState,
+ containingBlockWidth,
+ containingBlockHeight);
- // Because we don't know the size of a replaced element until after we reflow
- // it 'auto' margins must be computed now, and we need to take into account
- // min-max information
- if (NS_FRAME_IS_REPLACED(kidReflowState.mFrameType)) {
- // Factor in any minimum and maximum size information
- if (kidDesiredSize.width > kidReflowState.mComputedMaxWidth) {
- kidDesiredSize.width = kidReflowState.mComputedMaxWidth;
- } else if (kidDesiredSize.width < kidReflowState.mComputedMinWidth) {
- kidDesiredSize.width = kidReflowState.mComputedMinWidth;
- }
- if (kidDesiredSize.height > kidReflowState.mComputedMaxHeight) {
- kidDesiredSize.height = kidReflowState.mComputedMaxHeight;
- } else if (kidDesiredSize.height < kidReflowState.mComputedMinHeight) {
- kidDesiredSize.height = kidReflowState.mComputedMinHeight;
- }
+ // XXX This code belongs in nsHTMLReflowState...
+ if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) ||
+ (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right)) {
+ // Calculate the amount of space for margins
+ nscoord availMarginSpace = containingBlockWidth -
+ kidReflowState.mComputedOffsets.left - kidReflowState.mComputedBorderPadding.left -
+ kidDesiredSize.width - kidReflowState.mComputedBorderPadding.right -
+ kidReflowState.mComputedOffsets.right;
- // Get the containing block width/height
- nscoord containingBlockWidth, containingBlockHeight;
- kidReflowState.ComputeContainingBlockRectangle(&aReflowState,
- containingBlockWidth,
- containingBlockHeight);
-
- // XXX This code belongs in nsHTMLReflowState...
- if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) ||
- (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right)) {
- // Calculate the amount of space for margins
- nscoord availMarginSpace = containingBlockWidth -
- kidReflowState.mComputedOffsets.left - kidReflowState.mComputedBorderPadding.left -
- kidDesiredSize.width - kidReflowState.mComputedBorderPadding.right -
- kidReflowState.mComputedOffsets.right;
-
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) {
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right) {
- // Both 'margin-left' and 'margin-right' are 'auto', so they get
- // equal values
- kidReflowState.mComputedMargin.left = availMarginSpace / 2;
- kidReflowState.mComputedMargin.right = availMarginSpace -
- kidReflowState.mComputedMargin.left;
- } else {
- // Just 'margin-left' is 'auto'
- kidReflowState.mComputedMargin.left = availMarginSpace -
- kidReflowState.mComputedMargin.right;
- }
- } else {
- // Just 'margin-right' is 'auto'
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.left) {
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.right) {
+ // Both 'margin-left' and 'margin-right' are 'auto', so they get
+ // equal values
+ kidReflowState.mComputedMargin.left = availMarginSpace / 2;
kidReflowState.mComputedMargin.right = availMarginSpace -
kidReflowState.mComputedMargin.left;
- }
- }
- if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) ||
- (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom)) {
- // Calculate the amount of space for margins
- nscoord availMarginSpace = containingBlockHeight -
- kidReflowState.mComputedOffsets.top - kidReflowState.mComputedBorderPadding.top -
- kidDesiredSize.height - kidReflowState.mComputedBorderPadding.bottom -
- kidReflowState.mComputedOffsets.bottom;
-
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) {
- if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom) {
- // Both 'margin-top' and 'margin-bottom' are 'auto', so they get
- // equal values
- kidReflowState.mComputedMargin.top = availMarginSpace / 2;
- kidReflowState.mComputedMargin.bottom = availMarginSpace -
- kidReflowState.mComputedMargin.top;
- } else {
- // Just 'margin-top' is 'auto'
- kidReflowState.mComputedMargin.top = availMarginSpace -
- kidReflowState.mComputedMargin.bottom;
- }
} else {
- // Just 'margin-bottom' is 'auto'
+ // Just 'margin-left' is 'auto'
+ kidReflowState.mComputedMargin.left = availMarginSpace -
+ kidReflowState.mComputedMargin.right;
+ }
+ } else {
+ // Just 'margin-right' is 'auto'
+ kidReflowState.mComputedMargin.right = availMarginSpace -
+ kidReflowState.mComputedMargin.left;
+ }
+ }
+ if ((NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) ||
+ (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom)) {
+ // Calculate the amount of space for margins
+ nscoord availMarginSpace = containingBlockHeight -
+ kidReflowState.mComputedOffsets.top - kidReflowState.mComputedBorderPadding.top -
+ kidDesiredSize.height - kidReflowState.mComputedBorderPadding.bottom -
+ kidReflowState.mComputedOffsets.bottom;
+
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.top) {
+ if (NS_AUTOMARGIN == kidReflowState.mComputedMargin.bottom) {
+ // Both 'margin-top' and 'margin-bottom' are 'auto', so they get
+ // equal values
+ kidReflowState.mComputedMargin.top = availMarginSpace / 2;
kidReflowState.mComputedMargin.bottom = availMarginSpace -
kidReflowState.mComputedMargin.top;
+ } else {
+ // Just 'margin-top' is 'auto'
+ kidReflowState.mComputedMargin.top = availMarginSpace -
+ kidReflowState.mComputedMargin.bottom;
}
+ } else {
+ // Just 'margin-bottom' is 'auto'
+ kidReflowState.mComputedMargin.bottom = availMarginSpace -
+ kidReflowState.mComputedMargin.top;
}
}
-
- // XXX If the child had a fixed height, then make sure it respected it...
- if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
- if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
- kidDesiredSize.height = kidReflowState.mComputedHeight;
- kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
- kidReflowState.mComputedBorderPadding.bottom;
- }
- }
-
- // Position the child relative to our padding edge
- nsRect rect(border.left + kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
- border.top + kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
- kidDesiredSize.width, kidDesiredSize.height);
- aKidFrame->SetRect(&aPresContext, rect);
}
+ // XXX If the child had a fixed height, then make sure it respected it...
+ if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
+ if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedHeight;
+ kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
+ kidReflowState.mComputedBorderPadding.bottom;
+ }
+ }
+
+ // Position the child relative to our padding edge
+ nsRect rect(border.left + kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
+ border.top + kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
+ kidDesiredSize.width, kidDesiredSize.height);
+ aKidFrame->SetRect(&aPresContext, rect);
+
return rv;
}
diff --git a/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.h b/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.h
index 83fe0155dd4..8c2a8953eb1 100644
--- a/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.h
+++ b/mozilla/layout/html/base/src/nsAbsoluteContainingBlock.h
@@ -19,7 +19,6 @@
#define nsAbsoluteContainingBlock_h___
#include "nslayout.h"
-#include "nsIHTMLReflow.h"
#include "nsFrameList.h"
class nsIAtom;
diff --git a/mozilla/layout/html/base/src/nsBlockBandData.cpp b/mozilla/layout/html/base/src/nsBlockBandData.cpp
index e03fd51d62e..43c95e7ba68 100644
--- a/mozilla/layout/html/base/src/nsBlockBandData.cpp
+++ b/mozilla/layout/html/base/src/nsBlockBandData.cpp
@@ -19,7 +19,6 @@
#include "nsCOMPtr.h"
#include "nsBlockBandData.h"
#include "nsIFrame.h"
-#include "nsIFrameReflow.h"
#include "nsIStyleContext.h"
#include "nsIPresContext.h"
#include "nsIPresShell.h"
diff --git a/mozilla/layout/html/base/src/nsBlockFrame.cpp b/mozilla/layout/html/base/src/nsBlockFrame.cpp
index 2848407a179..974f0a4b354 100644
--- a/mozilla/layout/html/base/src/nsBlockFrame.cpp
+++ b/mozilla/layout/html/base/src/nsBlockFrame.cpp
@@ -6380,14 +6380,10 @@ nsBlockFrame::ReflowBullet(nsBlockReflowState& aState,
availSize.height = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState reflowState(*aState.mPresContext, aState.mReflowState,
mBullet, availSize);
- nsIHTMLReflow* htmlReflow;
- nsresult rv = mBullet->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- nsReflowStatus status;
- htmlReflow->WillReflow(*aState.mPresContext);
- htmlReflow->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
- htmlReflow->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ nsReflowStatus status;
+ mBullet->WillReflow(*aState.mPresContext);
+ mBullet->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
+ mBullet->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
// Place the bullet now; use its right margin to distance it
// from the rest of the frames in the line
@@ -6452,12 +6448,9 @@ nsBlockFrame::ComputeTextRuns(nsIPresContext* aPresContext)
nsIFrame* frame = line->mFirstChild;
PRInt32 n = line->GetChildCount();
while (--n >= 0) {
- nsIHTMLReflow* hr;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&hr)) {
- nsresult rv = hr->FindTextRuns(textRunThingy);
- if (NS_OK != rv) {
- return rv;
- }
+ nsresult rv = frame->FindTextRuns(textRunThingy);
+ if (NS_OK != rv) {
+ return rv;
}
else {
// A frame that doesn't implement nsIHTMLReflow isn't text
diff --git a/mozilla/layout/html/base/src/nsBlockReflowContext.cpp b/mozilla/layout/html/base/src/nsBlockReflowContext.cpp
index c48c29ac937..fc6498eba74 100644
--- a/mozilla/layout/html/base/src/nsBlockReflowContext.cpp
+++ b/mozilla/layout/html/base/src/nsBlockReflowContext.cpp
@@ -221,12 +221,7 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
mY = y;
// Let frame know that we are reflowing it
- nsIHTMLReflow* htmlReflow;
- rv = aFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_FAILED(rv)) {
- return rv;
- }
- htmlReflow->WillReflow(*mPresContext);
+ aFrame->WillReflow(*mPresContext);
#ifdef DEBUG
mMetrics.width = nscoord(0xdeadbeef);
@@ -249,8 +244,8 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
nscoord tx = x - mOuterReflowState.mComputedBorderPadding.left;
nscoord ty = y - mOuterReflowState.mComputedBorderPadding.top;
mOuterReflowState.mSpaceManager->Translate(tx, ty);
- rv = htmlReflow->Reflow(*mPresContext, mMetrics, reflowState,
- aFrameReflowStatus);
+ rv = aFrame->Reflow(*mPresContext, mMetrics, reflowState,
+ aFrameReflowStatus);
mOuterReflowState.mSpaceManager->Translate(-tx, -ty);
#ifdef DEBUG
diff --git a/mozilla/layout/html/base/src/nsBlockReflowContext.h b/mozilla/layout/html/base/src/nsBlockReflowContext.h
index c7d91fb47bb..38449a59906 100644
--- a/mozilla/layout/html/base/src/nsBlockReflowContext.h
+++ b/mozilla/layout/html/base/src/nsBlockReflowContext.h
@@ -19,7 +19,7 @@
#ifndef nsBlockReflowContext_h___
#define nsBlockReflowContext_h___
-#include "nsIHTMLReflow.h"
+#include "nsIFrame.h"
class nsBlockFrame;
class nsIFrame;
diff --git a/mozilla/layout/html/base/src/nsBlockReflowState.cpp b/mozilla/layout/html/base/src/nsBlockReflowState.cpp
index 2848407a179..974f0a4b354 100644
--- a/mozilla/layout/html/base/src/nsBlockReflowState.cpp
+++ b/mozilla/layout/html/base/src/nsBlockReflowState.cpp
@@ -6380,14 +6380,10 @@ nsBlockFrame::ReflowBullet(nsBlockReflowState& aState,
availSize.height = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState reflowState(*aState.mPresContext, aState.mReflowState,
mBullet, availSize);
- nsIHTMLReflow* htmlReflow;
- nsresult rv = mBullet->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- nsReflowStatus status;
- htmlReflow->WillReflow(*aState.mPresContext);
- htmlReflow->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
- htmlReflow->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ nsReflowStatus status;
+ mBullet->WillReflow(*aState.mPresContext);
+ mBullet->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
+ mBullet->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
// Place the bullet now; use its right margin to distance it
// from the rest of the frames in the line
@@ -6452,12 +6448,9 @@ nsBlockFrame::ComputeTextRuns(nsIPresContext* aPresContext)
nsIFrame* frame = line->mFirstChild;
PRInt32 n = line->GetChildCount();
while (--n >= 0) {
- nsIHTMLReflow* hr;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&hr)) {
- nsresult rv = hr->FindTextRuns(textRunThingy);
- if (NS_OK != rv) {
- return rv;
- }
+ nsresult rv = frame->FindTextRuns(textRunThingy);
+ if (NS_OK != rv) {
+ return rv;
}
else {
// A frame that doesn't implement nsIHTMLReflow isn't text
diff --git a/mozilla/layout/html/base/src/nsBlockReflowState.h b/mozilla/layout/html/base/src/nsBlockReflowState.h
index 2848407a179..974f0a4b354 100644
--- a/mozilla/layout/html/base/src/nsBlockReflowState.h
+++ b/mozilla/layout/html/base/src/nsBlockReflowState.h
@@ -6380,14 +6380,10 @@ nsBlockFrame::ReflowBullet(nsBlockReflowState& aState,
availSize.height = NS_UNCONSTRAINEDSIZE;
nsHTMLReflowState reflowState(*aState.mPresContext, aState.mReflowState,
mBullet, availSize);
- nsIHTMLReflow* htmlReflow;
- nsresult rv = mBullet->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- nsReflowStatus status;
- htmlReflow->WillReflow(*aState.mPresContext);
- htmlReflow->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
- htmlReflow->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ nsReflowStatus status;
+ mBullet->WillReflow(*aState.mPresContext);
+ mBullet->Reflow(*aState.mPresContext, aMetrics, reflowState, status);
+ mBullet->DidReflow(*aState.mPresContext, NS_FRAME_REFLOW_FINISHED);
// Place the bullet now; use its right margin to distance it
// from the rest of the frames in the line
@@ -6452,12 +6448,9 @@ nsBlockFrame::ComputeTextRuns(nsIPresContext* aPresContext)
nsIFrame* frame = line->mFirstChild;
PRInt32 n = line->GetChildCount();
while (--n >= 0) {
- nsIHTMLReflow* hr;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&hr)) {
- nsresult rv = hr->FindTextRuns(textRunThingy);
- if (NS_OK != rv) {
- return rv;
- }
+ nsresult rv = frame->FindTextRuns(textRunThingy);
+ if (NS_OK != rv) {
+ return rv;
}
else {
// A frame that doesn't implement nsIHTMLReflow isn't text
diff --git a/mozilla/layout/html/base/src/nsContainerFrame.cpp b/mozilla/layout/html/base/src/nsContainerFrame.cpp
index b7d4bfd1678..76102af7c36 100644
--- a/mozilla/layout/html/base/src/nsContainerFrame.cpp
+++ b/mozilla/layout/html/base/src/nsContainerFrame.cpp
@@ -111,12 +111,7 @@ nsContainerFrame::DidReflow(nsIPresContext& aPresContext,
nsIFrame* kid;
FirstChild(listName, &kid);
while (nsnull != kid) {
- nsIHTMLReflow* htmlReflow;
- nsresult rv;
- rv = kid->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->DidReflow(aPresContext, aStatus);
- }
+ kid->DidReflow(aPresContext, aStatus);
kid->GetNextSibling(&kid);
}
NS_IF_RELEASE(listName);
@@ -354,13 +349,7 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
{
NS_PRECONDITION(aReflowState.frame == aKidFrame, "bad reflow state");
- // Query for the nsIHTMLReflow interface
- nsIHTMLReflow* htmlReflow;
- nsresult result;
- result = aKidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_FAILED(result)) {
- return result;
- }
+ nsresult result;
#ifdef DEBUG
nsSize* saveMaxElementSize = aDesiredSize.maxElementSize;
@@ -373,9 +362,9 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
#endif
// Send the WillReflow notification, and reflow the child frame
- htmlReflow->WillReflow(aPresContext);
- result = htmlReflow->Reflow(aPresContext, aDesiredSize, aReflowState,
- aStatus);
+ aKidFrame->WillReflow(aPresContext);
+ result = aKidFrame->Reflow(aPresContext, aDesiredSize, aReflowState,
+ aStatus);
#ifdef DEBUG
if (saveMaxElementSize != aDesiredSize.maxElementSize) {
diff --git a/mozilla/layout/html/base/src/nsFirstLetterFrame.cpp b/mozilla/layout/html/base/src/nsFirstLetterFrame.cpp
index 35fcd26d706..00c9a5e86e9 100644
--- a/mozilla/layout/html/base/src/nsFirstLetterFrame.cpp
+++ b/mozilla/layout/html/base/src/nsFirstLetterFrame.cpp
@@ -153,11 +153,7 @@ nsFirstLetterFrame::FindTextRuns(nsLineLayout& aLineLayout)
{
nsIFrame* frame = mFrames.FirstChild();
while (nsnull != frame) {
- nsIHTMLReflow* ihr;
- nsresult rv = frame->QueryInterface(kIHTMLReflowIID, (void**)&ihr);
- if (NS_SUCCEEDED(rv)) {
- ihr->FindTextRuns(aLineLayout);
- }
+ frame->FindTextRuns(aLineLayout);
frame->GetNextSibling(&frame);
}
return NS_OK;
@@ -209,13 +205,8 @@ nsFirstLetterFrame::Reflow(nsIPresContext& aPresContext,
rs.mLineLayout = ≪
ll.SetFirstLetterStyleOK(PR_TRUE);
- nsIHTMLReflow* htmlReflow;
- rv = kid->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_FAILED(rv)) {
- return rv;
- }
- htmlReflow->WillReflow(aPresContext);
- htmlReflow->Reflow(aPresContext, aMetrics, rs, aReflowStatus);
+ kid->WillReflow(aPresContext);
+ kid->Reflow(aPresContext, aMetrics, rs, aReflowStatus);
ll.EndLineReflow();
}
diff --git a/mozilla/layout/html/base/src/nsFrame.cpp b/mozilla/layout/html/base/src/nsFrame.cpp
index ea3f45c18c5..ea1a3fa58f1 100644
--- a/mozilla/layout/html/base/src/nsFrame.cpp
+++ b/mozilla/layout/html/base/src/nsFrame.cpp
@@ -220,10 +220,7 @@ nsresult nsFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
}
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kClassIID, kIFrameIID);
- if (aIID.Equals(kIHTMLReflowIID)) {
- *aInstancePtr = (void*)(nsIHTMLReflow*)this;
- return NS_OK;
- } else if (aIID.Equals(kClassIID) || aIID.Equals(kISupportsIID)) {
+ if (aIID.Equals(kClassIID) || aIID.Equals(kISupportsIID)) {
*aInstancePtr = (void*)this;
return NS_OK;
}
diff --git a/mozilla/layout/html/base/src/nsFrame.h b/mozilla/layout/html/base/src/nsFrame.h
index 846254d191e..0f2ef84071e 100644
--- a/mozilla/layout/html/base/src/nsFrame.h
+++ b/mozilla/layout/html/base/src/nsFrame.h
@@ -19,7 +19,6 @@
#define nsFrame_h___
#include "nsIFrame.h"
-#include "nsIHTMLReflow.h"
#include "nsRect.h"
#include "nsString.h"
#include "prlog.h"
@@ -93,7 +92,7 @@
* Sets the NS_FRAME_SYNCHRONIZE_FRAME_AND_VIEW bit, so the default
* behavior is to keep the frame and view position and size in sync.
*/
-class nsFrame : public nsIFrame, public nsIHTMLReflow
+class nsFrame : public nsIFrame
{
public:
/**
diff --git a/mozilla/layout/html/base/src/nsHTMLFrame.cpp b/mozilla/layout/html/base/src/nsHTMLFrame.cpp
index cc21a8e4f5d..68407464664 100644
--- a/mozilla/layout/html/base/src/nsHTMLFrame.cpp
+++ b/mozilla/layout/html/base/src/nsHTMLFrame.cpp
@@ -319,83 +319,80 @@ RootFrame::Reflow(nsIPresContext& aPresContext,
}
// Reflow the frame
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
- aStatus);
+ ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
+ aStatus);
- // The document element's background should cover the entire canvas, so
- // take into account the combined area and any space taken up by
- // absolutely positioned elements
- nsMargin border;
- nsFrameState kidState;
+ // The document element's background should cover the entire canvas, so
+ // take into account the combined area and any space taken up by
+ // absolutely positioned elements
+ nsMargin border;
+ nsFrameState kidState;
- if (!kidReflowState.mStyleSpacing->GetBorder(border)) {
- NS_NOTYETIMPLEMENTED("percentage border");
+ if (!kidReflowState.mStyleSpacing->GetBorder(border)) {
+ NS_NOTYETIMPLEMENTED("percentage border");
+ }
+ kidFrame->GetFrameState(&kidState);
+
+ // First check the combined area
+ if (NS_FRAME_OUTSIDE_CHILDREN & kidState) {
+ // The background covers the content area and padding area, so check
+ // for children sticking outside the child frame's padding edge
+ nscoord paddingEdgeX = kidDesiredSize.width - border.right;
+ nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
+
+ if (kidDesiredSize.mCombinedArea.XMost() > paddingEdgeX) {
+ kidDesiredSize.width = kidDesiredSize.mCombinedArea.XMost() +
+ border.right;
}
- kidFrame->GetFrameState(&kidState);
-
- // First check the combined area
- if (NS_FRAME_OUTSIDE_CHILDREN & kidState) {
- // The background covers the content area and padding area, so check
- // for children sticking outside the child frame's padding edge
- nscoord paddingEdgeX = kidDesiredSize.width - border.right;
- nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
-
- if (kidDesiredSize.mCombinedArea.XMost() > paddingEdgeX) {
- kidDesiredSize.width = kidDesiredSize.mCombinedArea.XMost() +
- border.right;
- }
- if (kidDesiredSize.mCombinedArea.YMost() > paddingEdgeY) {
- kidDesiredSize.height = kidDesiredSize.mCombinedArea.YMost() +
- border.bottom;
- }
+ if (kidDesiredSize.mCombinedArea.YMost() > paddingEdgeY) {
+ kidDesiredSize.height = kidDesiredSize.mCombinedArea.YMost() +
+ border.bottom;
}
+ }
- // XXX It would be nice if this were also part of the reflow metrics...
- nsIAreaFrame* areaFrame;
- if (NS_SUCCEEDED(kidFrame->QueryInterface(kAreaFrameIID, (void**)&areaFrame))) {
- // Get the x-most and y-most of the absolutely positioned children
- nscoord positionedXMost, positionedYMost;
- areaFrame->GetPositionedInfo(positionedXMost, positionedYMost);
-
- // The background covers the content area and padding area, so check
- // for children sticking outside the padding edge
- nscoord paddingEdgeX = kidDesiredSize.width - border.right;
- nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
+ // XXX It would be nice if this were also part of the reflow metrics...
+ nsIAreaFrame* areaFrame;
+ if (NS_SUCCEEDED(kidFrame->QueryInterface(kAreaFrameIID, (void**)&areaFrame))) {
+ // Get the x-most and y-most of the absolutely positioned children
+ nscoord positionedXMost, positionedYMost;
+ areaFrame->GetPositionedInfo(positionedXMost, positionedYMost);
+
+ // The background covers the content area and padding area, so check
+ // for children sticking outside the padding edge
+ nscoord paddingEdgeX = kidDesiredSize.width - border.right;
+ nscoord paddingEdgeY = kidDesiredSize.height - border.bottom;
- if (positionedXMost > paddingEdgeX) {
- kidDesiredSize.width = positionedXMost + border.right;
- }
- if (positionedYMost > paddingEdgeY) {
- kidDesiredSize.height = positionedYMost + border.bottom;
- }
+ if (positionedXMost > paddingEdgeX) {
+ kidDesiredSize.width = positionedXMost + border.right;
}
-
- // If our height is fixed, then make sure the child frame plus its top and
- // bottom margin is at least that high as well...
- if (NS_AUTOHEIGHT != aReflowState.mComputedHeight) {
- nscoord totalHeight = kidDesiredSize.height + kidReflowState.mComputedMargin.top +
- kidReflowState.mComputedMargin.bottom;
-
- if (totalHeight < aReflowState.mComputedHeight) {
- kidDesiredSize.height += aReflowState.mComputedHeight - totalHeight;
- }
+ if (positionedYMost > paddingEdgeY) {
+ kidDesiredSize.height = positionedYMost + border.bottom;
}
+ }
- // Position and size the child frame
- nsRect rect(kidReflowState.mComputedMargin.left, kidReflowState.mComputedMargin.top,
- kidDesiredSize.width, kidDesiredSize.height);
- kidFrame->SetRect(&aPresContext, rect);
+ // If our height is fixed, then make sure the child frame plus its top and
+ // bottom margin is at least that high as well...
+ if (NS_AUTOHEIGHT != aReflowState.mComputedHeight) {
+ nscoord totalHeight = kidDesiredSize.height + kidReflowState.mComputedMargin.top +
+ kidReflowState.mComputedMargin.bottom;
- // If the child frame was just inserted, then we're responsible for making sure
- // it repaints
- if (isDirtyChildReflow) {
- // Damage the area occupied by the deleted frame
- Invalidate(&aPresContext, rect, PR_FALSE);
+ if (totalHeight < aReflowState.mComputedHeight) {
+ kidDesiredSize.height += aReflowState.mComputedHeight - totalHeight;
}
}
+ // Position and size the child frame
+ nsRect rect(kidReflowState.mComputedMargin.left, kidReflowState.mComputedMargin.top,
+ kidDesiredSize.width, kidDesiredSize.height);
+ kidFrame->SetRect(&aPresContext, rect);
+
+ // If the child frame was just inserted, then we're responsible for making sure
+ // it repaints
+ if (isDirtyChildReflow) {
+ // Damage the area occupied by the deleted frame
+ Invalidate(&aPresContext, rect, PR_FALSE);
+ }
+
// Return our desired size
aDesiredSize.width = kidDesiredSize.width + kidReflowState.mComputedMargin.left +
kidReflowState.mComputedMargin.right;
@@ -405,7 +402,7 @@ RootFrame::Reflow(nsIPresContext& aPresContext,
aDesiredSize.descent = 0;
// XXX Don't completely ignore NS_FRAME_OUTSIDE_CHILDREN for child frames
// that stick out on the left or top edges...
-
+
// XXX Temporary hack. Remember this for later when our parent resizes us.
// See SetRect()
mNaturalHeight = aDesiredSize.height;
diff --git a/mozilla/layout/html/base/src/nsHTMLIIDs.cpp b/mozilla/layout/html/base/src/nsHTMLIIDs.cpp
index 0d6d4688af3..14d0ae3e847 100644
--- a/mozilla/layout/html/base/src/nsHTMLIIDs.cpp
+++ b/mozilla/layout/html/base/src/nsHTMLIIDs.cpp
@@ -17,13 +17,11 @@
*/
#include "nsHTMLIIDs.h"
#include "nsIHTMLContent.h"
-#include "nsIHTMLReflow.h"
#include "nsIPageSequenceFrame.h"
#include "nsITextContent.h"
#include "nsIAreaFrame.h"
const nsIID kIHTMLContentIID = NS_IHTMLCONTENT_IID;
-const nsIID kIHTMLReflowIID = NS_IHTMLREFLOW_IID;
const nsIID kIPageSequenceFrameIID = NS_IPAGESEQUENCEFRAME_IID;
const nsIID kIStyledContentIID = NS_ISTYLEDCONTENT_IID;
const nsIID kITextContentIID = NS_ITEXT_CONTENT_IID;
diff --git a/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp b/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp
index f551491f028..9e791044af0 100644
--- a/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp
+++ b/mozilla/layout/html/base/src/nsHTMLImageLoader.cpp
@@ -16,7 +16,6 @@
* Reserved.
*/
#include "nsHTMLImageLoader.h"
-#include "nsIHTMLReflow.h"
#include "nsFrame.h"
#include "nsIURL.h"
#include "nsNeckoUtil.h"
diff --git a/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp b/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp
index 4cc225bfd7f..0e82ee32699 100644
--- a/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp
+++ b/mozilla/layout/html/base/src/nsHTMLReflowCommand.cpp
@@ -19,7 +19,6 @@
#include "nsHTMLReflowCommand.h"
#include "nsHTMLParts.h"
#include "nsIFrame.h"
-#include "nsIHTMLReflow.h"
#include "nsIPresContext.h"
#include "nsIPresShell.h"
#include "nsIContent.h"
@@ -129,13 +128,9 @@ NS_IMETHODIMP nsHTMLReflowCommand::Dispatch(nsIPresContext& aPresContext,
nsHTMLReflowState reflowState(aPresContext, root, *this,
&aRendContext, aMaxSize);
-
- nsIHTMLReflow* htmlReflow;
nsReflowStatus status;
- if (NS_OK == root->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(aPresContext, aDesiredSize, reflowState, status);
- }
+ root->Reflow(aPresContext, aDesiredSize, reflowState, status);
}
return NS_OK;
diff --git a/mozilla/layout/html/base/src/nsHTMLReflowState.cpp b/mozilla/layout/html/base/src/nsHTMLReflowState.cpp
index 64dfa6ab1ee..37471b48468 100644
--- a/mozilla/layout/html/base/src/nsHTMLReflowState.cpp
+++ b/mozilla/layout/html/base/src/nsHTMLReflowState.cpp
@@ -20,7 +20,6 @@
#include "nsIStyleContext.h"
#include "nsStyleConsts.h"
#include "nsFrame.h"
-#include "nsIHTMLReflow.h"
#include "nsIContent.h"
#include "nsHTMLAtoms.h"
#include "nsIPresContext.h"
@@ -177,7 +176,7 @@ nsHTMLReflowState::Init(nsIPresContext& aPresContext,
}
const nsHTMLReflowState*
-nsHTMLReflowState::GetContainingBlockReflowState(const nsReflowState* aParentRS)
+nsHTMLReflowState::GetContainingBlockReflowState(const nsHTMLReflowState* aParentRS)
{
while (nsnull != aParentRS) {
if (nsnull != aParentRS->frame) {
@@ -186,7 +185,7 @@ nsHTMLReflowState::GetContainingBlockReflowState(const nsReflowState* aParentRS)
// reflow state...
nsresult rv = aParentRS->frame->IsPercentageBase(isContainingBlock);
if (NS_SUCCEEDED(rv) && isContainingBlock) {
- return (const nsHTMLReflowState*) aParentRS;
+ return aParentRS;
}
}
aParentRS = aParentRS->parentReflowState;
@@ -195,20 +194,20 @@ nsHTMLReflowState::GetContainingBlockReflowState(const nsReflowState* aParentRS)
}
const nsHTMLReflowState*
-nsHTMLReflowState::GetPageBoxReflowState(const nsReflowState* aParentRS)
+nsHTMLReflowState::GetPageBoxReflowState(const nsHTMLReflowState* aParentRS)
{
// XXX write me as soon as we can ask a frame if it's a page frame...
return nsnull;
}
nscoord
-nsHTMLReflowState::GetContainingBlockContentWidth(const nsReflowState* aParentRS)
+nsHTMLReflowState::GetContainingBlockContentWidth(const nsHTMLReflowState* aParentRS)
{
nscoord width = 0;
const nsHTMLReflowState* rs =
GetContainingBlockReflowState(aParentRS);
if (nsnull != rs) {
- return ((nsHTMLReflowState*)aParentRS)->mComputedWidth;/* XXX cast */
+ return aParentRS->mComputedWidth;
}
return width;
}
diff --git a/mozilla/layout/html/base/src/nsIHTMLReflow.h b/mozilla/layout/html/base/src/nsIHTMLReflow.h
deleted file mode 100644
index 6625020c346..00000000000
--- a/mozilla/layout/html/base/src/nsIHTMLReflow.h
+++ /dev/null
@@ -1,440 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.0 (the "NPL"); you may not use this file except in
- * compliance with the NPL. You may obtain a copy of the NPL at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the NPL is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
- * for the specific language governing rights and limitations under the
- * NPL.
- *
- * The Initial Developer of this code under the NPL is Netscape
- * Communications Corporation. Portions created by Netscape are
- * Copyright (C) 1998 Netscape Communications Corporation. All Rights
- * Reserved.
- */
-#ifndef nsIHTMLReflow_h___
-#define nsIHTMLReflow_h___
-
-#include "nsIFrameReflow.h"
-#include "nsStyleConsts.h"
-#include "nsStyleCoord.h"
-#include "nsRect.h"
-class nsISpaceManager;
-class nsBlockFrame;
-class nsLineLayout;
-struct nsStyleDisplay;
-struct nsStylePosition;
-struct nsStyleSpacing;
-
-// IID for the nsIHTMLFrame interface
-// a6cf9069-15b3-11d2-932e-00805f8add32
-#define NS_IHTMLREFLOW_IID \
- { 0xa6cf9069, 0x15b3, 0x11d2,{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}}
-
-//----------------------------------------------------------------------
-
-// For HTML reflow we rename with the different paint layers are
-// actually used for.
-#define NS_FRAME_PAINT_LAYER_BACKGROUND eFramePaintLayer_Underlay
-#define NS_FRAME_PAINT_LAYER_FLOATERS eFramePaintLayer_Content
-#define NS_FRAME_PAINT_LAYER_FOREGROUND eFramePaintLayer_Overlay
-#define NS_FRAME_PAINT_LAYER_DEBUG eFramePaintLayer_Overlay
-
-//----------------------------------------------------------------------
-
-/**
- * HTML/CSS specific reflow metrics
- */
-struct nsHTMLReflowMetrics : nsReflowMetrics {
- // Carried out bottom margin values. This is the collapsed
- // (generational) bottom margin value.
- nscoord mCarriedOutBottomMargin;
-
- // For frames that have children that stick outside their rect
- // (NS_FRAME_OUTSIDE_CHILDREN) this rectangle will contain the
- // absolute bounds of the frame. Since the frame doesn't know where
- // it is going to be positioned in its parent, the assumption is
- // that it is placed at 0,0 when computing this area.
- nsRect mCombinedArea;
-
- nsHTMLReflowMetrics(nsSize* aMaxElementSize)
- : nsReflowMetrics(aMaxElementSize)
- {
- mCarriedOutBottomMargin = 0;
- mCombinedArea.x = 0;
- mCombinedArea.y = 0;
- mCombinedArea.width = 0;
- mCombinedArea.height = 0;
- }
-
- void AddBorderPaddingToMaxElementSize(const nsMargin& aBorderPadding) {
- maxElementSize->width += aBorderPadding.left + aBorderPadding.right;
- maxElementSize->height += aBorderPadding.top + aBorderPadding.bottom;
- }
-};
-
-// Carried out margin flags
-#define NS_CARRIED_TOP_MARGIN_IS_AUTO 0x1
-#define NS_CARRIED_BOTTOM_MARGIN_IS_AUTO 0x2
-
-//----------------------------------------------------------------------
-
-/**
- * CSS Frame type. Included as part of the reflow state.
- */
-typedef PRUint32 nsCSSFrameType;
-
-#define NS_CSS_FRAME_TYPE_UNKNOWN 0
-#define NS_CSS_FRAME_TYPE_INLINE 1
-#define NS_CSS_FRAME_TYPE_BLOCK 2 /* block-level in normal flow */
-#define NS_CSS_FRAME_TYPE_FLOATING 3
-#define NS_CSS_FRAME_TYPE_ABSOLUTE 4
-#define NS_CSS_FRAME_TYPE_INTERNAL_TABLE 5 /* row group frame, row frame, cell frame, ... */
-
-/**
- * Bit-flag that indicates whether the element is replaced. Applies to inline,
- * block-level, floating, and absolutely positioned elements
- */
-#define NS_CSS_FRAME_TYPE_REPLACED 0x8000
-
-/**
- * Helper macros for telling whether items are replaced
- */
-#define NS_FRAME_IS_REPLACED(_ft) \
- (NS_CSS_FRAME_TYPE_REPLACED == ((_ft) & NS_CSS_FRAME_TYPE_REPLACED))
-
-#define NS_FRAME_REPLACED(_ft) \
- (NS_CSS_FRAME_TYPE_REPLACED | (_ft))
-
-/**
- * A macro to extract the type. Masks off the 'replaced' bit-flag
- */
-#define NS_FRAME_GET_TYPE(_ft) \
- ((_ft) & ~NS_CSS_FRAME_TYPE_REPLACED)
-
-//----------------------------------------------------------------------
-
-#define NS_INTRINSICSIZE NS_UNCONSTRAINEDSIZE
-#define NS_AUTOHEIGHT NS_UNCONSTRAINEDSIZE
-#define NS_AUTOMARGIN NS_UNCONSTRAINEDSIZE
-
-/**
- * HTML version of the reflow state.
- *
- * Note: the constructors are implemented inline later on in this file
- */
-struct nsHTMLReflowState : nsReflowState {
- // The type of frame, from css's perspective. This value is
- // initialized by the Init method below.
- nsCSSFrameType mFrameType;
-
- nsISpaceManager* mSpaceManager;
-
- // LineLayout object (only for inline reflow; set to NULL otherwise)
- nsLineLayout* mLineLayout;
-
- // The computed width specifies the frame's content width, and it does not
- // apply to inline non-replaced elements
- //
- // For replaced inline frames, a value of NS_INTRINSICSIZE means you should
- // use your intrinsic width as the computed width
- //
- // For block-level frames, the computed width is based on the width of the
- // containing block, the margin/border/padding areas, and the min/max width
- nscoord mComputedWidth;
-
- // The computed height specifies the frame's content height, and it does
- // not apply to inline non-replaced elements
- //
- // For replaced inline frames, a value of NS_INTRINSICSIZE means you should
- // use your intrinsic height as the computed height
- //
- // For non-replaced block-level frames in the flow and floated, a value of
- // NS_AUTOHEIGHT means you choose a height to shrink wrap around the normal
- // flow child frames. The height must be within the limit of the min/max
- // height if there is such a limit
- //
- // For replaced block-level frames, a value of NS_INTRINSICSIZE
- // means you use your intrinsic height as the computed height
- nscoord mComputedHeight;
-
- // Computed margin values
- nsMargin mComputedMargin;
-
- // Cached copy of the border values
- nsMargin mComputedBorderPadding;
-
- // Computed padding values
- nsMargin mComputedPadding;
-
- // Computed values for 'left/top/right/bottom' offsets. Only applies to
- // 'positioned' elements
- nsMargin mComputedOffsets;
-
- // Computed values for 'min-width/max-width' and 'min-height/max-height'
- nscoord mComputedMinWidth, mComputedMaxWidth;
- nscoord mComputedMinHeight, mComputedMaxHeight;
-
- // Compact margin available space
- nscoord mCompactMarginWidth;
-
- // The following data members are relevant if nsStyleText.mTextAlign
- // == NS_STYLE_TEXT_ALIGN_CHAR
-
- // distance from reference edge (as specified in nsStyleDisplay.mDirection)
- // to the align character (which will be specified in nsStyleTable)
- nscoord mAlignCharOffset;
-
- // if true, the reflow honors alignCharOffset and does not
- // set it. if false, the reflow sets alignCharOffset
- PRPackedBool mUseAlignCharOffset;
-
- // Cached pointers to the various style structs used during intialization
- const nsStyleDisplay* mStyleDisplay;
- const nsStylePosition* mStylePosition;
- const nsStyleSpacing* mStyleSpacing;
-
- // This value keeps track of how deeply nested a given reflow state
- // is from the top of the frame tree.
- PRInt32 mReflowDepth;
-
- // Note: The copy constructor is written by the compiler
- // automatically. You can use that and then override specific values
- // if you want, or you can call Init as desired...
-
- // Initialize a root reflow state with a rendering context to
- // use for measuring things.
- nsHTMLReflowState(nsIPresContext& aPresContext,
- nsIFrame* aFrame,
- nsReflowReason aReason,
- nsIRenderingContext* aRenderingContext,
- const nsSize& aAvailableSpace);
-
- // Initialize a root reflow state for an incremental
- // reflow.
- nsHTMLReflowState(nsIPresContext& aPresContext,
- nsIFrame* aFrame,
- nsIReflowCommand& aReflowCommand,
- nsIRenderingContext* aRenderingContext,
- const nsSize& aAvailableSpace);
-
- // Initialize a reflow state for a child frames reflow. Some state
- // is copied from the parent reflow state; the remaining state is
- // computed.
- nsHTMLReflowState(nsIPresContext& aPresContext,
- const nsHTMLReflowState& aParentReflowState,
- nsIFrame* aFrame,
- const nsSize& aAvailableSpace,
- nsReflowReason aReason);
-
- // Same as the previous except that the reason is taken from the
- // parent's reflow state.
- nsHTMLReflowState(nsIPresContext& aPresContext,
- const nsHTMLReflowState& aParentReflowState,
- nsIFrame* aFrame,
- const nsSize& aAvailableSpace);
-
- // Used when you want to override the default containing block
- // width and height. Used by absolute positioning code
- nsHTMLReflowState(nsIPresContext& aPresContext,
- const nsHTMLReflowState& aParentReflowState,
- nsIFrame* aFrame,
- const nsSize& aAvailableSpace,
- nscoord aContainingBlockWidth,
- nscoord aContainingBlockHeight);
-
- /**
- * Get the containing block reflow state, starting from a frames
- * parent reflow state (the parent reflow state may or may not end
- * up being the containing block reflow state)
- */
- static const nsHTMLReflowState*
- GetContainingBlockReflowState(const nsReflowState* aParentRS);
-
- /**
- * First find the containing block's reflow state using
- * GetContainingBlockReflowState, then ask the containing block for
- * it's content width using GetContentWidth
- */
- static nscoord
- GetContainingBlockContentWidth(const nsReflowState* aParentRS);
-
- /**
- * Get the page box reflow state, starting from a frames
- * parent reflow state (the parent reflow state may or may not end
- * up being the containing block reflow state)
- */
- static const nsHTMLReflowState*
- GetPageBoxReflowState(const nsReflowState* aParentRS);
-
- /**
- * Compute the border plus padding for aFrame. If a
- * percentage needs to be computed it will be computed by finding
- * the containing block, use GetContainingBlockReflowState.
- * aParentReflowState is aFrame's
- * parent's reflow state. The resulting computed border plus padding
- * is returned in aResult.
- */
- static void ComputeBorderPaddingFor(nsIFrame* aFrame,
- const nsReflowState* aParentRS,
- nsMargin& aResult);
-
- /**
- * Calculate the raw line-height property for the given frame. The return
- * value, if line-height was applied and is valid will be >= 0. Otherwise,
- * the return value will be <0 which is illegal (CSS2 spec: section 10.8.1).
- */
- static nscoord CalcLineHeight(nsIPresContext& aPresContext,
- nsIRenderingContext* aRenderingContext,
- nsIFrame* aFrame);
-
- static PRBool UseComputedHeight();
-
- static nsCSSFrameType DetermineFrameType(nsIFrame* aFrame);
-
- void ComputeContainingBlockRectangle(const nsHTMLReflowState* aContainingBlockRS,
- nscoord& aContainingBlockWidth,
- nscoord& aContainingBlockHeight);
-
-protected:
- // This method initializes various data members. It is automatically
- // called by the various constructors
- void Init(nsIPresContext& aPresContext,
- nscoord aContainingBlockWidth = -1,
- nscoord aContainingBlockHeight = -1);
-
- void InitConstraints(nsIPresContext& aPresContext,
- nscoord aContainingBlockWidth,
- nscoord aContainingBlockHeight);
-
- void InitAbsoluteConstraints(nsIPresContext& aPresContext,
- const nsHTMLReflowState* cbrs,
- nscoord aContainingBlockWidth,
- nscoord aContainingBlockHeight);
-
- void ComputeRelativeOffsets(const nsHTMLReflowState* cbrs,
- nscoord aContainingBlockWidth,
- nscoord aContainingBlockHeight);
-
- void ComputeBlockBoxData(nsIPresContext& aPresContext,
- const nsHTMLReflowState* cbrs,
- nsStyleUnit aWidthUnit,
- nsStyleUnit aHeightUnit,
- nscoord aContainingBlockWidth,
- nscoord aContainingBlockHeight);
-
- void CalculateBlockSideMargins(const nsHTMLReflowState* aContainingBlockRS,
- nscoord aComputedWidth);
-
- void ComputeHorizontalValue(nscoord aContainingBlockWidth,
- nsStyleUnit aUnit,
- const nsStyleCoord& aCoord,
- nscoord& aResult);
-
- void ComputeVerticalValue(nscoord aContainingBlockHeight,
- nsStyleUnit aUnit,
- const nsStyleCoord& aCoord,
- nscoord& aResult);
-
- static nsCSSFrameType DetermineFrameType(nsIFrame* aFrame,
- const nsStylePosition* aPosition,
- const nsStyleDisplay* aDisplay);
-
- // Computes margin values from the specified margin style information, and
- // fills in the mComputedMargin member
- void ComputeMargin(nscoord aContainingBlockWidth,
- const nsHTMLReflowState* aContainingBlockRS);
-
- // Computes padding values from the specified padding style information, and
- // fills in the mComputedPadding member
- void ComputePadding(nscoord aContainingBlockWidth,
- const nsHTMLReflowState* aContainingBlockRS);
-
- // Calculates the computed values for the 'min-Width', 'max-Width',
- // 'min-Height', and 'max-Height' properties, and stores them in the assorted
- // data members
- void ComputeMinMaxValues(nscoord aContainingBlockWidth,
- nscoord aContainingBlockHeight,
- const nsHTMLReflowState* aContainingBlockRS);
-
-};
-
-//----------------------------------------------------------------------
-
-/**
- * Extensions to the reflow status bits defined by nsIFrameReflow
- */
-
-// This bit is set, when a break is requested. This bit is orthogonal
-// to the nsIFrame::nsReflowStatus completion bits.
-#define NS_INLINE_BREAK 0x0100
-
-// When a break is requested, this bit when set indicates that the
-// break should occur after the frame just reflowed; when the bit is
-// clear the break should occur before the frame just reflowed.
-#define NS_INLINE_BREAK_BEFORE 0x0000
-#define NS_INLINE_BREAK_AFTER 0x0200
-
-// The type of break requested can be found in these bits.
-#define NS_INLINE_BREAK_TYPE_MASK 0xF000
-
-//----------------------------------------
-// Macros that use those bits
-
-#define NS_INLINE_IS_BREAK(_status) \
- (0 != ((_status) & NS_INLINE_BREAK))
-
-#define NS_INLINE_IS_BREAK_AFTER(_status) \
- (0 != ((_status) & NS_INLINE_BREAK_AFTER))
-
-#define NS_INLINE_IS_BREAK_BEFORE(_status) \
- (NS_INLINE_BREAK == ((_status) & (NS_INLINE_BREAK|NS_INLINE_BREAK_AFTER)))
-
-#define NS_INLINE_GET_BREAK_TYPE(_status) (((_status) >> 12) & 0xF)
-
-#define NS_INLINE_MAKE_BREAK_TYPE(_type) ((_type) << 12)
-
-// Construct a line-break-before status. Note that there is no
-// completion status for a line-break before because we *know* that
-// the frame will be reflowed later and hence it's current completion
-// status doesn't matter.
-#define NS_INLINE_LINE_BREAK_BEFORE() \
- (NS_INLINE_BREAK | NS_INLINE_BREAK_BEFORE | \
- NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE))
-
-// Take a completion status and add to it the desire to have a
-// line-break after. For this macro we do need the completion status
-// because the user of the status will need to know whether to
-// continue the frame or not.
-#define NS_INLINE_LINE_BREAK_AFTER(_completionStatus) \
- ((_completionStatus) | NS_INLINE_BREAK | NS_INLINE_BREAK_AFTER | \
- NS_INLINE_MAKE_BREAK_TYPE(NS_STYLE_CLEAR_LINE))
-
-//----------------------------------------------------------------------
-
-/**
- * Generate a reflow interface specific to HTML/CSS frame objects
- */
-class nsIHTMLReflow : public nsIFrameReflow
-{
-public:
- // Helper method used by block reflow to identify runs of text so that
- // proper word-breaking can be done.
- NS_IMETHOD FindTextRuns(nsLineLayout& aLineLayout) = 0;
-
- // Justification helper method used to distribute extra space in a
- // line to leaf frames. aUsedSpace is filled in with the amount of
- // space actually used.
- NS_IMETHOD AdjustFrameSize(nscoord aExtraSpace, nscoord& aUsedSpace) = 0;
-
- // Justification helper method that is used to remove trailing
- // whitespace before justification.
- NS_IMETHOD TrimTrailingWhiteSpace(nsIPresContext* aPresContext,
- nsIRenderingContext& aRC,
- nscoord& aDeltaWidth) = 0;
-};
-
-#endif /* nsIHTMLReflow_h___ */
diff --git a/mozilla/layout/html/base/src/nsInlineFrame.cpp b/mozilla/layout/html/base/src/nsInlineFrame.cpp
index 10e6cac1c25..6b1a04b6719 100644
--- a/mozilla/layout/html/base/src/nsInlineFrame.cpp
+++ b/mozilla/layout/html/base/src/nsInlineFrame.cpp
@@ -1331,11 +1331,7 @@ nsInlineFrame::FindTextRuns(nsLineLayout& aLineLayout)
else {
nsIFrame* frame = mFrames.FirstChild();
while (nsnull != frame) {
- nsIHTMLReflow* ihr;
- nsresult rv = frame->QueryInterface(kIHTMLReflowIID, (void**)&ihr);
- if (NS_SUCCEEDED(rv)) {
- ihr->FindTextRuns(aLineLayout);
- }
+ frame->FindTextRuns(aLineLayout);
frame->GetNextSibling(&frame);
}
}
@@ -1353,9 +1349,6 @@ nsInlineFrame::DrainOverflow(nsIPresContext* aPresContext)
if (prevOverflowFrames) {
// When pushing and pulling frames we need to check for whether any
// views need to be reparented.
- // XXX Doing it this way means an extra pass over the frames. We could
- // change InsertFrames() to do this, but that's a general purpose
- // function and it doesn't seem like this functionality belongs there...
for (nsIFrame* f = prevOverflowFrames; f; f->GetNextSibling(&f)) {
nsHTMLContainerFrame::ReparentFrameView(aPresContext, f, prevInFlow, this);
}
diff --git a/mozilla/layout/html/base/src/nsLineLayout.cpp b/mozilla/layout/html/base/src/nsLineLayout.cpp
index 36101189146..ede0c3d1f0e 100644
--- a/mozilla/layout/html/base/src/nsLineLayout.cpp
+++ b/mozilla/layout/html/base/src/nsLineLayout.cpp
@@ -843,7 +843,7 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
reason = eReflowReason_StyleChange;
}
else {
- const nsReflowState* rs = psd->mReflowState;
+ const nsHTMLReflowState* rs = psd->mReflowState;
if (rs->reason == eReflowReason_Incremental) {
// If the incremental reflow command is a StyleChanged reflow and
// it's target is the current span, then make sure we send
@@ -906,10 +906,8 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
// Let frame know that are reflowing it
nscoord x = pfd->mBounds.x;
nscoord y = pfd->mBounds.y;
- nsIHTMLReflow* htmlReflow;
- aFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- htmlReflow->WillReflow(mPresContext);
+ aFrame->WillReflow(mPresContext);
// Adjust spacemanager coordinate system for the frame. The
// spacemanager coordinates are inside the current spans
@@ -935,7 +933,7 @@ nsLineLayout::ReflowFrame(nsIFrame* aFrame,
nscoord tx = x - psd->mReflowState->mComputedBorderPadding.left;
nscoord ty = y - psd->mReflowState->mComputedBorderPadding.top;
mSpaceManager->Translate(tx, ty);
- htmlReflow->Reflow(mPresContext, metrics, reflowState, aReflowStatus);
+ aFrame->Reflow(mPresContext, metrics, reflowState, aReflowStatus);
// XXX See if the frame is a placeholderFrame and if it is process
// the floater.
@@ -2177,46 +2175,42 @@ nsLineLayout::TrimTrailingWhiteSpaceIn(PerSpanData* psd,
}
else if (pfd->mIsNonEmptyTextFrame) {
nscoord deltaWidth = 0;
- nsIHTMLReflow* hr;
- nsresult rv = pfd->mFrame->QueryInterface(kIHTMLReflowIID, (void**)&hr);
- if (NS_SUCCEEDED(rv)) {
- hr->TrimTrailingWhiteSpace(&mPresContext,
- *mBlockReflowState->rendContext,
- deltaWidth);
+ pfd->mFrame->TrimTrailingWhiteSpace(&mPresContext,
+ *mBlockReflowState->rendContext,
+ deltaWidth);
#ifdef NOISY_TRIM
- nsFrame::ListTag(stdout, (psd == mRootSpan
- ? mBlockReflowState->frame
- : psd->mFrame->mFrame));
- printf(": trim of ");
- nsFrame::ListTag(stdout, pfd->mFrame);
- printf(" returned %d\n", deltaWidth);
+ nsFrame::ListTag(stdout, (psd == mRootSpan
+ ? mBlockReflowState->frame
+ : psd->mFrame->mFrame));
+ printf(": trim of ");
+ nsFrame::ListTag(stdout, pfd->mFrame);
+ printf(" returned %d\n", deltaWidth);
#endif
- if (deltaWidth) {
- pfd->mBounds.width -= deltaWidth;
- pfd->mCombinedArea.width -= deltaWidth;
- if (0 == pfd->mBounds.width) {
- pfd->mMaxElementSize.width = 0;
- pfd->mMaxElementSize.height = 0;
- }
+ if (deltaWidth) {
+ pfd->mBounds.width -= deltaWidth;
+ pfd->mCombinedArea.width -= deltaWidth;
+ if (0 == pfd->mBounds.width) {
+ pfd->mMaxElementSize.width = 0;
+ pfd->mMaxElementSize.height = 0;
+ }
- // See if the text frame has already been placed in its parent
- if (psd != mRootSpan) {
- // The frame was already placed during psd's
- // reflow. Update the frames rectangle now.
- pfd->mFrame->SetRect(&mPresContext, pfd->mBounds);
- }
+ // See if the text frame has already been placed in its parent
+ if (psd != mRootSpan) {
+ // The frame was already placed during psd's
+ // reflow. Update the frames rectangle now.
+ pfd->mFrame->SetRect(&mPresContext, pfd->mBounds);
+ }
- // Adjust containing span's right edge
- psd->mX -= deltaWidth;
+ // Adjust containing span's right edge
+ psd->mX -= deltaWidth;
- // Slide any frames that follow the text frame over by the
- // right amount. The only thing that can follow the text
- // frame is empty stuff, so we are just making things
- // sensible (keeping the combined area honest).
- while (pfd->mNext) {
- pfd = pfd->mNext;
- pfd->mBounds.x -= deltaWidth;
- }
+ // Slide any frames that follow the text frame over by the
+ // right amount. The only thing that can follow the text
+ // frame is empty stuff, so we are just making things
+ // sensible (keeping the combined area honest).
+ while (pfd->mNext) {
+ pfd = pfd->mNext;
+ pfd->mBounds.x -= deltaWidth;
}
}
@@ -2226,6 +2220,7 @@ nsLineLayout::TrimTrailingWhiteSpaceIn(PerSpanData* psd,
}
pfd = pfd->mPrev;
}
+
*aDeltaWidth = 0;
return PR_FALSE;
}
diff --git a/mozilla/layout/html/base/src/nsPageFrame.cpp b/mozilla/layout/html/base/src/nsPageFrame.cpp
index 4afafc251d8..96e1d5712c9 100644
--- a/mozilla/layout/html/base/src/nsPageFrame.cpp
+++ b/mozilla/layout/html/base/src/nsPageFrame.cpp
@@ -117,29 +117,26 @@ NS_METHOD nsPageFrame::Reflow(nsIPresContext& aPresContext,
maxSize);
kidReflowState.isTopOfPage = PR_TRUE;
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == frame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- // Get the child's desired size
- ReflowChild(frame, aPresContext, aDesiredSize, kidReflowState, aStatus);
-
- // Make sure the child is at least as tall as our max size (the containing window)
- if (aDesiredSize.height < aReflowState.availableHeight) {
- aDesiredSize.height = aReflowState.availableHeight;
- }
-
- // Place and size the child
- nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height);
- frame->SetRect(&aPresContext, rect);
- // XXX Should we be sending the DidReflow?
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
-
- // Is the frame complete?
- if (NS_FRAME_IS_COMPLETE(aStatus)) {
- nsIFrame* childNextInFlow;
-
- frame->GetNextInFlow(&childNextInFlow);
- NS_ASSERTION(nsnull == childNextInFlow, "bad child flow list");
- }
+ // Get the child's desired size
+ ReflowChild(frame, aPresContext, aDesiredSize, kidReflowState, aStatus);
+
+ // Make sure the child is at least as tall as our max size (the containing window)
+ if (aDesiredSize.height < aReflowState.availableHeight) {
+ aDesiredSize.height = aReflowState.availableHeight;
+ }
+
+ // Place and size the child
+ nsRect rect(0, 0, aDesiredSize.width, aDesiredSize.height);
+ frame->SetRect(&aPresContext, rect);
+ // XXX Should we be sending the DidReflow?
+ frame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
+
+ // Is the frame complete?
+ if (NS_FRAME_IS_COMPLETE(aStatus)) {
+ nsIFrame* childNextInFlow;
+
+ frame->GetNextInFlow(&childNextInFlow);
+ NS_ASSERTION(nsnull == childNextInFlow, "bad child flow list");
}
}
diff --git a/mozilla/layout/html/base/src/nsPresShell.cpp b/mozilla/layout/html/base/src/nsPresShell.cpp
index 8920e2255a3..8070e1c9a99 100644
--- a/mozilla/layout/html/base/src/nsPresShell.cpp
+++ b/mozilla/layout/html/base/src/nsPresShell.cpp
@@ -939,7 +939,6 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
nsSize maxSize(bounds.width, bounds.height);
nsHTMLReflowMetrics desiredSize(nsnull);
nsReflowStatus status;
- nsIHTMLReflow* htmlReflow;
nsIRenderingContext* rcx = nsnull;
CreateRenderingContext(rootFrame, &rcx);
@@ -947,18 +946,16 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight)
nsHTMLReflowState reflowState(*mPresContext, rootFrame,
eReflowReason_Initial, rcx, maxSize);
- if (NS_OK == rootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
- rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
- mPresContext->SetVisibleArea(nsRect(0,0,desiredSize.width,desiredSize.height));
+ rootFrame->Reflow(*mPresContext, desiredSize, reflowState, status);
+ rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
+ mPresContext->SetVisibleArea(nsRect(0,0,desiredSize.width,desiredSize.height));
#ifdef NS_DEBUG
- if (nsIFrame::GetVerifyTreeEnable()) {
- rootFrame->VerifyTree();
- }
-#endif
- VERIFY_STYLE_TREE;
+ if (nsIFrame::GetVerifyTreeEnable()) {
+ rootFrame->VerifyTree();
}
+#endif
+ VERIFY_STYLE_TREE;
NS_IF_RELEASE(rcx);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::InitialReflow"));
RAPTOR_STOPWATCH_DEBUGTRACE(("Stop: Reflow: PresShell::InitialReflow(), this=%p\n", this));
@@ -1019,7 +1016,6 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight)
nsSize maxSize(bounds.width, bounds.height);
nsHTMLReflowMetrics desiredSize(nsnull);
nsReflowStatus status;
- nsIHTMLReflow* htmlReflow;
nsIRenderingContext* rcx = nsnull;
CreateRenderingContext(rootFrame, &rcx);
@@ -1027,16 +1023,14 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight)
nsHTMLReflowState reflowState(*mPresContext, rootFrame,
eReflowReason_Resize, rcx, maxSize);
- if (NS_OK == rootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
- rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
+ rootFrame->Reflow(*mPresContext, desiredSize, reflowState, status);
+ rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
#ifdef NS_DEBUG
- if (nsIFrame::GetVerifyTreeEnable()) {
- rootFrame->VerifyTree();
- }
-#endif
- VERIFY_STYLE_TREE;
+ if (nsIFrame::GetVerifyTreeEnable()) {
+ rootFrame->VerifyTree();
}
+#endif
+ VERIFY_STYLE_TREE;
NS_IF_RELEASE(rcx);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::ResizeReflow"));
@@ -1198,7 +1192,6 @@ PresShell::StyleChangeReflow()
nsSize maxSize(bounds.width, bounds.height);
nsHTMLReflowMetrics desiredSize(nsnull);
nsReflowStatus status;
- nsIHTMLReflow* htmlReflow;
nsIRenderingContext* rcx = nsnull;
CreateRenderingContext(rootFrame, &rcx);
@@ -1207,16 +1200,14 @@ PresShell::StyleChangeReflow()
nsHTMLReflowState reflowState(*mPresContext, rootFrame,
eReflowReason_Resize, rcx, maxSize);
- if (NS_OK == rootFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->Reflow(*mPresContext, desiredSize, reflowState, status);
- rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
+ rootFrame->Reflow(*mPresContext, desiredSize, reflowState, status);
+ rootFrame->SizeTo(mPresContext, desiredSize.width, desiredSize.height);
#ifdef NS_DEBUG
- if (nsIFrame::GetVerifyTreeEnable()) {
- rootFrame->VerifyTree();
- }
-#endif
- VERIFY_STYLE_TREE;
+ if (nsIFrame::GetVerifyTreeEnable()) {
+ rootFrame->VerifyTree();
}
+#endif
+ VERIFY_STYLE_TREE;
NS_IF_RELEASE(rcx);
NS_FRAME_LOG(NS_FRAME_TRACE_CALLS, ("exit nsPresShell::StyleChangeReflow"));
}
diff --git a/mozilla/layout/html/base/src/nsScrollFrame.cpp b/mozilla/layout/html/base/src/nsScrollFrame.cpp
index d72266e016d..4e95ac625de 100644
--- a/mozilla/layout/html/base/src/nsScrollFrame.cpp
+++ b/mozilla/layout/html/base/src/nsScrollFrame.cpp
@@ -162,10 +162,8 @@ nsScrollFrame::DidReflow(nsIPresContext& aPresContext,
// Send the DidReflow notification to the scrolled frame's view
nsIFrame* frame = mFrames.FirstChild();
- nsIHTMLReflow* htmlReflow;
- frame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- htmlReflow->DidReflow(aPresContext, aStatus);
+ frame->DidReflow(aPresContext, aStatus);
// Size the scrolled frame's view. Leave its position alone
nsSize size;
diff --git a/mozilla/layout/html/base/src/nsScrollPortFrame.cpp b/mozilla/layout/html/base/src/nsScrollPortFrame.cpp
index f19df61a1e2..743d16b624b 100644
--- a/mozilla/layout/html/base/src/nsScrollPortFrame.cpp
+++ b/mozilla/layout/html/base/src/nsScrollPortFrame.cpp
@@ -172,10 +172,8 @@ nsScrollPortFrame::DidReflow(nsIPresContext& aPresContext,
// Send the DidReflow notification to the scrolled frame's view
nsIFrame* frame = mFrames.FirstChild();
- nsIHTMLReflow* htmlReflow;
- frame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- htmlReflow->DidReflow(aPresContext, aStatus);
+ frame->DidReflow(aPresContext, aStatus);
// Size the scrolled frame's view. Leave its position alone
nsSize size;
diff --git a/mozilla/layout/html/base/src/nsViewportFrame.cpp b/mozilla/layout/html/base/src/nsViewportFrame.cpp
index 4b981bedc44..422a545b561 100644
--- a/mozilla/layout/html/base/src/nsViewportFrame.cpp
+++ b/mozilla/layout/html/base/src/nsViewportFrame.cpp
@@ -326,42 +326,38 @@ ViewportFrame::ReflowFixedFrame(nsIPresContext& aPresContext,
nsReflowStatus& aStatus) const
{
// Reflow the frame
- nsIHTMLReflow* htmlReflow;
- nsresult rv;
+ nsresult rv;
- rv = aKidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->WillReflow(aPresContext);
+ aKidFrame->WillReflow(aPresContext);
- nsHTMLReflowMetrics kidDesiredSize(nsnull);
- nsSize availSize(aReflowState.availableWidth, NS_UNCONSTRAINEDSIZE);
- nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
- availSize);
+ nsHTMLReflowMetrics kidDesiredSize(nsnull);
+ nsSize availSize(aReflowState.availableWidth, NS_UNCONSTRAINEDSIZE);
+ nsHTMLReflowState kidReflowState(aPresContext, aReflowState, aKidFrame,
+ availSize);
- // If it's the initial reflow, then override the reflow reason. This is
- // used when frames are inserted incrementally
- if (aInitialReflow) {
- kidReflowState.reason = eReflowReason_Initial;
- }
-
- htmlReflow->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
-
- // XXX If the child had a fixed height, then make sure it respected it...
- if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
- if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
- kidDesiredSize.height = kidReflowState.mComputedHeight;
- kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
- kidReflowState.mComputedBorderPadding.bottom;
- }
- }
-
- // Position the child
- nsRect rect(kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
- kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
- kidDesiredSize.width, kidDesiredSize.height);
- aKidFrame->SetRect(&aPresContext, rect);
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
+ // If it's the initial reflow, then override the reflow reason. This is
+ // used when frames are inserted incrementally
+ if (aInitialReflow) {
+ kidReflowState.reason = eReflowReason_Initial;
}
+
+ rv = aKidFrame->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
+
+ // XXX If the child had a fixed height, then make sure it respected it...
+ if (NS_AUTOHEIGHT != kidReflowState.mComputedHeight) {
+ if (kidDesiredSize.height < kidReflowState.mComputedHeight) {
+ kidDesiredSize.height = kidReflowState.mComputedHeight;
+ kidDesiredSize.height += kidReflowState.mComputedBorderPadding.top +
+ kidReflowState.mComputedBorderPadding.bottom;
+ }
+ }
+
+ // Position the child
+ nsRect rect(kidReflowState.mComputedOffsets.left + kidReflowState.mComputedMargin.left,
+ kidReflowState.mComputedOffsets.top + kidReflowState.mComputedMargin.top,
+ kidDesiredSize.width, kidDesiredSize.height);
+ aKidFrame->SetRect(&aPresContext, rect);
+ aKidFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
return rv;
}
@@ -507,20 +503,17 @@ ViewportFrame::Reflow(nsIPresContext& aPresContext,
kidFrame, availableSpace);
// Reflow the frame
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- kidReflowState.mComputedHeight = aReflowState.availableHeight;
- ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
- aStatus);
+ kidReflowState.mComputedHeight = aReflowState.availableHeight;
+ ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,
+ aStatus);
- nsRect rect(0, 0, kidDesiredSize.width, kidDesiredSize.height);
- kidFrame->SetRect(&aPresContext, rect);
- kidRect = rect;
+ nsRect rect(0, 0, kidDesiredSize.width, kidDesiredSize.height);
+ kidFrame->SetRect(&aPresContext, rect);
+ kidRect = rect;
- // XXX We should resolve the details of who/when DidReflow()
- // notifications are sent...
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
- }
+ // XXX We should resolve the details of who/when DidReflow()
+ // notifications are sent...
+ kidFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
}
// If it's a 'initial', 'resize', or 'style change' reflow command (anything
diff --git a/mozilla/layout/html/document/src/nsFrameFrame.cpp b/mozilla/layout/html/document/src/nsFrameFrame.cpp
index 44d69defcdf..a5bb183de4c 100644
--- a/mozilla/layout/html/document/src/nsFrameFrame.cpp
+++ b/mozilla/layout/html/document/src/nsFrameFrame.cpp
@@ -350,16 +350,12 @@ nsHTMLFrameOuterFrame::Reflow(nsIPresContext& aPresContext,
nsHTMLReflowMetrics kidMetrics(aDesiredSize.maxElementSize);
nsHTMLReflowState kidReflowState(aPresContext, aReflowState, firstChild,
innerSize);
- nsIHTMLReflow* htmlReflow;
-
- if (NS_OK == firstChild->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- ReflowChild(firstChild, aPresContext, kidMetrics, kidReflowState, aStatus);
- NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
+ ReflowChild(firstChild, aPresContext, kidMetrics, kidReflowState, aStatus);
+ NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
- // Place and size the child
- nsRect rect(offset.x, offset.y, innerSize.width, innerSize.height);
- firstChild->SetRect(&aPresContext, rect);
- }
+ // Place and size the child
+ nsRect rect(offset.x, offset.y, innerSize.width, innerSize.height);
+ firstChild->SetRect(&aPresContext, rect);
// XXX what should the max-element-size of an iframe be? Shouldn't
// iframe's normally shrink wrap around their content when they
diff --git a/mozilla/layout/html/document/src/nsFrameSetFrame.cpp b/mozilla/layout/html/document/src/nsFrameSetFrame.cpp
index 85e022b83e6..0a00b7ccf34 100644
--- a/mozilla/layout/html/document/src/nsFrameSetFrame.cpp
+++ b/mozilla/layout/html/document/src/nsFrameSetFrame.cpp
@@ -771,22 +771,19 @@ nsHTMLFramesetFrame::ReflowPlaceChild(nsIFrame* aChild,
}
// reflow and place the child
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == aChild->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- nsHTMLReflowState reflowState(aPresContext, aReflowState, aChild, aSize);
- nsHTMLReflowMetrics metrics(nsnull);
- metrics.width = aSize.width;
- metrics.height= aSize.height;
- nsReflowStatus status;
+ nsHTMLReflowState reflowState(aPresContext, aReflowState, aChild, aSize);
+ nsHTMLReflowMetrics metrics(nsnull);
+ metrics.width = aSize.width;
+ metrics.height= aSize.height;
+ nsReflowStatus status;
- ReflowChild(aChild, aPresContext, metrics, reflowState, status);
- NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "bad status");
+ ReflowChild(aChild, aPresContext, metrics, reflowState, status);
+ NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "bad status");
- // Place and size the child
- nsRect rect(aOffset.x, aOffset.y, aSize.width, aSize.height);
- aChild->SetRect(&aPresContext, rect);
- htmlReflow->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED); // this call is needed
- }
+ // Place and size the child
+ nsRect rect(aOffset.x, aOffset.y, aSize.width, aSize.height);
+ aChild->SetRect(&aPresContext, rect);
+ aChild->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED); // this call is needed
}
static
diff --git a/mozilla/layout/html/table/src/nsTableFrame.cpp b/mozilla/layout/html/table/src/nsTableFrame.cpp
index 86318ba75c1..8a2da03bdb8 100644
--- a/mozilla/layout/html/table/src/nsTableFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableFrame.cpp
@@ -3805,7 +3805,7 @@ PRBool nsTableFrame::IsNested(const nsHTMLReflowState& aReflowState, const nsSty
{
PRBool result = PR_FALSE;
// Walk up the reflow state chain until we find a cell or the root
- const nsReflowState* rs = aReflowState.parentReflowState; // this is for the outer frame
+ const nsHTMLReflowState* rs = aReflowState.parentReflowState; // this is for the outer frame
if (rs)
rs = rs->parentReflowState; // and this is the parent of the outer frame
while (nsnull != rs)
@@ -3923,7 +3923,7 @@ nsTableFrame::GetRowGroupFrameFor(nsIFrame* aFrame, const nsStyleDisplay* aDispl
}
PRBool
-nsTableFrame::IsFinalPass(const nsReflowState& aState)
+nsTableFrame::IsFinalPass(const nsHTMLReflowState& aState)
{
return (NS_UNCONSTRAINEDSIZE != aState.availableWidth) ||
(NS_UNCONSTRAINEDSIZE != aState.availableHeight);
diff --git a/mozilla/layout/html/table/src/nsTableFrame.h b/mozilla/layout/html/table/src/nsTableFrame.h
index 4a0c433a97b..04ee030f2ab 100644
--- a/mozilla/layout/html/table/src/nsTableFrame.h
+++ b/mozilla/layout/html/table/src/nsTableFrame.h
@@ -24,7 +24,6 @@
#include "nsStyleCoord.h"
#include "nsStyleConsts.h"
#include "nsIStyleContext.h"
-#include "nsIFrameReflow.h" // for nsReflowReason enum
#include "nsITableLayout.h"
class nsCellMap;
@@ -315,7 +314,7 @@ public:
virtual void AddColumnFrame (nsTableColFrame *aColFrame);
- static PRBool IsFinalPass(const nsReflowState& aReflowState);
+ static PRBool IsFinalPass(const nsHTMLReflowState& aReflowState);
nsTableCellFrame* GetCellInfoAt(PRInt32 aRowX,
PRInt32 aColX,
diff --git a/mozilla/layout/html/table/src/nsTableOuterFrame.cpp b/mozilla/layout/html/table/src/nsTableOuterFrame.cpp
index 47340a5e953..8dd21caff34 100644
--- a/mozilla/layout/html/table/src/nsTableOuterFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableOuterFrame.cpp
@@ -588,16 +588,13 @@ nsresult nsTableOuterFrame::IR_InnerTableReflow(nsIPresContext& aPresCont
nsHTMLReflowState captionReflowState(aPresContext, aReflowState.reflowState, mCaptionFrame,
nsSize(innerSize.width, aReflowState.reflowState.availableHeight),
eReflowReason_Resize);
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- // reflow the caption
- htmlReflow->WillReflow(aPresContext);
- rv = htmlReflow->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
- captionWasReflowed = PR_TRUE;
- if ((oldCaptionRect.height!=captionSize.height) ||
- (oldCaptionRect.width!=captionSize.width)) {
- captionDimChanged=PR_TRUE;
- }
+ // reflow the caption
+ mCaptionFrame->WillReflow(aPresContext);
+ rv = mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
+ captionWasReflowed = PR_TRUE;
+ if ((oldCaptionRect.height!=captionSize.height) ||
+ (oldCaptionRect.width!=captionSize.width)) {
+ captionDimChanged=PR_TRUE;
}
}
// XXX: should just call SizeAndPlaceChildren regardless
@@ -680,42 +677,35 @@ nsresult nsTableOuterFrame::IR_CaptionInserted(nsIPresContext& aPresConte
nsHTMLReflowState captionReflowState(aPresContext, aReflowState.reflowState, mCaptionFrame,
nsSize(mRect.width, aReflowState.reflowState.availableHeight),
eReflowReason_Initial);
- nsIHTMLReflow* htmlReflow;
-
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- // initial reflow of the caption
- htmlReflow->WillReflow(aPresContext);
- rv = htmlReflow->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
- if (NS_FAILED(rv)) {
- return rv;
- }
- mMinCaptionWidth = maxElementSize.width;
- // XXX: caption align = left|right ignored here!
- // if the caption's MES > table width, reflow the inner table
- nsHTMLReflowMetrics innerSize(aDesiredSize.maxElementSize);
- if (mMinCaptionWidth > mRect.width) {
- nsHTMLReflowState innerReflowState(aPresContext, aReflowState.reflowState, mInnerTableFrame,
- nsSize(mMinCaptionWidth, aReflowState.reflowState.availableHeight),
- eReflowReason_Resize);
- rv = ReflowChild(mInnerTableFrame, aPresContext, innerSize, innerReflowState, aStatus);
- }
- else { // set innerSize as if the inner table were reflowed
- innerSize.height = mRect.height;
- innerSize.width = mRect.width;
- }
- // set maxElementSize width if requested
- if (nsnull != aDesiredSize.maxElementSize) {
- ((nsTableFrame *)mInnerTableFrame)->SetMaxElementSize(aDesiredSize.maxElementSize);
- if (mMinCaptionWidth > aDesiredSize.maxElementSize->width) {
- aDesiredSize.maxElementSize->width = mMinCaptionWidth;
- }
- }
-
- rv = SizeAndPlaceChildren(&aPresContext,
- nsSize (innerSize.width, innerSize.height),
- nsSize (captionSize.width, captionSize.height),
- aReflowState);
+ // initial reflow of the caption
+ mCaptionFrame->WillReflow(aPresContext);
+ rv = mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
+ mMinCaptionWidth = maxElementSize.width;
+ // XXX: caption align = left|right ignored here!
+ // if the caption's MES > table width, reflow the inner table
+ nsHTMLReflowMetrics innerSize(aDesiredSize.maxElementSize);
+ if (mMinCaptionWidth > mRect.width) {
+ nsHTMLReflowState innerReflowState(aPresContext, aReflowState.reflowState, mInnerTableFrame,
+ nsSize(mMinCaptionWidth, aReflowState.reflowState.availableHeight),
+ eReflowReason_Resize);
+ rv = ReflowChild(mInnerTableFrame, aPresContext, innerSize, innerReflowState, aStatus);
}
+ else { // set innerSize as if the inner table were reflowed
+ innerSize.height = mRect.height;
+ innerSize.width = mRect.width;
+ }
+ // set maxElementSize width if requested
+ if (nsnull != aDesiredSize.maxElementSize) {
+ ((nsTableFrame *)mInnerTableFrame)->SetMaxElementSize(aDesiredSize.maxElementSize);
+ if (mMinCaptionWidth > aDesiredSize.maxElementSize->width) {
+ aDesiredSize.maxElementSize->width = mMinCaptionWidth;
+ }
+ }
+
+ rv = SizeAndPlaceChildren(&aPresContext,
+ nsSize (innerSize.width, innerSize.height),
+ nsSize (captionSize.width, captionSize.height),
+ aReflowState);
return rv;
}
@@ -869,13 +859,10 @@ NS_METHOD nsTableOuterFrame::Reflow(nsIPresContext& aPresContext,
nsHTMLReflowState captionReflowState(aPresContext, aReflowState, mCaptionFrame,
nsSize(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE),
eReflowReason_Initial);
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->WillReflow(aPresContext);
- rv = htmlReflow->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
- mMinCaptionWidth = maxElementSize.width;
- }
+ mCaptionFrame->WillReflow(aPresContext);
+ rv = mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
+ mMinCaptionWidth = maxElementSize.width;
}
}
@@ -938,23 +925,20 @@ NS_METHOD nsTableOuterFrame::Reflow(nsIPresContext& aPresContext,
nsSize(innerSize.width, NS_UNCONSTRAINEDSIZE),
eReflowReason_Resize);
nsHTMLReflowMetrics captionSize(nsnull);
- nsIHTMLReflow* htmlReflow;
nsRect captionRect(captionMargin.left, captionY, 0, 0);
+ nsReflowStatus captionStatus;
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- nsReflowStatus captionStatus;
- htmlReflow->WillReflow(aPresContext);
- htmlReflow->Reflow(aPresContext, captionSize, captionReflowState,
- captionStatus);
- NS_ASSERTION(NS_FRAME_IS_COMPLETE(captionStatus), "unexpected reflow status");
+ mCaptionFrame->WillReflow(aPresContext);
+ mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState,
+ captionStatus);
+ NS_ASSERTION(NS_FRAME_IS_COMPLETE(captionStatus), "unexpected reflow status");
- // XXX If the height is constrained then we need to check whether the inner
- // table still fits...
+ // XXX If the height is constrained then we need to check whether the inner
+ // table still fits...
- // Place the caption
- captionRect.SizeTo(captionSize.width, captionSize.height);
- mCaptionFrame->SetRect(&aPresContext, captionRect);
- }
+ // Place the caption
+ captionRect.SizeTo(captionSize.width, captionSize.height);
+ mCaptionFrame->SetRect(&aPresContext, captionRect);
// Place the inner table
nscoord innerY;
diff --git a/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp b/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp
index bd56cc788c2..c5767805498 100644
--- a/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp
@@ -826,11 +826,7 @@ nsTableRowGroupFrame::AdjustSiblingsAfterReflow(nsIPresContext& aPresContex
kidFrame->GetOrigin(origin);
origin.y += aDeltaY;
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->WillReflow(aPresContext);
- }
-
+ kidFrame->WillReflow(aPresContext);
kidFrame->MoveTo(&aPresContext, origin.x, origin.y);
}
diff --git a/mozilla/layout/tables/nsTableFrame.cpp b/mozilla/layout/tables/nsTableFrame.cpp
index 86318ba75c1..8a2da03bdb8 100644
--- a/mozilla/layout/tables/nsTableFrame.cpp
+++ b/mozilla/layout/tables/nsTableFrame.cpp
@@ -3805,7 +3805,7 @@ PRBool nsTableFrame::IsNested(const nsHTMLReflowState& aReflowState, const nsSty
{
PRBool result = PR_FALSE;
// Walk up the reflow state chain until we find a cell or the root
- const nsReflowState* rs = aReflowState.parentReflowState; // this is for the outer frame
+ const nsHTMLReflowState* rs = aReflowState.parentReflowState; // this is for the outer frame
if (rs)
rs = rs->parentReflowState; // and this is the parent of the outer frame
while (nsnull != rs)
@@ -3923,7 +3923,7 @@ nsTableFrame::GetRowGroupFrameFor(nsIFrame* aFrame, const nsStyleDisplay* aDispl
}
PRBool
-nsTableFrame::IsFinalPass(const nsReflowState& aState)
+nsTableFrame::IsFinalPass(const nsHTMLReflowState& aState)
{
return (NS_UNCONSTRAINEDSIZE != aState.availableWidth) ||
(NS_UNCONSTRAINEDSIZE != aState.availableHeight);
diff --git a/mozilla/layout/tables/nsTableFrame.h b/mozilla/layout/tables/nsTableFrame.h
index 4a0c433a97b..04ee030f2ab 100644
--- a/mozilla/layout/tables/nsTableFrame.h
+++ b/mozilla/layout/tables/nsTableFrame.h
@@ -24,7 +24,6 @@
#include "nsStyleCoord.h"
#include "nsStyleConsts.h"
#include "nsIStyleContext.h"
-#include "nsIFrameReflow.h" // for nsReflowReason enum
#include "nsITableLayout.h"
class nsCellMap;
@@ -315,7 +314,7 @@ public:
virtual void AddColumnFrame (nsTableColFrame *aColFrame);
- static PRBool IsFinalPass(const nsReflowState& aReflowState);
+ static PRBool IsFinalPass(const nsHTMLReflowState& aReflowState);
nsTableCellFrame* GetCellInfoAt(PRInt32 aRowX,
PRInt32 aColX,
diff --git a/mozilla/layout/tables/nsTableOuterFrame.cpp b/mozilla/layout/tables/nsTableOuterFrame.cpp
index 47340a5e953..8dd21caff34 100644
--- a/mozilla/layout/tables/nsTableOuterFrame.cpp
+++ b/mozilla/layout/tables/nsTableOuterFrame.cpp
@@ -588,16 +588,13 @@ nsresult nsTableOuterFrame::IR_InnerTableReflow(nsIPresContext& aPresCont
nsHTMLReflowState captionReflowState(aPresContext, aReflowState.reflowState, mCaptionFrame,
nsSize(innerSize.width, aReflowState.reflowState.availableHeight),
eReflowReason_Resize);
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- // reflow the caption
- htmlReflow->WillReflow(aPresContext);
- rv = htmlReflow->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
- captionWasReflowed = PR_TRUE;
- if ((oldCaptionRect.height!=captionSize.height) ||
- (oldCaptionRect.width!=captionSize.width)) {
- captionDimChanged=PR_TRUE;
- }
+ // reflow the caption
+ mCaptionFrame->WillReflow(aPresContext);
+ rv = mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
+ captionWasReflowed = PR_TRUE;
+ if ((oldCaptionRect.height!=captionSize.height) ||
+ (oldCaptionRect.width!=captionSize.width)) {
+ captionDimChanged=PR_TRUE;
}
}
// XXX: should just call SizeAndPlaceChildren regardless
@@ -680,42 +677,35 @@ nsresult nsTableOuterFrame::IR_CaptionInserted(nsIPresContext& aPresConte
nsHTMLReflowState captionReflowState(aPresContext, aReflowState.reflowState, mCaptionFrame,
nsSize(mRect.width, aReflowState.reflowState.availableHeight),
eReflowReason_Initial);
- nsIHTMLReflow* htmlReflow;
-
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- // initial reflow of the caption
- htmlReflow->WillReflow(aPresContext);
- rv = htmlReflow->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
- if (NS_FAILED(rv)) {
- return rv;
- }
- mMinCaptionWidth = maxElementSize.width;
- // XXX: caption align = left|right ignored here!
- // if the caption's MES > table width, reflow the inner table
- nsHTMLReflowMetrics innerSize(aDesiredSize.maxElementSize);
- if (mMinCaptionWidth > mRect.width) {
- nsHTMLReflowState innerReflowState(aPresContext, aReflowState.reflowState, mInnerTableFrame,
- nsSize(mMinCaptionWidth, aReflowState.reflowState.availableHeight),
- eReflowReason_Resize);
- rv = ReflowChild(mInnerTableFrame, aPresContext, innerSize, innerReflowState, aStatus);
- }
- else { // set innerSize as if the inner table were reflowed
- innerSize.height = mRect.height;
- innerSize.width = mRect.width;
- }
- // set maxElementSize width if requested
- if (nsnull != aDesiredSize.maxElementSize) {
- ((nsTableFrame *)mInnerTableFrame)->SetMaxElementSize(aDesiredSize.maxElementSize);
- if (mMinCaptionWidth > aDesiredSize.maxElementSize->width) {
- aDesiredSize.maxElementSize->width = mMinCaptionWidth;
- }
- }
-
- rv = SizeAndPlaceChildren(&aPresContext,
- nsSize (innerSize.width, innerSize.height),
- nsSize (captionSize.width, captionSize.height),
- aReflowState);
+ // initial reflow of the caption
+ mCaptionFrame->WillReflow(aPresContext);
+ rv = mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
+ mMinCaptionWidth = maxElementSize.width;
+ // XXX: caption align = left|right ignored here!
+ // if the caption's MES > table width, reflow the inner table
+ nsHTMLReflowMetrics innerSize(aDesiredSize.maxElementSize);
+ if (mMinCaptionWidth > mRect.width) {
+ nsHTMLReflowState innerReflowState(aPresContext, aReflowState.reflowState, mInnerTableFrame,
+ nsSize(mMinCaptionWidth, aReflowState.reflowState.availableHeight),
+ eReflowReason_Resize);
+ rv = ReflowChild(mInnerTableFrame, aPresContext, innerSize, innerReflowState, aStatus);
}
+ else { // set innerSize as if the inner table were reflowed
+ innerSize.height = mRect.height;
+ innerSize.width = mRect.width;
+ }
+ // set maxElementSize width if requested
+ if (nsnull != aDesiredSize.maxElementSize) {
+ ((nsTableFrame *)mInnerTableFrame)->SetMaxElementSize(aDesiredSize.maxElementSize);
+ if (mMinCaptionWidth > aDesiredSize.maxElementSize->width) {
+ aDesiredSize.maxElementSize->width = mMinCaptionWidth;
+ }
+ }
+
+ rv = SizeAndPlaceChildren(&aPresContext,
+ nsSize (innerSize.width, innerSize.height),
+ nsSize (captionSize.width, captionSize.height),
+ aReflowState);
return rv;
}
@@ -869,13 +859,10 @@ NS_METHOD nsTableOuterFrame::Reflow(nsIPresContext& aPresContext,
nsHTMLReflowState captionReflowState(aPresContext, aReflowState, mCaptionFrame,
nsSize(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE),
eReflowReason_Initial);
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->WillReflow(aPresContext);
- rv = htmlReflow->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
- mMinCaptionWidth = maxElementSize.width;
- }
+ mCaptionFrame->WillReflow(aPresContext);
+ rv = mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState, aStatus);
+ mMinCaptionWidth = maxElementSize.width;
}
}
@@ -938,23 +925,20 @@ NS_METHOD nsTableOuterFrame::Reflow(nsIPresContext& aPresContext,
nsSize(innerSize.width, NS_UNCONSTRAINEDSIZE),
eReflowReason_Resize);
nsHTMLReflowMetrics captionSize(nsnull);
- nsIHTMLReflow* htmlReflow;
nsRect captionRect(captionMargin.left, captionY, 0, 0);
+ nsReflowStatus captionStatus;
- if (NS_OK == mCaptionFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- nsReflowStatus captionStatus;
- htmlReflow->WillReflow(aPresContext);
- htmlReflow->Reflow(aPresContext, captionSize, captionReflowState,
- captionStatus);
- NS_ASSERTION(NS_FRAME_IS_COMPLETE(captionStatus), "unexpected reflow status");
+ mCaptionFrame->WillReflow(aPresContext);
+ mCaptionFrame->Reflow(aPresContext, captionSize, captionReflowState,
+ captionStatus);
+ NS_ASSERTION(NS_FRAME_IS_COMPLETE(captionStatus), "unexpected reflow status");
- // XXX If the height is constrained then we need to check whether the inner
- // table still fits...
+ // XXX If the height is constrained then we need to check whether the inner
+ // table still fits...
- // Place the caption
- captionRect.SizeTo(captionSize.width, captionSize.height);
- mCaptionFrame->SetRect(&aPresContext, captionRect);
- }
+ // Place the caption
+ captionRect.SizeTo(captionSize.width, captionSize.height);
+ mCaptionFrame->SetRect(&aPresContext, captionRect);
// Place the inner table
nscoord innerY;
diff --git a/mozilla/layout/tables/nsTableRowGroupFrame.cpp b/mozilla/layout/tables/nsTableRowGroupFrame.cpp
index bd56cc788c2..c5767805498 100644
--- a/mozilla/layout/tables/nsTableRowGroupFrame.cpp
+++ b/mozilla/layout/tables/nsTableRowGroupFrame.cpp
@@ -826,11 +826,7 @@ nsTableRowGroupFrame::AdjustSiblingsAfterReflow(nsIPresContext& aPresContex
kidFrame->GetOrigin(origin);
origin.y += aDeltaY;
- nsIHTMLReflow* htmlReflow;
- if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {
- htmlReflow->WillReflow(aPresContext);
- }
-
+ kidFrame->WillReflow(aPresContext);
kidFrame->MoveTo(&aPresContext, origin.x, origin.y);
}
diff --git a/mozilla/layout/xul/base/src/nsBoxFrame.cpp b/mozilla/layout/xul/base/src/nsBoxFrame.cpp
index 37d506060ab..d7b85642c1a 100644
--- a/mozilla/layout/xul/base/src/nsBoxFrame.cpp
+++ b/mozilla/layout/xul/base/src/nsBoxFrame.cpp
@@ -1119,13 +1119,8 @@ nsBoxFrame::FlowChildAt(nsIFrame* childFrame,
printf("because (%s)\n", ch);
#endif
// do the flow
- nsIHTMLReflow* htmlReflow;
-
- rv = childFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- NS_ASSERTION(rv == NS_OK,"failed to get htmlReflow interface.");
-
- htmlReflow->WillReflow(aPresContext);
- htmlReflow->Reflow(aPresContext, desiredSize, reflowState, aStatus);
+ childFrame->WillReflow(aPresContext);
+ childFrame->Reflow(aPresContext, desiredSize, reflowState, aStatus);
NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status");
diff --git a/mozilla/layout/xul/base/src/nsMenuPopupFrame.cpp b/mozilla/layout/xul/base/src/nsMenuPopupFrame.cpp
index 156a95f6fe3..2c53b45b73a 100644
--- a/mozilla/layout/xul/base/src/nsMenuPopupFrame.cpp
+++ b/mozilla/layout/xul/base/src/nsMenuPopupFrame.cpp
@@ -271,13 +271,7 @@ nsMenuPopupFrame::DidReflow(nsIPresContext& aPresContext,
nsIFrame* kid;
FirstChild(listName, &kid);
while (nsnull != kid) {
- static NS_DEFINE_IID(kIHTMLReflowIID, NS_IHTMLREFLOW_IID);
- nsIHTMLReflow* htmlReflow;
- nsresult rv;
- rv = kid->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
- if (NS_SUCCEEDED(rv)) {
- htmlReflow->DidReflow(aPresContext, aStatus);
- }
+ kid->DidReflow(aPresContext, aStatus);
kid->GetNextSibling(&kid);
}
NS_IF_RELEASE(listName);
diff --git a/mozilla/layout/xul/base/src/nsToolboxFrame.cpp b/mozilla/layout/xul/base/src/nsToolboxFrame.cpp
index ea30207e056..6925a625539 100644
--- a/mozilla/layout/xul/base/src/nsToolboxFrame.cpp
+++ b/mozilla/layout/xul/base/src/nsToolboxFrame.cpp
@@ -32,7 +32,6 @@
#include "nsIStyleContext.h"
#include "nsCSSRendering.h"
-#include "nsIHTMLReflow.h"
#include "nsIReflowCommand.h"
#include "nsHTMLIIDs.h"
#include "nsIPresContext.h"
diff --git a/mozilla/layout/xul/base/src/nsTreeRowGroupFrame.cpp b/mozilla/layout/xul/base/src/nsTreeRowGroupFrame.cpp
index 2d2511d2773..8167446b4f9 100644
--- a/mozilla/layout/xul/base/src/nsTreeRowGroupFrame.cpp
+++ b/mozilla/layout/xul/base/src/nsTreeRowGroupFrame.cpp
@@ -21,7 +21,6 @@
#include "nsXULAtoms.h"
#include "nsHTMLAtoms.h"
#include "nsINameSpaceManager.h"
-#include "nsIFrameReflow.h"
#include "nsTreeFrame.h"
#include "nsIPresContext.h"
#include "nsIPresShell.h"
diff --git a/mozilla/rdf/content/src/nsXULDocument.cpp b/mozilla/rdf/content/src/nsXULDocument.cpp
index e906ac39b1a..436f913dd0d 100644
--- a/mozilla/rdf/content/src/nsXULDocument.cpp
+++ b/mozilla/rdf/content/src/nsXULDocument.cpp
@@ -63,7 +63,6 @@
#include "nsIDTD.h"
#include "nsIDocumentObserver.h"
#include "nsIFormControl.h"
-#include "nsIFrameReflow.h"
#include "nsIHTMLContent.h"
#include "nsIHTMLElementFactory.h"
#include "nsIInputStream.h"
@@ -112,6 +111,7 @@
#include "prlog.h"
#include "rdf.h"
#include "rdfutil.h"
+#include "nsIFrame.h"
//----------------------------------------------------------------------
//
diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp
index 49dd114d2e7..ef37fe8a2a7 100644
--- a/mozilla/webshell/src/nsWebShell.cpp
+++ b/mozilla/webshell/src/nsWebShell.cpp
@@ -47,6 +47,7 @@
#include "prprf.h"
#include "nsIPluginHost.h"
#include "nsplugin.h"
+#include "nsIFrame.h"
//#include "nsPluginsCID.h"
#include "nsIPluginManager.h"
#include "nsIPref.h"
@@ -65,7 +66,6 @@
#include "nsIDOMHTMLDocument.h"
#include "nsLayoutCID.h"
#include "nsIDOMRange.h"
-#include "nsIFrameReflow.h"
#include "stopwatch.h"
#include "nsILocaleService.h"