diff --git a/mozilla/layout/html/table/src/nsTableRowFrame.cpp b/mozilla/layout/html/table/src/nsTableRowFrame.cpp
index caaa317ead8..256e79ae6ba 100644
--- a/mozilla/layout/html/table/src/nsTableRowFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableRowFrame.cpp
@@ -35,6 +35,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsTableRowFrame.h"
+#include "nsTableRowGroupFrame.h"
#include "nsIRenderingContext.h"
#include "nsIPresShell.h"
#include "nsIPresContext.h"
@@ -114,11 +115,12 @@ nsTableRowFrame::SetFixedHeight(nscoord aValue)
}
void
-nsTableRowFrame::SetPctHeight(float aPctValue)
+nsTableRowFrame::SetPctHeight(float aPctValue,
+ PRBool aForce)
{
nscoord height = PR_MAX(0, NSToCoordRound(aPctValue * 100.0f));
if (HasPctHeight()) {
- if (height > mStyleHeight) {
+ if ((height > mStyleHeight) || aForce) {
mStyleHeight = height;
}
}
@@ -520,6 +522,15 @@ nsTableRowFrame::CalcHeight(const nsHTMLReflowState& aReflowState)
? 0 : aReflowState.mComputedHeight;
ResetHeight(computedHeight);
+ const nsStylePosition* position;
+ GetStyleData(eStyleStruct_Position, (const nsStyleStruct*&)position);
+ if (eStyleUnit_Coord == position->mHeight.GetUnit()) {
+ SetFixedHeight(position->mHeight.GetCoordValue());
+ }
+ else if (eStyleUnit_Percent == position->mHeight.GetUnit()) {
+ SetPctHeight(position->mHeight.GetPercentValue());
+ }
+
for (nsIFrame* kidFrame = mFrames.FirstChild(); kidFrame; kidFrame->GetNextSibling(&kidFrame)) {
nsCOMPtr frameType;
kidFrame->GetFrameType(getter_AddRefs(frameType));
@@ -1336,12 +1347,22 @@ nsTableRowFrame::Reflow(nsIPresContext* aPresContext,
if (!tableFrame) return NS_ERROR_NULL_POINTER;
if ((NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth) && !mPrevInFlow) {
- // see if an extra reflow will be necessary when there is a pct height but no height on the parent
+ // see if an extra reflow will be necessary when there is a pct height but no height basis
if ( ((NS_UNCONSTRAINEDSIZE == aReflowState.mComputedHeight) ||
- (0 == aReflowState.mComputedHeight)) &&
+ (0 == aReflowState.mComputedHeight)) &&
nsTableFrame::IsPctHeight(mStyleContext)) {
- nsTableFrame::NotifyAncestorsOfSpecialReflow(aReflowState);
- SetNeedSpecialReflow(PR_TRUE);
+ const nsHTMLReflowState* parentRS = aReflowState.parentReflowState;
+ if (parentRS && parentRS->frame) {
+ nsCOMPtr fType;
+ parentRS->frame->GetFrameType(getter_AddRefs(fType));
+ if (nsLayoutAtoms::tableRowGroupFrame == fType.get()) {
+ nscoord pctBasis = ((nsTableRowGroupFrame*)parentRS->frame)->GetHeightBasis(*parentRS);
+ if (0 == pctBasis) {
+ nsTableFrame::NotifyAncestorsOfSpecialReflow(aReflowState);
+ SetNeedSpecialReflow(PR_TRUE);
+ }
+ }
+ }
}
}
diff --git a/mozilla/layout/html/table/src/nsTableRowFrame.h b/mozilla/layout/html/table/src/nsTableRowFrame.h
index a697d4e0902..c6121a5375d 100644
--- a/mozilla/layout/html/table/src/nsTableRowFrame.h
+++ b/mozilla/layout/html/table/src/nsTableRowFrame.h
@@ -236,7 +236,8 @@ public:
void SetFixedHeight(nscoord aValue);
float GetPctHeight() const;
- void SetPctHeight(float aPctValue);
+ void SetPctHeight(float aPctValue,
+ PRBool aForce = PR_FALSE);
nscoord GetHeight(nscoord aBasis = 0) const;
diff --git a/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp b/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp
index fca38c08835..01f14810418 100644
--- a/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp
@@ -560,6 +560,20 @@ nsTableRowGroupFrame::CalculateRowHeights(nsIPresContext* aPresContext,
float p2t;
aPresContext->GetPixelsToTwips(&p2t);
+ // make sure that pct height rows do not exceed 100%
+ nscoord pctTotal = 0;
+ nsTableRowFrame* rowFrame;
+ for (rowFrame = GetFirstRow(); rowFrame; rowFrame = rowFrame->GetNextRow()) {
+ if (rowFrame->HasPctHeight()) {
+ nscoord pctHeight = NSToCoordRound(rowFrame->GetPctHeight() * 100.0f);
+ if ((pctHeight + pctTotal) > 100) {
+ pctHeight = PR_MAX(0, NSToCoordRound(100.0f - (float)pctTotal));
+ rowFrame->SetPctHeight((float)pctHeight / 100.0f, PR_TRUE);
+ }
+ pctTotal += pctHeight;
+ }
+ }
+
// find the nearest row at or before aStartRowFrameIn that isn't spanned into.
// If we have a computed height, then we can't compute the heights
// incrementally from aStartRowFrameIn, and we must start at the first row.
@@ -605,7 +619,6 @@ nsTableRowGroupFrame::CalculateRowHeights(nsIPresContext* aPresContext,
// the largest desired height of each cell, the largest style height of each cell,
// the style height of the row.
nscoord pctHeightBasis = GetHeightBasis(aReflowState);
- nsTableRowFrame* rowFrame;
PRInt32 rowIndex; // the index in rowInfo, not among the rows in the row group
for (rowFrame = startRowFrame, rowIndex = 0; rowFrame; rowFrame = rowFrame->GetNextRow(), rowIndex++) {
UpdateHeights(rowInfo[rowIndex], nsTableFrame::RoundToPixel(rowFrame->GetHeight(pctHeightBasis), p2t),
@@ -1326,14 +1339,26 @@ nscoord
nsTableRowGroupFrame::GetHeightBasis(const nsHTMLReflowState& aReflowState)
{
nscoord result = 0;
- if ((aReflowState.mComputedHeight > 0) && (aReflowState.mComputedHeight < NS_UNCONSTRAINEDSIZE)) {
- nsTableFrame* tableFrame = nsnull;
- nsTableFrame::GetTableFrame((nsIFrame*)this, tableFrame);
- if (tableFrame) {
+ nsTableFrame* tableFrame = nsnull;
+ nsTableFrame::GetTableFrame((nsIFrame*)this, tableFrame);
+ if (tableFrame) {
+ if ((aReflowState.mComputedHeight > 0) && (aReflowState.mComputedHeight < NS_UNCONSTRAINEDSIZE)) {
nscoord cellSpacing = PR_MAX(0, GetRowCount() - 1) * tableFrame->GetCellSpacingY();
- result -= cellSpacing;
+ result = aReflowState.mComputedHeight - cellSpacing;
+ }
+ else {
+ const nsHTMLReflowState* parentRS = aReflowState.parentReflowState;
+ if (parentRS && (tableFrame != parentRS->frame)) {
+ parentRS = parentRS->parentReflowState;
+ }
+ if (parentRS && (tableFrame == parentRS->frame) &&
+ (parentRS->mComputedHeight > 0) && (parentRS->mComputedHeight < NS_UNCONSTRAINEDSIZE)) {
+ nscoord cellSpacing = PR_MAX(0, tableFrame->GetRowCount() - 1) * tableFrame->GetCellSpacingY();
+ result = parentRS->mComputedHeight - cellSpacing;
+ }
}
}
+
return result;
}
diff --git a/mozilla/layout/tables/nsTableRowFrame.cpp b/mozilla/layout/tables/nsTableRowFrame.cpp
index caaa317ead8..256e79ae6ba 100644
--- a/mozilla/layout/tables/nsTableRowFrame.cpp
+++ b/mozilla/layout/tables/nsTableRowFrame.cpp
@@ -35,6 +35,7 @@
*
* ***** END LICENSE BLOCK ***** */
#include "nsTableRowFrame.h"
+#include "nsTableRowGroupFrame.h"
#include "nsIRenderingContext.h"
#include "nsIPresShell.h"
#include "nsIPresContext.h"
@@ -114,11 +115,12 @@ nsTableRowFrame::SetFixedHeight(nscoord aValue)
}
void
-nsTableRowFrame::SetPctHeight(float aPctValue)
+nsTableRowFrame::SetPctHeight(float aPctValue,
+ PRBool aForce)
{
nscoord height = PR_MAX(0, NSToCoordRound(aPctValue * 100.0f));
if (HasPctHeight()) {
- if (height > mStyleHeight) {
+ if ((height > mStyleHeight) || aForce) {
mStyleHeight = height;
}
}
@@ -520,6 +522,15 @@ nsTableRowFrame::CalcHeight(const nsHTMLReflowState& aReflowState)
? 0 : aReflowState.mComputedHeight;
ResetHeight(computedHeight);
+ const nsStylePosition* position;
+ GetStyleData(eStyleStruct_Position, (const nsStyleStruct*&)position);
+ if (eStyleUnit_Coord == position->mHeight.GetUnit()) {
+ SetFixedHeight(position->mHeight.GetCoordValue());
+ }
+ else if (eStyleUnit_Percent == position->mHeight.GetUnit()) {
+ SetPctHeight(position->mHeight.GetPercentValue());
+ }
+
for (nsIFrame* kidFrame = mFrames.FirstChild(); kidFrame; kidFrame->GetNextSibling(&kidFrame)) {
nsCOMPtr frameType;
kidFrame->GetFrameType(getter_AddRefs(frameType));
@@ -1336,12 +1347,22 @@ nsTableRowFrame::Reflow(nsIPresContext* aPresContext,
if (!tableFrame) return NS_ERROR_NULL_POINTER;
if ((NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth) && !mPrevInFlow) {
- // see if an extra reflow will be necessary when there is a pct height but no height on the parent
+ // see if an extra reflow will be necessary when there is a pct height but no height basis
if ( ((NS_UNCONSTRAINEDSIZE == aReflowState.mComputedHeight) ||
- (0 == aReflowState.mComputedHeight)) &&
+ (0 == aReflowState.mComputedHeight)) &&
nsTableFrame::IsPctHeight(mStyleContext)) {
- nsTableFrame::NotifyAncestorsOfSpecialReflow(aReflowState);
- SetNeedSpecialReflow(PR_TRUE);
+ const nsHTMLReflowState* parentRS = aReflowState.parentReflowState;
+ if (parentRS && parentRS->frame) {
+ nsCOMPtr fType;
+ parentRS->frame->GetFrameType(getter_AddRefs(fType));
+ if (nsLayoutAtoms::tableRowGroupFrame == fType.get()) {
+ nscoord pctBasis = ((nsTableRowGroupFrame*)parentRS->frame)->GetHeightBasis(*parentRS);
+ if (0 == pctBasis) {
+ nsTableFrame::NotifyAncestorsOfSpecialReflow(aReflowState);
+ SetNeedSpecialReflow(PR_TRUE);
+ }
+ }
+ }
}
}
diff --git a/mozilla/layout/tables/nsTableRowFrame.h b/mozilla/layout/tables/nsTableRowFrame.h
index a697d4e0902..c6121a5375d 100644
--- a/mozilla/layout/tables/nsTableRowFrame.h
+++ b/mozilla/layout/tables/nsTableRowFrame.h
@@ -236,7 +236,8 @@ public:
void SetFixedHeight(nscoord aValue);
float GetPctHeight() const;
- void SetPctHeight(float aPctValue);
+ void SetPctHeight(float aPctValue,
+ PRBool aForce = PR_FALSE);
nscoord GetHeight(nscoord aBasis = 0) const;
diff --git a/mozilla/layout/tables/nsTableRowGroupFrame.cpp b/mozilla/layout/tables/nsTableRowGroupFrame.cpp
index fca38c08835..01f14810418 100644
--- a/mozilla/layout/tables/nsTableRowGroupFrame.cpp
+++ b/mozilla/layout/tables/nsTableRowGroupFrame.cpp
@@ -560,6 +560,20 @@ nsTableRowGroupFrame::CalculateRowHeights(nsIPresContext* aPresContext,
float p2t;
aPresContext->GetPixelsToTwips(&p2t);
+ // make sure that pct height rows do not exceed 100%
+ nscoord pctTotal = 0;
+ nsTableRowFrame* rowFrame;
+ for (rowFrame = GetFirstRow(); rowFrame; rowFrame = rowFrame->GetNextRow()) {
+ if (rowFrame->HasPctHeight()) {
+ nscoord pctHeight = NSToCoordRound(rowFrame->GetPctHeight() * 100.0f);
+ if ((pctHeight + pctTotal) > 100) {
+ pctHeight = PR_MAX(0, NSToCoordRound(100.0f - (float)pctTotal));
+ rowFrame->SetPctHeight((float)pctHeight / 100.0f, PR_TRUE);
+ }
+ pctTotal += pctHeight;
+ }
+ }
+
// find the nearest row at or before aStartRowFrameIn that isn't spanned into.
// If we have a computed height, then we can't compute the heights
// incrementally from aStartRowFrameIn, and we must start at the first row.
@@ -605,7 +619,6 @@ nsTableRowGroupFrame::CalculateRowHeights(nsIPresContext* aPresContext,
// the largest desired height of each cell, the largest style height of each cell,
// the style height of the row.
nscoord pctHeightBasis = GetHeightBasis(aReflowState);
- nsTableRowFrame* rowFrame;
PRInt32 rowIndex; // the index in rowInfo, not among the rows in the row group
for (rowFrame = startRowFrame, rowIndex = 0; rowFrame; rowFrame = rowFrame->GetNextRow(), rowIndex++) {
UpdateHeights(rowInfo[rowIndex], nsTableFrame::RoundToPixel(rowFrame->GetHeight(pctHeightBasis), p2t),
@@ -1326,14 +1339,26 @@ nscoord
nsTableRowGroupFrame::GetHeightBasis(const nsHTMLReflowState& aReflowState)
{
nscoord result = 0;
- if ((aReflowState.mComputedHeight > 0) && (aReflowState.mComputedHeight < NS_UNCONSTRAINEDSIZE)) {
- nsTableFrame* tableFrame = nsnull;
- nsTableFrame::GetTableFrame((nsIFrame*)this, tableFrame);
- if (tableFrame) {
+ nsTableFrame* tableFrame = nsnull;
+ nsTableFrame::GetTableFrame((nsIFrame*)this, tableFrame);
+ if (tableFrame) {
+ if ((aReflowState.mComputedHeight > 0) && (aReflowState.mComputedHeight < NS_UNCONSTRAINEDSIZE)) {
nscoord cellSpacing = PR_MAX(0, GetRowCount() - 1) * tableFrame->GetCellSpacingY();
- result -= cellSpacing;
+ result = aReflowState.mComputedHeight - cellSpacing;
+ }
+ else {
+ const nsHTMLReflowState* parentRS = aReflowState.parentReflowState;
+ if (parentRS && (tableFrame != parentRS->frame)) {
+ parentRS = parentRS->parentReflowState;
+ }
+ if (parentRS && (tableFrame == parentRS->frame) &&
+ (parentRS->mComputedHeight > 0) && (parentRS->mComputedHeight < NS_UNCONSTRAINEDSIZE)) {
+ nscoord cellSpacing = PR_MAX(0, tableFrame->GetRowCount() - 1) * tableFrame->GetCellSpacingY();
+ result = parentRS->mComputedHeight - cellSpacing;
+ }
}
}
+
return result;
}