зеркало из https://github.com/mozilla/pjs.git
Changed area frame code over to new reflow command handling
This commit is contained in:
Родитель
7478781693
Коммит
35e404886c
|
@ -23,18 +23,16 @@
|
|||
#include "nsIStyleContext.h"
|
||||
#include "nsIViewManager.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsIReflowCommand.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsHTMLParts.h"
|
||||
|
||||
static NS_DEFINE_IID(kAreaFrameIID, NS_IAREAFRAME_IID);
|
||||
|
||||
void
|
||||
nsAbsoluteContainingBlock::DestroyFrames(nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteFrames.DestroyFrames(aPresContext);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::FirstChild(nsIAtom* aListName,
|
||||
nsIFrame** aFirstChild) const
|
||||
nsAbsoluteContainingBlock::FirstChild(const nsIFrame* aDelegatingFrame,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame** aFirstChild) const
|
||||
{
|
||||
NS_PRECONDITION(nsLayoutAtoms::absoluteList == aListName, "unexpected child list name");
|
||||
*aFirstChild = mAbsoluteFrames.FirstChild();
|
||||
|
@ -42,17 +40,92 @@ nsAbsoluteContainingBlock::FirstChild(nsIAtom* aListName,
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::SetInitialChildList(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList)
|
||||
{
|
||||
NS_PRECONDITION(nsLayoutAtoms::absoluteList == aListName, "unexpected child list name");
|
||||
#ifdef NS_DEBUG
|
||||
nsFrame::VerifyDirtyBitSet(aChildList);
|
||||
#endif
|
||||
mAbsoluteFrames.SetFrames(aChildList);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::Reflow(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::AppendFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// Append the frames to our list of absolutely positioned frames
|
||||
#ifdef NS_DEBUG
|
||||
nsFrame::VerifyDirtyBitSet(aFrameList);
|
||||
#endif
|
||||
mAbsoluteFrames.AppendFrames(nsnull, aFrameList);
|
||||
|
||||
// Generate a reflow command to reflow the dirty frames
|
||||
nsIReflowCommand* reflowCmd;
|
||||
rv = NS_NewHTMLReflowCommand(&reflowCmd, aDelegatingFrame, nsIReflowCommand::ReflowDirty);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
reflowCmd->SetChildListName(nsLayoutAtoms::absoluteList);
|
||||
aPresShell.AppendReflowCommand(reflowCmd);
|
||||
NS_RELEASE(reflowCmd);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::InsertFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// Insert the new frames
|
||||
#ifdef NS_DEBUG
|
||||
nsFrame::VerifyDirtyBitSet(aFrameList);
|
||||
#endif
|
||||
mAbsoluteFrames.InsertFrames(nsnull, aPrevFrame, aFrameList);
|
||||
|
||||
// Generate a reflow command to reflow the dirty frames
|
||||
nsIReflowCommand* reflowCmd;
|
||||
rv = NS_NewHTMLReflowCommand(&reflowCmd, aDelegatingFrame, nsIReflowCommand::ReflowDirty);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
reflowCmd->SetChildListName(nsLayoutAtoms::absoluteList);
|
||||
aPresShell.AppendReflowCommand(reflowCmd);
|
||||
NS_RELEASE(reflowCmd);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::RemoveFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame)
|
||||
{
|
||||
PRBool result = mAbsoluteFrames.DestroyFrame(aPresContext, aOldFrame);
|
||||
NS_ASSERTION(result, "didn't find frame to delete");
|
||||
// Because positioned frames aren't part of a flow, there's no additional
|
||||
// work to do, e.g. reflowing sibling frames. And because positioned frames
|
||||
// have a view, we don't need to repaint
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::Reflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState)
|
||||
{
|
||||
// Make a copy of the reflow state. If the reason is eReflowReason_Incremental,
|
||||
|
@ -66,14 +139,15 @@ nsAbsoluteContainingBlock::Reflow(nsIPresContext& aPresContext,
|
|||
for (kidFrame = mAbsoluteFrames.FirstChild(); nsnull != kidFrame; kidFrame->GetNextSibling(&kidFrame)) {
|
||||
// Reflow the frame
|
||||
nsReflowStatus kidStatus;
|
||||
ReflowAbsoluteFrame(aPresContext, reflowState, kidFrame, PR_FALSE,
|
||||
kidStatus);
|
||||
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, reflowState, kidFrame,
|
||||
PR_FALSE, kidStatus);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::IncrementalReflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
PRBool& aWasHandled)
|
||||
{
|
||||
|
@ -88,7 +162,7 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
nsIAtom* listName;
|
||||
PRBool isAbsoluteChild;
|
||||
|
||||
// It's targeted at us. See if the child frame is absolutely positioned
|
||||
// It's targeted at us. See if it's for the positioned child frames
|
||||
aReflowState.reflowCommand->GetChildListName(listName);
|
||||
isAbsoluteChild = nsLayoutAtoms::absoluteList == listName;
|
||||
NS_IF_RELEASE(listName);
|
||||
|
@ -101,47 +175,19 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
// Get the type of reflow command
|
||||
aReflowState.reflowCommand->GetType(type);
|
||||
|
||||
// Handle each specific type
|
||||
if (nsIReflowCommand::FrameAppended == type) {
|
||||
// Add the frames to our list of absolutely position frames
|
||||
aReflowState.reflowCommand->GetChildFrame(newFrames);
|
||||
NS_ASSERTION(nsnull != newFrames, "null child list");
|
||||
numFrames = nsContainerFrame::LengthOf(newFrames);
|
||||
mAbsoluteFrames.AppendFrames(nsnull, newFrames);
|
||||
// The only type of reflow command we expect is that we have dirty
|
||||
// child frames to reflow
|
||||
NS_ASSERTION(nsIReflowCommand::ReflowDirty, "unexpected reflow type");
|
||||
|
||||
} else if (nsIReflowCommand::FrameRemoved == type) {
|
||||
// Get the new frame
|
||||
nsIFrame* childFrame;
|
||||
aReflowState.reflowCommand->GetChildFrame(childFrame);
|
||||
// Walk the positioned frames and reflow the dirty frames
|
||||
for (nsIFrame* f = mAbsoluteFrames.FirstChild(); f; f->GetNextSibling(&f)) {
|
||||
nsFrameState frameState;
|
||||
|
||||
PRBool result = mAbsoluteFrames.DestroyFrame(aPresContext, childFrame);
|
||||
NS_ASSERTION(result, "didn't find frame to delete");
|
||||
|
||||
} else if (nsIReflowCommand::FrameInserted == type) {
|
||||
// Get the previous sibling
|
||||
nsIFrame* prevSibling;
|
||||
aReflowState.reflowCommand->GetPrevSiblingFrame(prevSibling);
|
||||
|
||||
// Insert the new frames
|
||||
aReflowState.reflowCommand->GetChildFrame(newFrames);
|
||||
NS_ASSERTION(nsnull != newFrames, "null child list");
|
||||
numFrames = nsContainerFrame::LengthOf(newFrames);
|
||||
mAbsoluteFrames.InsertFrames(nsnull, prevSibling, newFrames);
|
||||
|
||||
} else {
|
||||
NS_ASSERTION(PR_FALSE, "unexpected reflow type");
|
||||
}
|
||||
|
||||
// For inserted and appended reflow commands we need to reflow the
|
||||
// newly added frames
|
||||
if ((nsIReflowCommand::FrameAppended == type) ||
|
||||
(nsIReflowCommand::FrameInserted == type)) {
|
||||
|
||||
while (numFrames-- > 0) {
|
||||
f->GetFrameState(&frameState);
|
||||
if (frameState & NS_FRAME_IS_DIRTY) {
|
||||
nsReflowStatus status;
|
||||
|
||||
ReflowAbsoluteFrame(aPresContext, aReflowState, newFrames, PR_TRUE, status);
|
||||
newFrames->GetNextSibling(&newFrames);
|
||||
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowState,
|
||||
newFrames, PR_TRUE, status);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -161,19 +207,12 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
aReflowState.reflowCommand->GetNext(nextFrame, PR_TRUE);
|
||||
|
||||
nsReflowStatus kidStatus;
|
||||
ReflowAbsoluteFrame(aPresContext, aReflowState, nextFrame, PR_FALSE, kidStatus);
|
||||
// XXX Make sure the frame is repainted. For the time being, since we
|
||||
// have no idea what actually changed repaint it all...
|
||||
nsIView* view;
|
||||
nextFrame->GetView(&view);
|
||||
if (nsnull != view) {
|
||||
nsIViewManager* viewMgr;
|
||||
view->GetViewManager(viewMgr);
|
||||
if (nsnull != viewMgr) {
|
||||
viewMgr->UpdateView(view, (nsIRegion*)nsnull, NS_VMREFRESH_NO_SYNC);
|
||||
NS_RELEASE(viewMgr);
|
||||
}
|
||||
}
|
||||
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowState,
|
||||
nextFrame, PR_FALSE, kidStatus);
|
||||
// We don't need to invalidate anything because the frame should
|
||||
// invalidate any area within its frame that needs repainting, and
|
||||
// because it has a view if it changes size the view manager will
|
||||
// damage the dirty area
|
||||
aWasHandled = PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -181,11 +220,19 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsAbsoluteContainingBlock::DestroyFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteFrames.DestroyFrames(aPresContext);
|
||||
}
|
||||
|
||||
// XXX Optimize the case where it's a resize reflow and the absolutely
|
||||
// positioned child has the exact same size and position and skip the
|
||||
// reflow...
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsIFrame* aKidFrame,
|
||||
PRBool aInitialReflow,
|
||||
|
@ -299,7 +346,9 @@ nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIPresContext& aPresCon
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::GetPositionedInfo(nscoord& aXMost, nscoord& aYMost) const
|
||||
nsAbsoluteContainingBlock::GetPositionedInfo(const nsIFrame* aDelegatingFrame,
|
||||
nscoord& aXMost,
|
||||
nscoord& aYMost) const
|
||||
{
|
||||
aXMost = aYMost = 0;
|
||||
for (nsIFrame* f = mAbsoluteFrames.FirstChild(); nsnull != f; f->GetNextSibling(&f)) {
|
||||
|
|
|
@ -27,43 +27,71 @@ class nsIFrame;
|
|||
class nsIPresContext;
|
||||
|
||||
/**
|
||||
* This class contains the logic for being an absolutely containing block.
|
||||
* This class contains the logic for being an absolute containing block.
|
||||
*
|
||||
* There is no principal child list, just a named child list which contains
|
||||
* the absolutely positioned frames
|
||||
*
|
||||
* All functions include as the first argument the frame that is delegating
|
||||
* the request
|
||||
*
|
||||
* @see nsLayoutAtoms::absoluteList
|
||||
*/
|
||||
class nsAbsoluteContainingBlock
|
||||
{
|
||||
public:
|
||||
nsresult FirstChild(nsIAtom* aListName, nsIFrame** aFirstChild) const;
|
||||
nsresult FirstChild(const nsIFrame* aDelegatingFrame,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame** aFirstChild) const;
|
||||
|
||||
nsresult SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsresult SetInitialChildList(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
nsresult AppendFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList);
|
||||
nsresult InsertFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList);
|
||||
nsresult RemoveFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
// Called by the delegating frame after it has done its reflow first. This
|
||||
// function will reflow any absolutely positioned child frames that need to
|
||||
// be reflowed, e.g., because the absolutely positioned child frame has
|
||||
// 'auto' for an offset, or a percentage based width or height
|
||||
nsresult Reflow(nsIPresContext& aPresContext,
|
||||
nsresult Reflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState);
|
||||
|
||||
// Called only for a reflow reason of eReflowReason_Incremental. The
|
||||
// aWasHandled return value indicates whether the reflow command was
|
||||
// handled (i.e., the reflow command involved an absolutely positioned
|
||||
// child element), or whether the caller should handle it
|
||||
nsresult IncrementalReflow(nsIPresContext& aPresContext,
|
||||
nsresult IncrementalReflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
PRBool& aWasHandled);
|
||||
|
||||
void DestroyFrames(nsIPresContext& aPresContext);
|
||||
void DestroyFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext);
|
||||
|
||||
nsresult GetPositionedInfo(nscoord& aXMost, nscoord& aYMost) const;
|
||||
nsresult GetPositionedInfo(const nsIFrame* aDelegatingFrame,
|
||||
nscoord& aXMost,
|
||||
nscoord& aYMost) const;
|
||||
|
||||
protected:
|
||||
nsresult ReflowAbsoluteFrame(nsIPresContext& aPresContext,
|
||||
nsresult ReflowAbsoluteFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsIFrame* aKidFrame,
|
||||
PRBool aInitialReflow,
|
||||
|
|
|
@ -106,7 +106,7 @@ nsAreaFrame::Init(nsIPresContext& aPresContext,
|
|||
NS_IMETHODIMP
|
||||
nsAreaFrame::Destroy(nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteContainer.DestroyFrames(aPresContext);
|
||||
mAbsoluteContainer.DestroyFrames(this, aPresContext);
|
||||
return nsBlockFrame::Destroy(aPresContext);
|
||||
}
|
||||
|
||||
|
@ -118,7 +118,7 @@ nsAreaFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
|||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
rv = mAbsoluteContainer.SetInitialChildList(this, aPresContext, aListName, aChildList);
|
||||
} else {
|
||||
rv = nsBlockFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
}
|
||||
|
@ -126,6 +126,62 @@ nsAreaFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
|||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::AppendFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.AppendFrames(this, aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
} else {
|
||||
rv = nsBlockFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::InsertFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.InsertFrames(this, aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
} else {
|
||||
rv = nsBlockFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::RemoveFrame(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.RemoveFrame(this, aPresContext, aPresShell, aListName, aOldFrame);
|
||||
} else {
|
||||
rv = nsBlockFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::GetAdditionalChildListName(PRInt32 aIndex,
|
||||
nsIAtom** aListName) const
|
||||
|
@ -148,7 +204,7 @@ nsAreaFrame::FirstChild(nsIAtom* aListName, nsIFrame** aFirstChild) const
|
|||
{
|
||||
NS_PRECONDITION(nsnull != aFirstChild, "null OUT parameter pointer");
|
||||
if (aListName == nsLayoutAtoms::absoluteList) {
|
||||
return mAbsoluteContainer.FirstChild(aListName, aFirstChild);
|
||||
return mAbsoluteContainer.FirstChild(this, aListName, aFirstChild);
|
||||
}
|
||||
|
||||
return nsBlockFrame::FirstChild(aListName, aFirstChild);
|
||||
|
@ -217,7 +273,7 @@ nsAreaFrame::Paint(nsIPresContext& aPresContext,
|
|||
NS_IMETHODIMP
|
||||
nsAreaFrame::GetPositionedInfo(nscoord& aXMost, nscoord& aYMost) const
|
||||
{
|
||||
nsresult rv = mAbsoluteContainer.GetPositionedInfo(aXMost, aYMost);
|
||||
nsresult rv = mAbsoluteContainer.GetPositionedInfo(this, aXMost, aYMost);
|
||||
|
||||
// If we have child frames that stick outside of our box, and they should
|
||||
// be visible, then include them too so the total size is correct
|
||||
|
@ -257,7 +313,7 @@ nsAreaFrame::Reflow(nsIPresContext& aPresContext,
|
|||
// Give the absolute positioning code a chance to handle it
|
||||
PRBool handled;
|
||||
|
||||
mAbsoluteContainer.IncrementalReflow(aPresContext, aReflowState, handled);
|
||||
mAbsoluteContainer.IncrementalReflow(this, aPresContext, aReflowState, handled);
|
||||
|
||||
// If the incremental reflow command was handled by the absolute positioning
|
||||
// code, then we're all done
|
||||
|
@ -276,7 +332,7 @@ nsAreaFrame::Reflow(nsIPresContext& aPresContext,
|
|||
|
||||
// If we have a space manager, then set it in the reflow state
|
||||
if (nsnull != mSpaceManager) {
|
||||
// Modify the reflow state and set the space manager
|
||||
// Modify the existing reflow state
|
||||
nsHTMLReflowState& reflowState = (nsHTMLReflowState&)aReflowState;
|
||||
reflowState.mSpaceManager = mSpaceManager;
|
||||
|
||||
|
@ -288,9 +344,10 @@ nsAreaFrame::Reflow(nsIPresContext& aPresContext,
|
|||
rv = nsBlockFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
// Let the absolutely positioned container reflow any absolutely positioned
|
||||
// child frames that need to be reflowed
|
||||
// child frames that need to be reflowed, e.g., elements with a percentage
|
||||
// based width/height
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = mAbsoluteContainer.Reflow(aPresContext, aReflowState);
|
||||
rv = mAbsoluteContainer.Reflow(this, aPresContext, aReflowState);
|
||||
}
|
||||
|
||||
if (mFlags & NS_AREA_WRAP_SIZE) {
|
||||
|
|
|
@ -61,6 +61,19 @@ public:
|
|||
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
NS_IMETHOD AppendFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList);
|
||||
NS_IMETHOD InsertFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList);
|
||||
NS_IMETHOD RemoveFrame(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
NS_IMETHOD GetAdditionalChildListName(PRInt32 aIndex,
|
||||
nsIAtom** aListName) const;
|
||||
|
|
|
@ -3843,11 +3843,6 @@ nsBlockFrame::AppendFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame is updated
|
||||
return nsFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -3907,11 +3902,6 @@ nsBlockFrame::InsertFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame and floater code is updated
|
||||
return nsFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -4270,11 +4260,6 @@ nsBlockFrame::RemoveFrame(nsIPresContext& aPresContext,
|
|||
// We will reflow *after* removing the placeholder (which is done 2nd)
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame code is updated
|
||||
return nsFrame::RemoveFrame(aPresContext, aPresShell, aListName,
|
||||
aOldFrame);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
|
|
@ -3843,11 +3843,6 @@ nsBlockFrame::AppendFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame is updated
|
||||
return nsFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -3907,11 +3902,6 @@ nsBlockFrame::InsertFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame and floater code is updated
|
||||
return nsFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -4270,11 +4260,6 @@ nsBlockFrame::RemoveFrame(nsIPresContext& aPresContext,
|
|||
// We will reflow *after* removing the placeholder (which is done 2nd)
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame code is updated
|
||||
return nsFrame::RemoveFrame(aPresContext, aPresShell, aListName,
|
||||
aOldFrame);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
|
|
@ -3843,11 +3843,6 @@ nsBlockFrame::AppendFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame is updated
|
||||
return nsFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -3907,11 +3902,6 @@ nsBlockFrame::InsertFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame and floater code is updated
|
||||
return nsFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -4270,11 +4260,6 @@ nsBlockFrame::RemoveFrame(nsIPresContext& aPresContext,
|
|||
// We will reflow *after* removing the placeholder (which is done 2nd)
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame code is updated
|
||||
return nsFrame::RemoveFrame(aPresContext, aPresShell, aListName,
|
||||
aOldFrame);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ NS_NewPositionedInlineFrame(nsIFrame** aNewFrame)
|
|||
NS_IMETHODIMP
|
||||
nsPositionedInlineFrame::Destroy(nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteContainer.DestroyFrames(aPresContext);
|
||||
mAbsoluteContainer.DestroyFrames(this, aPresContext);
|
||||
return nsInlineFrame::Destroy(aPresContext);
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ nsPositionedInlineFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
|||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
rv = mAbsoluteContainer.SetInitialChildList(this, aPresContext, aListName, aChildList);
|
||||
} else {
|
||||
rv = nsInlineFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ nsPositionedInlineFrame::FirstChild(nsIAtom* aListName, nsIFrame** aFirstChild)
|
|||
{
|
||||
NS_PRECONDITION(nsnull != aFirstChild, "null OUT parameter pointer");
|
||||
if (aListName == nsLayoutAtoms::absoluteList) {
|
||||
return mAbsoluteContainer.FirstChild(aListName, aFirstChild);
|
||||
return mAbsoluteContainer.FirstChild(this, aListName, aFirstChild);
|
||||
}
|
||||
|
||||
return nsInlineFrame::FirstChild(aListName, aFirstChild);
|
||||
|
@ -179,7 +179,7 @@ nsPositionedInlineFrame::Reflow(nsIPresContext& aPresContext,
|
|||
// Give the absolute positioning code a chance to handle it
|
||||
PRBool handled;
|
||||
|
||||
mAbsoluteContainer.IncrementalReflow(aPresContext, aReflowState, handled);
|
||||
mAbsoluteContainer.IncrementalReflow(this, aPresContext, aReflowState, handled);
|
||||
|
||||
// If the incremental reflow command was handled by the absolute positioning
|
||||
// code, then we're all done
|
||||
|
@ -200,7 +200,7 @@ nsPositionedInlineFrame::Reflow(nsIPresContext& aPresContext,
|
|||
// Let the absolutely positioned container reflow any absolutely positioned
|
||||
// child frames that need to be reflowed
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = mAbsoluteContainer.Reflow(aPresContext, aReflowState);
|
||||
rv = mAbsoluteContainer.Reflow(this, aPresContext, aReflowState);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
|
|
@ -23,18 +23,16 @@
|
|||
#include "nsIStyleContext.h"
|
||||
#include "nsIViewManager.h"
|
||||
#include "nsLayoutAtoms.h"
|
||||
#include "nsIReflowCommand.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsHTMLParts.h"
|
||||
|
||||
static NS_DEFINE_IID(kAreaFrameIID, NS_IAREAFRAME_IID);
|
||||
|
||||
void
|
||||
nsAbsoluteContainingBlock::DestroyFrames(nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteFrames.DestroyFrames(aPresContext);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::FirstChild(nsIAtom* aListName,
|
||||
nsIFrame** aFirstChild) const
|
||||
nsAbsoluteContainingBlock::FirstChild(const nsIFrame* aDelegatingFrame,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame** aFirstChild) const
|
||||
{
|
||||
NS_PRECONDITION(nsLayoutAtoms::absoluteList == aListName, "unexpected child list name");
|
||||
*aFirstChild = mAbsoluteFrames.FirstChild();
|
||||
|
@ -42,17 +40,92 @@ nsAbsoluteContainingBlock::FirstChild(nsIAtom* aListName,
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::SetInitialChildList(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList)
|
||||
{
|
||||
NS_PRECONDITION(nsLayoutAtoms::absoluteList == aListName, "unexpected child list name");
|
||||
#ifdef NS_DEBUG
|
||||
nsFrame::VerifyDirtyBitSet(aChildList);
|
||||
#endif
|
||||
mAbsoluteFrames.SetFrames(aChildList);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::Reflow(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::AppendFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// Append the frames to our list of absolutely positioned frames
|
||||
#ifdef NS_DEBUG
|
||||
nsFrame::VerifyDirtyBitSet(aFrameList);
|
||||
#endif
|
||||
mAbsoluteFrames.AppendFrames(nsnull, aFrameList);
|
||||
|
||||
// Generate a reflow command to reflow the dirty frames
|
||||
nsIReflowCommand* reflowCmd;
|
||||
rv = NS_NewHTMLReflowCommand(&reflowCmd, aDelegatingFrame, nsIReflowCommand::ReflowDirty);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
reflowCmd->SetChildListName(nsLayoutAtoms::absoluteList);
|
||||
aPresShell.AppendReflowCommand(reflowCmd);
|
||||
NS_RELEASE(reflowCmd);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::InsertFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
// Insert the new frames
|
||||
#ifdef NS_DEBUG
|
||||
nsFrame::VerifyDirtyBitSet(aFrameList);
|
||||
#endif
|
||||
mAbsoluteFrames.InsertFrames(nsnull, aPrevFrame, aFrameList);
|
||||
|
||||
// Generate a reflow command to reflow the dirty frames
|
||||
nsIReflowCommand* reflowCmd;
|
||||
rv = NS_NewHTMLReflowCommand(&reflowCmd, aDelegatingFrame, nsIReflowCommand::ReflowDirty);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
reflowCmd->SetChildListName(nsLayoutAtoms::absoluteList);
|
||||
aPresShell.AppendReflowCommand(reflowCmd);
|
||||
NS_RELEASE(reflowCmd);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::RemoveFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame)
|
||||
{
|
||||
PRBool result = mAbsoluteFrames.DestroyFrame(aPresContext, aOldFrame);
|
||||
NS_ASSERTION(result, "didn't find frame to delete");
|
||||
// Because positioned frames aren't part of a flow, there's no additional
|
||||
// work to do, e.g. reflowing sibling frames. And because positioned frames
|
||||
// have a view, we don't need to repaint
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::Reflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState)
|
||||
{
|
||||
// Make a copy of the reflow state. If the reason is eReflowReason_Incremental,
|
||||
|
@ -66,14 +139,15 @@ nsAbsoluteContainingBlock::Reflow(nsIPresContext& aPresContext,
|
|||
for (kidFrame = mAbsoluteFrames.FirstChild(); nsnull != kidFrame; kidFrame->GetNextSibling(&kidFrame)) {
|
||||
// Reflow the frame
|
||||
nsReflowStatus kidStatus;
|
||||
ReflowAbsoluteFrame(aPresContext, reflowState, kidFrame, PR_FALSE,
|
||||
kidStatus);
|
||||
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, reflowState, kidFrame,
|
||||
PR_FALSE, kidStatus);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::IncrementalReflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
PRBool& aWasHandled)
|
||||
{
|
||||
|
@ -88,7 +162,7 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
nsIAtom* listName;
|
||||
PRBool isAbsoluteChild;
|
||||
|
||||
// It's targeted at us. See if the child frame is absolutely positioned
|
||||
// It's targeted at us. See if it's for the positioned child frames
|
||||
aReflowState.reflowCommand->GetChildListName(listName);
|
||||
isAbsoluteChild = nsLayoutAtoms::absoluteList == listName;
|
||||
NS_IF_RELEASE(listName);
|
||||
|
@ -101,47 +175,19 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
// Get the type of reflow command
|
||||
aReflowState.reflowCommand->GetType(type);
|
||||
|
||||
// Handle each specific type
|
||||
if (nsIReflowCommand::FrameAppended == type) {
|
||||
// Add the frames to our list of absolutely position frames
|
||||
aReflowState.reflowCommand->GetChildFrame(newFrames);
|
||||
NS_ASSERTION(nsnull != newFrames, "null child list");
|
||||
numFrames = nsContainerFrame::LengthOf(newFrames);
|
||||
mAbsoluteFrames.AppendFrames(nsnull, newFrames);
|
||||
// The only type of reflow command we expect is that we have dirty
|
||||
// child frames to reflow
|
||||
NS_ASSERTION(nsIReflowCommand::ReflowDirty, "unexpected reflow type");
|
||||
|
||||
} else if (nsIReflowCommand::FrameRemoved == type) {
|
||||
// Get the new frame
|
||||
nsIFrame* childFrame;
|
||||
aReflowState.reflowCommand->GetChildFrame(childFrame);
|
||||
// Walk the positioned frames and reflow the dirty frames
|
||||
for (nsIFrame* f = mAbsoluteFrames.FirstChild(); f; f->GetNextSibling(&f)) {
|
||||
nsFrameState frameState;
|
||||
|
||||
PRBool result = mAbsoluteFrames.DestroyFrame(aPresContext, childFrame);
|
||||
NS_ASSERTION(result, "didn't find frame to delete");
|
||||
|
||||
} else if (nsIReflowCommand::FrameInserted == type) {
|
||||
// Get the previous sibling
|
||||
nsIFrame* prevSibling;
|
||||
aReflowState.reflowCommand->GetPrevSiblingFrame(prevSibling);
|
||||
|
||||
// Insert the new frames
|
||||
aReflowState.reflowCommand->GetChildFrame(newFrames);
|
||||
NS_ASSERTION(nsnull != newFrames, "null child list");
|
||||
numFrames = nsContainerFrame::LengthOf(newFrames);
|
||||
mAbsoluteFrames.InsertFrames(nsnull, prevSibling, newFrames);
|
||||
|
||||
} else {
|
||||
NS_ASSERTION(PR_FALSE, "unexpected reflow type");
|
||||
}
|
||||
|
||||
// For inserted and appended reflow commands we need to reflow the
|
||||
// newly added frames
|
||||
if ((nsIReflowCommand::FrameAppended == type) ||
|
||||
(nsIReflowCommand::FrameInserted == type)) {
|
||||
|
||||
while (numFrames-- > 0) {
|
||||
f->GetFrameState(&frameState);
|
||||
if (frameState & NS_FRAME_IS_DIRTY) {
|
||||
nsReflowStatus status;
|
||||
|
||||
ReflowAbsoluteFrame(aPresContext, aReflowState, newFrames, PR_TRUE, status);
|
||||
newFrames->GetNextSibling(&newFrames);
|
||||
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowState,
|
||||
newFrames, PR_TRUE, status);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -161,19 +207,12 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
aReflowState.reflowCommand->GetNext(nextFrame, PR_TRUE);
|
||||
|
||||
nsReflowStatus kidStatus;
|
||||
ReflowAbsoluteFrame(aPresContext, aReflowState, nextFrame, PR_FALSE, kidStatus);
|
||||
// XXX Make sure the frame is repainted. For the time being, since we
|
||||
// have no idea what actually changed repaint it all...
|
||||
nsIView* view;
|
||||
nextFrame->GetView(&view);
|
||||
if (nsnull != view) {
|
||||
nsIViewManager* viewMgr;
|
||||
view->GetViewManager(viewMgr);
|
||||
if (nsnull != viewMgr) {
|
||||
viewMgr->UpdateView(view, (nsIRegion*)nsnull, NS_VMREFRESH_NO_SYNC);
|
||||
NS_RELEASE(viewMgr);
|
||||
}
|
||||
}
|
||||
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowState,
|
||||
nextFrame, PR_FALSE, kidStatus);
|
||||
// We don't need to invalidate anything because the frame should
|
||||
// invalidate any area within its frame that needs repainting, and
|
||||
// because it has a view if it changes size the view manager will
|
||||
// damage the dirty area
|
||||
aWasHandled = PR_TRUE;
|
||||
}
|
||||
}
|
||||
|
@ -181,11 +220,19 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIPresContext& aPresConte
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
nsAbsoluteContainingBlock::DestroyFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteFrames.DestroyFrames(aPresContext);
|
||||
}
|
||||
|
||||
// XXX Optimize the case where it's a resize reflow and the absolutely
|
||||
// positioned child has the exact same size and position and skip the
|
||||
// reflow...
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIPresContext& aPresContext,
|
||||
nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsIFrame* aKidFrame,
|
||||
PRBool aInitialReflow,
|
||||
|
@ -299,7 +346,9 @@ nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIPresContext& aPresCon
|
|||
}
|
||||
|
||||
nsresult
|
||||
nsAbsoluteContainingBlock::GetPositionedInfo(nscoord& aXMost, nscoord& aYMost) const
|
||||
nsAbsoluteContainingBlock::GetPositionedInfo(const nsIFrame* aDelegatingFrame,
|
||||
nscoord& aXMost,
|
||||
nscoord& aYMost) const
|
||||
{
|
||||
aXMost = aYMost = 0;
|
||||
for (nsIFrame* f = mAbsoluteFrames.FirstChild(); nsnull != f; f->GetNextSibling(&f)) {
|
||||
|
|
|
@ -27,43 +27,71 @@ class nsIFrame;
|
|||
class nsIPresContext;
|
||||
|
||||
/**
|
||||
* This class contains the logic for being an absolutely containing block.
|
||||
* This class contains the logic for being an absolute containing block.
|
||||
*
|
||||
* There is no principal child list, just a named child list which contains
|
||||
* the absolutely positioned frames
|
||||
*
|
||||
* All functions include as the first argument the frame that is delegating
|
||||
* the request
|
||||
*
|
||||
* @see nsLayoutAtoms::absoluteList
|
||||
*/
|
||||
class nsAbsoluteContainingBlock
|
||||
{
|
||||
public:
|
||||
nsresult FirstChild(nsIAtom* aListName, nsIFrame** aFirstChild) const;
|
||||
nsresult FirstChild(const nsIFrame* aDelegatingFrame,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame** aFirstChild) const;
|
||||
|
||||
nsresult SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsresult SetInitialChildList(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
nsresult AppendFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList);
|
||||
nsresult InsertFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList);
|
||||
nsresult RemoveFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
// Called by the delegating frame after it has done its reflow first. This
|
||||
// function will reflow any absolutely positioned child frames that need to
|
||||
// be reflowed, e.g., because the absolutely positioned child frame has
|
||||
// 'auto' for an offset, or a percentage based width or height
|
||||
nsresult Reflow(nsIPresContext& aPresContext,
|
||||
nsresult Reflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState);
|
||||
|
||||
// Called only for a reflow reason of eReflowReason_Incremental. The
|
||||
// aWasHandled return value indicates whether the reflow command was
|
||||
// handled (i.e., the reflow command involved an absolutely positioned
|
||||
// child element), or whether the caller should handle it
|
||||
nsresult IncrementalReflow(nsIPresContext& aPresContext,
|
||||
nsresult IncrementalReflow(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
PRBool& aWasHandled);
|
||||
|
||||
void DestroyFrames(nsIPresContext& aPresContext);
|
||||
void DestroyFrames(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext);
|
||||
|
||||
nsresult GetPositionedInfo(nscoord& aXMost, nscoord& aYMost) const;
|
||||
nsresult GetPositionedInfo(const nsIFrame* aDelegatingFrame,
|
||||
nscoord& aXMost,
|
||||
nscoord& aYMost) const;
|
||||
|
||||
protected:
|
||||
nsresult ReflowAbsoluteFrame(nsIPresContext& aPresContext,
|
||||
nsresult ReflowAbsoluteFrame(nsIFrame* aDelegatingFrame,
|
||||
nsIPresContext& aPresContext,
|
||||
const nsHTMLReflowState& aReflowState,
|
||||
nsIFrame* aKidFrame,
|
||||
PRBool aInitialReflow,
|
||||
|
|
|
@ -106,7 +106,7 @@ nsAreaFrame::Init(nsIPresContext& aPresContext,
|
|||
NS_IMETHODIMP
|
||||
nsAreaFrame::Destroy(nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteContainer.DestroyFrames(aPresContext);
|
||||
mAbsoluteContainer.DestroyFrames(this, aPresContext);
|
||||
return nsBlockFrame::Destroy(aPresContext);
|
||||
}
|
||||
|
||||
|
@ -118,7 +118,7 @@ nsAreaFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
|||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
rv = mAbsoluteContainer.SetInitialChildList(this, aPresContext, aListName, aChildList);
|
||||
} else {
|
||||
rv = nsBlockFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
}
|
||||
|
@ -126,6 +126,62 @@ nsAreaFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
|||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::AppendFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.AppendFrames(this, aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
} else {
|
||||
rv = nsBlockFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::InsertFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.InsertFrames(this, aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
} else {
|
||||
rv = nsBlockFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::RemoveFrame(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.RemoveFrame(this, aPresContext, aPresShell, aListName, aOldFrame);
|
||||
} else {
|
||||
rv = nsBlockFrame::RemoveFrame(aPresContext, aPresShell, aListName, aOldFrame);
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsAreaFrame::GetAdditionalChildListName(PRInt32 aIndex,
|
||||
nsIAtom** aListName) const
|
||||
|
@ -148,7 +204,7 @@ nsAreaFrame::FirstChild(nsIAtom* aListName, nsIFrame** aFirstChild) const
|
|||
{
|
||||
NS_PRECONDITION(nsnull != aFirstChild, "null OUT parameter pointer");
|
||||
if (aListName == nsLayoutAtoms::absoluteList) {
|
||||
return mAbsoluteContainer.FirstChild(aListName, aFirstChild);
|
||||
return mAbsoluteContainer.FirstChild(this, aListName, aFirstChild);
|
||||
}
|
||||
|
||||
return nsBlockFrame::FirstChild(aListName, aFirstChild);
|
||||
|
@ -217,7 +273,7 @@ nsAreaFrame::Paint(nsIPresContext& aPresContext,
|
|||
NS_IMETHODIMP
|
||||
nsAreaFrame::GetPositionedInfo(nscoord& aXMost, nscoord& aYMost) const
|
||||
{
|
||||
nsresult rv = mAbsoluteContainer.GetPositionedInfo(aXMost, aYMost);
|
||||
nsresult rv = mAbsoluteContainer.GetPositionedInfo(this, aXMost, aYMost);
|
||||
|
||||
// If we have child frames that stick outside of our box, and they should
|
||||
// be visible, then include them too so the total size is correct
|
||||
|
@ -257,7 +313,7 @@ nsAreaFrame::Reflow(nsIPresContext& aPresContext,
|
|||
// Give the absolute positioning code a chance to handle it
|
||||
PRBool handled;
|
||||
|
||||
mAbsoluteContainer.IncrementalReflow(aPresContext, aReflowState, handled);
|
||||
mAbsoluteContainer.IncrementalReflow(this, aPresContext, aReflowState, handled);
|
||||
|
||||
// If the incremental reflow command was handled by the absolute positioning
|
||||
// code, then we're all done
|
||||
|
@ -276,7 +332,7 @@ nsAreaFrame::Reflow(nsIPresContext& aPresContext,
|
|||
|
||||
// If we have a space manager, then set it in the reflow state
|
||||
if (nsnull != mSpaceManager) {
|
||||
// Modify the reflow state and set the space manager
|
||||
// Modify the existing reflow state
|
||||
nsHTMLReflowState& reflowState = (nsHTMLReflowState&)aReflowState;
|
||||
reflowState.mSpaceManager = mSpaceManager;
|
||||
|
||||
|
@ -288,9 +344,10 @@ nsAreaFrame::Reflow(nsIPresContext& aPresContext,
|
|||
rv = nsBlockFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
|
||||
// Let the absolutely positioned container reflow any absolutely positioned
|
||||
// child frames that need to be reflowed
|
||||
// child frames that need to be reflowed, e.g., elements with a percentage
|
||||
// based width/height
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = mAbsoluteContainer.Reflow(aPresContext, aReflowState);
|
||||
rv = mAbsoluteContainer.Reflow(this, aPresContext, aReflowState);
|
||||
}
|
||||
|
||||
if (mFlags & NS_AREA_WRAP_SIZE) {
|
||||
|
|
|
@ -61,6 +61,19 @@ public:
|
|||
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aChildList);
|
||||
NS_IMETHOD AppendFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aFrameList);
|
||||
NS_IMETHOD InsertFrames(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aPrevFrame,
|
||||
nsIFrame* aFrameList);
|
||||
NS_IMETHOD RemoveFrame(nsIPresContext& aPresContext,
|
||||
nsIPresShell& aPresShell,
|
||||
nsIAtom* aListName,
|
||||
nsIFrame* aOldFrame);
|
||||
|
||||
NS_IMETHOD GetAdditionalChildListName(PRInt32 aIndex,
|
||||
nsIAtom** aListName) const;
|
||||
|
|
|
@ -3843,11 +3843,6 @@ nsBlockFrame::AppendFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame is updated
|
||||
return nsFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -3907,11 +3902,6 @@ nsBlockFrame::InsertFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame and floater code is updated
|
||||
return nsFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -4270,11 +4260,6 @@ nsBlockFrame::RemoveFrame(nsIPresContext& aPresContext,
|
|||
// We will reflow *after* removing the placeholder (which is done 2nd)
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame code is updated
|
||||
return nsFrame::RemoveFrame(aPresContext, aPresShell, aListName,
|
||||
aOldFrame);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
|
|
@ -3843,11 +3843,6 @@ nsBlockFrame::AppendFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame is updated
|
||||
return nsFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -3907,11 +3902,6 @@ nsBlockFrame::InsertFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame and floater code is updated
|
||||
return nsFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -4270,11 +4260,6 @@ nsBlockFrame::RemoveFrame(nsIPresContext& aPresContext,
|
|||
// We will reflow *after* removing the placeholder (which is done 2nd)
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame code is updated
|
||||
return nsFrame::RemoveFrame(aPresContext, aPresShell, aListName,
|
||||
aOldFrame);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
|
|
@ -3843,11 +3843,6 @@ nsBlockFrame::AppendFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame is updated
|
||||
return nsFrame::AppendFrames(aPresContext, aPresShell, aListName,
|
||||
aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -3907,11 +3902,6 @@ nsBlockFrame::InsertFrames(nsIPresContext& aPresContext,
|
|||
mFloaters.AppendFrames(nsnull, aFrameList);
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame and floater code is updated
|
||||
return nsFrame::InsertFrames(aPresContext, aPresShell, aListName,
|
||||
aPrevFrame, aFrameList);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
@ -4270,11 +4260,6 @@ nsBlockFrame::RemoveFrame(nsIPresContext& aPresContext,
|
|||
// We will reflow *after* removing the placeholder (which is done 2nd)
|
||||
return NS_OK;
|
||||
}
|
||||
else if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
// XXX temporary until area frame code is updated
|
||||
return nsFrame::RemoveFrame(aPresContext, aPresShell, aListName,
|
||||
aOldFrame);
|
||||
}
|
||||
else if (nsnull != aListName) {
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ NS_NewPositionedInlineFrame(nsIFrame** aNewFrame)
|
|||
NS_IMETHODIMP
|
||||
nsPositionedInlineFrame::Destroy(nsIPresContext& aPresContext)
|
||||
{
|
||||
mAbsoluteContainer.DestroyFrames(aPresContext);
|
||||
mAbsoluteContainer.DestroyFrames(this, aPresContext);
|
||||
return nsInlineFrame::Destroy(aPresContext);
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ nsPositionedInlineFrame::SetInitialChildList(nsIPresContext& aPresContext,
|
|||
nsresult rv;
|
||||
|
||||
if (nsLayoutAtoms::absoluteList == aListName) {
|
||||
rv = mAbsoluteContainer.SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
rv = mAbsoluteContainer.SetInitialChildList(this, aPresContext, aListName, aChildList);
|
||||
} else {
|
||||
rv = nsInlineFrame::SetInitialChildList(aPresContext, aListName, aChildList);
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ nsPositionedInlineFrame::FirstChild(nsIAtom* aListName, nsIFrame** aFirstChild)
|
|||
{
|
||||
NS_PRECONDITION(nsnull != aFirstChild, "null OUT parameter pointer");
|
||||
if (aListName == nsLayoutAtoms::absoluteList) {
|
||||
return mAbsoluteContainer.FirstChild(aListName, aFirstChild);
|
||||
return mAbsoluteContainer.FirstChild(this, aListName, aFirstChild);
|
||||
}
|
||||
|
||||
return nsInlineFrame::FirstChild(aListName, aFirstChild);
|
||||
|
@ -179,7 +179,7 @@ nsPositionedInlineFrame::Reflow(nsIPresContext& aPresContext,
|
|||
// Give the absolute positioning code a chance to handle it
|
||||
PRBool handled;
|
||||
|
||||
mAbsoluteContainer.IncrementalReflow(aPresContext, aReflowState, handled);
|
||||
mAbsoluteContainer.IncrementalReflow(this, aPresContext, aReflowState, handled);
|
||||
|
||||
// If the incremental reflow command was handled by the absolute positioning
|
||||
// code, then we're all done
|
||||
|
@ -200,7 +200,7 @@ nsPositionedInlineFrame::Reflow(nsIPresContext& aPresContext,
|
|||
// Let the absolutely positioned container reflow any absolutely positioned
|
||||
// child frames that need to be reflowed
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
rv = mAbsoluteContainer.Reflow(aPresContext, aReflowState);
|
||||
rv = mAbsoluteContainer.Reflow(this, aPresContext, aReflowState);
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
|
Загрузка…
Ссылка в новой задаче