diff --git a/mozilla/content/html/style/src/nsCSSLayout.cpp b/mozilla/content/html/style/src/nsCSSLayout.cpp index d5e6e5bbb40..851cb7aa850 100644 --- a/mozilla/content/html/style/src/nsCSSLayout.cpp +++ b/mozilla/content/html/style/src/nsCSSLayout.cpp @@ -26,6 +26,7 @@ #include "nsIPtr.h" static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID); +static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID); NS_DEF_PTR(nsIStyleContext); NS_DEF_PTR(nsIContent); @@ -224,11 +225,12 @@ void nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX, kid->GetContent(kidContent.AssignRef()); kid->GetStyleContext(aCX, kidSC.AssignRef()); - nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID); - if (NS_STYLE_POSITION_RELATIVE == kidMol->positionFlags) { + nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { kid->GetOrigin(origin); - nscoord dx = kidMol->left; - nscoord dy = kidMol->top; + // XXX Check the flags: could be auto or percent (not just length) + nscoord dx = kidPosition->mLeftOffset; + nscoord dy = kidPosition->mTopOffset; kid->MoveTo(origin.x + dx, origin.y + dy); } kid->GetNextSibling(kid); diff --git a/mozilla/content/html/style/src/nsCSSStyleRule.cpp b/mozilla/content/html/style/src/nsCSSStyleRule.cpp index fbb30a71c3e..47b43ba421d 100644 --- a/mozilla/content/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleRule.cpp @@ -668,22 +668,34 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a position->mPosition = ourPosition->mPosition.GetIntValue(); } - // box offsets + // box offsets. note: default value is auto so we don't check for it here if (ourPosition->mLeft.IsLengthUnit()) { position->mLeftOffset = CalcLength(ourPosition->mLeft, font, aPresContext); position->mLeftOffsetFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mLeftOffset = (nscoord)(100 * ourPosition->mLeft.GetFloatValue()); + position->mLeftOffsetFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mTop.IsLengthUnit()) { position->mTopOffset = CalcLength(ourPosition->mTop, font, aPresContext); position->mTopOffsetFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mTopOffset = (nscoord)(100 * ourPosition->mTop.GetFloatValue()); + position->mTopOffsetFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mWidth.IsLengthUnit()) { position->mWidth = CalcLength(ourPosition->mWidth, font, aPresContext); position->mWidthFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mWidth.GetUnit() == eCSSUnit_Percent) { + position->mWidth = (nscoord)(100 * ourPosition->mWidth.GetFloatValue()); + position->mWidthFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mHeight.IsLengthUnit()) { position->mHeight = CalcLength(ourPosition->mHeight, font, aPresContext); position->mHeightFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mHeight = (nscoord)(100 * ourPosition->mHeight.GetFloatValue()); + position->mHeightFlags = NS_STYLE_POSITION_VALUE_PCT; } } } diff --git a/mozilla/layout/base/public/nsIStyleContext.h b/mozilla/layout/base/public/nsIStyleContext.h index 2645017fc5d..b934758541b 100644 --- a/mozilla/layout/base/public/nsIStyleContext.h +++ b/mozilla/layout/base/public/nsIStyleContext.h @@ -159,8 +159,6 @@ struct nsStyleMolecule : public nsStyleStruct { PRInt32 proportionalWidth; PRInt32 fixedHeight; PRInt32 proportionalHeight; - PRUint8 positionFlags; - nscoord top, left; protected: // The constructor is protected because you may not make these diff --git a/mozilla/layout/generic/nsBlockFrame.cpp b/mozilla/layout/generic/nsBlockFrame.cpp index f8a9f42e1d5..8697f2d49a7 100644 --- a/mozilla/layout/generic/nsBlockFrame.cpp +++ b/mozilla/layout/generic/nsBlockFrame.cpp @@ -503,8 +503,13 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + PRIntn direction = aState.mol->direction; - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } @@ -592,7 +597,11 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } diff --git a/mozilla/layout/generic/nsBlockReflowState.cpp b/mozilla/layout/generic/nsBlockReflowState.cpp index f8a9f42e1d5..8697f2d49a7 100644 --- a/mozilla/layout/generic/nsBlockReflowState.cpp +++ b/mozilla/layout/generic/nsBlockReflowState.cpp @@ -503,8 +503,13 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + PRIntn direction = aState.mol->direction; - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } @@ -592,7 +597,11 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } diff --git a/mozilla/layout/generic/nsBlockReflowState.h b/mozilla/layout/generic/nsBlockReflowState.h index f8a9f42e1d5..8697f2d49a7 100644 --- a/mozilla/layout/generic/nsBlockReflowState.h +++ b/mozilla/layout/generic/nsBlockReflowState.h @@ -503,8 +503,13 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + PRIntn direction = aState.mol->direction; - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } @@ -592,7 +597,11 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } diff --git a/mozilla/layout/html/base/src/nsBlockFrame.cpp b/mozilla/layout/html/base/src/nsBlockFrame.cpp index f8a9f42e1d5..8697f2d49a7 100644 --- a/mozilla/layout/html/base/src/nsBlockFrame.cpp +++ b/mozilla/layout/html/base/src/nsBlockFrame.cpp @@ -503,8 +503,13 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + PRIntn direction = aState.mol->direction; - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } @@ -592,7 +597,11 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } diff --git a/mozilla/layout/html/base/src/nsBlockReflowState.cpp b/mozilla/layout/html/base/src/nsBlockReflowState.cpp index f8a9f42e1d5..8697f2d49a7 100644 --- a/mozilla/layout/html/base/src/nsBlockReflowState.cpp +++ b/mozilla/layout/html/base/src/nsBlockReflowState.cpp @@ -503,8 +503,13 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + PRIntn direction = aState.mol->direction; - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } @@ -592,7 +597,11 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } diff --git a/mozilla/layout/html/base/src/nsBlockReflowState.h b/mozilla/layout/html/base/src/nsBlockReflowState.h index f8a9f42e1d5..8697f2d49a7 100644 --- a/mozilla/layout/html/base/src/nsBlockReflowState.h +++ b/mozilla/layout/html/base/src/nsBlockReflowState.h @@ -503,8 +503,13 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + PRIntn direction = aState.mol->direction; - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } @@ -592,7 +597,11 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX, { NS_PRECONDITION(nsnull != aState.lineStart, "bad line"); - if (NS_STYLE_POSITION_RELATIVE == aKidMol->positionFlags) { + nsStylePosition* kidPosition; + + // Get the position style data + aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { aState.needRelativePos = PR_TRUE; } diff --git a/mozilla/layout/html/style/src/nsCSSLayout.cpp b/mozilla/layout/html/style/src/nsCSSLayout.cpp index d5e6e5bbb40..851cb7aa850 100644 --- a/mozilla/layout/html/style/src/nsCSSLayout.cpp +++ b/mozilla/layout/html/style/src/nsCSSLayout.cpp @@ -26,6 +26,7 @@ #include "nsIPtr.h" static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID); +static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID); NS_DEF_PTR(nsIStyleContext); NS_DEF_PTR(nsIContent); @@ -224,11 +225,12 @@ void nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX, kid->GetContent(kidContent.AssignRef()); kid->GetStyleContext(aCX, kidSC.AssignRef()); - nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID); - if (NS_STYLE_POSITION_RELATIVE == kidMol->positionFlags) { + nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID); + if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) { kid->GetOrigin(origin); - nscoord dx = kidMol->left; - nscoord dy = kidMol->top; + // XXX Check the flags: could be auto or percent (not just length) + nscoord dx = kidPosition->mLeftOffset; + nscoord dy = kidPosition->mTopOffset; kid->MoveTo(origin.x + dx, origin.y + dy); } kid->GetNextSibling(kid); diff --git a/mozilla/layout/html/style/src/nsCSSStyleRule.cpp b/mozilla/layout/html/style/src/nsCSSStyleRule.cpp index fbb30a71c3e..47b43ba421d 100644 --- a/mozilla/layout/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/layout/html/style/src/nsCSSStyleRule.cpp @@ -668,22 +668,34 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a position->mPosition = ourPosition->mPosition.GetIntValue(); } - // box offsets + // box offsets. note: default value is auto so we don't check for it here if (ourPosition->mLeft.IsLengthUnit()) { position->mLeftOffset = CalcLength(ourPosition->mLeft, font, aPresContext); position->mLeftOffsetFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mLeftOffset = (nscoord)(100 * ourPosition->mLeft.GetFloatValue()); + position->mLeftOffsetFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mTop.IsLengthUnit()) { position->mTopOffset = CalcLength(ourPosition->mTop, font, aPresContext); position->mTopOffsetFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mTopOffset = (nscoord)(100 * ourPosition->mTop.GetFloatValue()); + position->mTopOffsetFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mWidth.IsLengthUnit()) { position->mWidth = CalcLength(ourPosition->mWidth, font, aPresContext); position->mWidthFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mWidth.GetUnit() == eCSSUnit_Percent) { + position->mWidth = (nscoord)(100 * ourPosition->mWidth.GetFloatValue()); + position->mWidthFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mHeight.IsLengthUnit()) { position->mHeight = CalcLength(ourPosition->mHeight, font, aPresContext); position->mHeightFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mHeight = (nscoord)(100 * ourPosition->mHeight.GetFloatValue()); + position->mHeightFlags = NS_STYLE_POSITION_VALUE_PCT; } } } diff --git a/mozilla/layout/style/nsCSSStyleRule.cpp b/mozilla/layout/style/nsCSSStyleRule.cpp index fbb30a71c3e..47b43ba421d 100644 --- a/mozilla/layout/style/nsCSSStyleRule.cpp +++ b/mozilla/layout/style/nsCSSStyleRule.cpp @@ -668,22 +668,34 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a position->mPosition = ourPosition->mPosition.GetIntValue(); } - // box offsets + // box offsets. note: default value is auto so we don't check for it here if (ourPosition->mLeft.IsLengthUnit()) { position->mLeftOffset = CalcLength(ourPosition->mLeft, font, aPresContext); position->mLeftOffsetFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mLeftOffset = (nscoord)(100 * ourPosition->mLeft.GetFloatValue()); + position->mLeftOffsetFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mTop.IsLengthUnit()) { position->mTopOffset = CalcLength(ourPosition->mTop, font, aPresContext); position->mTopOffsetFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mTopOffset = (nscoord)(100 * ourPosition->mTop.GetFloatValue()); + position->mTopOffsetFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mWidth.IsLengthUnit()) { position->mWidth = CalcLength(ourPosition->mWidth, font, aPresContext); position->mWidthFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mWidth.GetUnit() == eCSSUnit_Percent) { + position->mWidth = (nscoord)(100 * ourPosition->mWidth.GetFloatValue()); + position->mWidthFlags = NS_STYLE_POSITION_VALUE_PCT; } if (ourPosition->mHeight.IsLengthUnit()) { position->mHeight = CalcLength(ourPosition->mHeight, font, aPresContext); position->mHeightFlags = NS_STYLE_POSITION_VALUE_LENGTH; + } else if (ourPosition->mHeight.GetUnit() == eCSSUnit_Percent) { + position->mHeight = (nscoord)(100 * ourPosition->mHeight.GetFloatValue()); + position->mHeightFlags = NS_STYLE_POSITION_VALUE_PCT; } } }