зеркало из https://github.com/mozilla/pjs.git
bugs 38396, 29429, 32471, 27390, 32581
errors in incremental calcuation of max-element-size and preferred-size
This commit is contained in:
Родитель
f1e3b8d298
Коммит
1a265a16b4
|
@ -153,6 +153,7 @@ InitDebugFlags()
|
||||||
#undef REALLY_NOISY_FIRST_LINE
|
#undef REALLY_NOISY_FIRST_LINE
|
||||||
#undef NOISY_FIRST_LETTER
|
#undef NOISY_FIRST_LETTER
|
||||||
#undef NOISY_MAX_ELEMENT_SIZE
|
#undef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
#undef NOISY_MAXIMUM_WIDTH
|
||||||
#undef NOISY_FLOATER_CLEARING
|
#undef NOISY_FLOATER_CLEARING
|
||||||
#undef NOISY_FINAL_SIZE
|
#undef NOISY_FINAL_SIZE
|
||||||
#undef NOISY_REMOVE_FRAME
|
#undef NOISY_REMOVE_FRAME
|
||||||
|
@ -390,6 +391,9 @@ public:
|
||||||
|
|
||||||
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
||||||
if (aMaximumWidth > mMaximumWidth) {
|
if (aMaximumWidth > mMaximumWidth) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::UpdateMaximumWidth block %p caching max width %d\n", mBlock, aMaximumWidth);
|
||||||
|
#endif
|
||||||
mMaximumWidth = aMaximumWidth;
|
mMaximumWidth = aMaximumWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +701,9 @@ nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("BRS: setting compute-MES to %d\n", (nsnull != aMetrics.maxElementSize));
|
||||||
|
#endif
|
||||||
mMaxElementSize.SizeTo(0, 0);
|
mMaxElementSize.SizeTo(0, 0);
|
||||||
SetFlag(BRS_COMPUTEMAXWIDTH,
|
SetFlag(BRS_COMPUTEMAXWIDTH,
|
||||||
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
||||||
|
@ -975,15 +982,21 @@ nsBlockReflowState::RecoverStateFrom(nsLineBox* aLine,
|
||||||
printf(": WARNING: xmost:%d\n", xmost);
|
printf(": WARNING: xmost:%d\n", xmost);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*sec*/ //printf("%p RecoverState aState.mKidXMost=%d\n", this, xmost);
|
//printf("%p RecoverState block %p aState.mKidXMost=%d\n", this, mBlock, xmost);
|
||||||
mKidXMost = xmost;
|
mKidXMost = xmost;
|
||||||
}
|
}
|
||||||
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If computing the maximum width, then update mMaximumWidth
|
// If computing the maximum width, then update mMaximumWidth
|
||||||
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
UpdateMaximumWidth(aLine->mMaximumWidth);
|
UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1944,13 +1957,14 @@ nsBlockFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
if (aMetrics.maxElementSize) {
|
if (aMetrics.maxElementSize) {
|
||||||
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
||||||
aMetrics.maxElementSize->width,
|
aMetrics.maxElementSize->width,
|
||||||
aMetrics.maxElementSize->height);
|
aMetrics.maxElementSize->height);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2075,12 +2089,16 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
if (nsnull != aMetrics.maxElementSize) {
|
||||||
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
||||||
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p initially setting MES %d\n",
|
||||||
|
this, aState.mMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Compute final width
|
// Compute final width
|
||||||
nscoord maxWidth = 0, maxHeight = 0;
|
nscoord maxWidth = 0, maxHeight = 0;
|
||||||
/*SEC*///printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
||||||
if (!HaveAutoWidth(aReflowState)) {
|
if (!HaveAutoWidth(aReflowState)) {
|
||||||
// Use style defined width
|
// Use style defined width
|
||||||
|
@ -2134,7 +2152,9 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// When no-wrap is true the max-element-size.width is the
|
// When no-wrap is true the max-element-size.width is the
|
||||||
// width of the widest line plus the right border. Note that
|
// width of the widest line plus the right border. Note that
|
||||||
// aState.mKidXMost already has the left border factored in
|
// aState.mKidXMost already has the left border factored in
|
||||||
maxWidth = aState.mKidXMost + borderPadding.right;
|
//maxWidth = aState.mKidXMost + borderPadding.right;
|
||||||
|
maxWidth = aState.mMaxElementSize.width +
|
||||||
|
borderPadding.left + borderPadding.right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add in border and padding dimensions to already computed
|
// Add in border and padding dimensions to already computed
|
||||||
|
@ -2266,6 +2286,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// Store away the final value
|
// Store away the final value
|
||||||
aMetrics.maxElementSize->width = maxWidth;
|
aMetrics.maxElementSize->width = maxWidth;
|
||||||
aMetrics.maxElementSize->height = maxHeight;
|
aMetrics.maxElementSize->height = maxHeight;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p returning MES %d\n",
|
||||||
|
this, aMetrics.maxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return bottom margin information
|
// Return bottom margin information
|
||||||
|
@ -2304,11 +2328,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// If we're requested to update our maximum width, then compute it
|
// If we're requested to update our maximum width, then compute it
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
// We need to add in for the right border/padding
|
// We need to add in for the right border/padding
|
||||||
// The line below should be completely unnecessary if max element sizes are
|
|
||||||
// computed correctly. But I found a case where this wasn't true.
|
|
||||||
// Still investigating, leaving the line in as a place holder
|
|
||||||
// XXX, should be unnecessary: aMetrics.mMaximumWidth = PR_MAX(aMetrics.mMaximumWidth, aMetrics.width);
|
|
||||||
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the combined area of our children
|
// Compute the combined area of our children
|
||||||
|
@ -3168,6 +3191,10 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
// Update the line's maximum width
|
// Update the line's maximum width
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
// Remove any floaters associated with the line from the space
|
// Remove any floaters associated with the line from the space
|
||||||
|
@ -3181,7 +3208,7 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
// on this line the code to reflow the floater looks at both...
|
// on this line the code to reflow the floater looks at both...
|
||||||
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
||||||
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
||||||
|
|
||||||
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
||||||
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
@ -3190,6 +3217,25 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
}
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaxElementWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't really know what changed in the line, so use the union
|
// We don't really know what changed in the line, so use the union
|
||||||
|
@ -3936,6 +3982,10 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
|
||||||
// updated value in the line, and update the current maximum width
|
// updated value in the line, and update the current maximum width
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowBlockFrame parent block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4695,6 +4745,10 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = maxElementSize.width;
|
aLine->mMaxElementWidth = maxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PlaceLine: %p setting MES for line %p to %d\n",
|
||||||
|
this, aLine, maxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -4823,6 +4877,10 @@ nsBlockFrame::ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
||||||
aMaxElementSize->height = maxHeight;
|
aMaxElementSize->height = maxHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::ComputeLineMaxElementSize: %p returning MES %d\n",
|
||||||
|
this, aMaxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4846,12 +4904,20 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = aMaxElementSize.width;
|
aLine->mMaxElementWidth = aMaxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PostPlaceLine: %p setting line %p MES %d\n",
|
||||||
|
this, aLine, aMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an unconstrained reflow, then cache the line width in the
|
// If this is an unconstrained reflow, then cache the line width in the
|
||||||
// line. We'll need this during incremental reflow if we're asked to
|
// line. We'll need this during incremental reflow if we're asked to
|
||||||
// calculate the maximum width
|
// calculate the maximum width
|
||||||
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::PostPlaceLine block %p line %p caching max width %d\n",
|
||||||
|
this, aLine, aLine->mBounds.XMost());
|
||||||
|
#endif
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4867,11 +4933,11 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// then make sure we take up all of the available width
|
// then make sure we take up all of the available width
|
||||||
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
||||||
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
||||||
/*sec*/ //printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
else if (xmost > aState.mKidXMost) {
|
else if (xmost > aState.mKidXMost) {
|
||||||
aState.mKidXMost = xmost;
|
aState.mKidXMost = xmost;
|
||||||
/*sec*/ //printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6406,7 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsCOMPtr<nsILineIterator> it;
|
nsCOMPtr<nsILineIterator> it;
|
||||||
nsIFrame *mainframe = this;
|
nsIFrame *mainframe = this;
|
||||||
nsCOMPtr<nsIFocusTracker> tracker;
|
nsCOMPtr<nsIFocusTracker> tracker;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
||||||
|
|
|
@ -56,6 +56,8 @@ nsBlockReflowContext::nsBlockReflowContext(nsIPresContext* aPresContext,
|
||||||
mBlockShouldInvalidateItself(PR_FALSE)
|
mBlockShouldInvalidateItself(PR_FALSE)
|
||||||
{
|
{
|
||||||
mStyleSpacing = nsnull;
|
mStyleSpacing = nsnull;
|
||||||
|
if (mComputeMaximumWidth)
|
||||||
|
mMetrics.mFlags |= NS_REFLOW_CALC_MAX_WIDTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
|
@ -265,11 +267,6 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
|
||||||
reason = eReflowReason_Incremental;
|
reason = eReflowReason_Incremental;
|
||||||
// Make sure we only incrementally reflow once
|
// Make sure we only incrementally reflow once
|
||||||
mNextRCFrame = nsnull;
|
mNextRCFrame = nsnull;
|
||||||
|
|
||||||
// If we should compute the maximum width, then let the block know
|
|
||||||
if (mComputeMaximumWidth) {
|
|
||||||
mMetrics.mFlags |= NS_REFLOW_CALC_MAX_WIDTH;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (mOuterReflowState.reason == eReflowReason_StyleChange) {
|
else if (mOuterReflowState.reason == eReflowReason_StyleChange) {
|
||||||
reason = eReflowReason_StyleChange;
|
reason = eReflowReason_StyleChange;
|
||||||
|
@ -458,13 +455,17 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
|
||||||
|
|
||||||
// Update the reflow metrics with the maximum width
|
// Update the reflow metrics with the maximum width
|
||||||
mMetrics.mMaximumWidth = mMetrics.width;
|
mMetrics.mMaximumWidth = mMetrics.width;
|
||||||
|
#ifdef NOISY_REFLOW
|
||||||
|
printf("*** nsBlockReflowContext::ReflowBlock block %p returning max width %d\n",
|
||||||
|
aFrame, mMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
// The second reflow is just as a resize reflow with the constrained
|
// The second reflow is just as a resize reflow with the constrained
|
||||||
// width
|
// width
|
||||||
reflowState.availableWidth = oldAvailableWidth;
|
reflowState.availableWidth = oldAvailableWidth;
|
||||||
reflowState.mComputedWidth = oldComputedWidth;
|
reflowState.mComputedWidth = oldComputedWidth;
|
||||||
reason = eReflowReason_Resize;
|
reason = eReflowReason_Resize;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = aFrame->Reflow(mPresContext, mMetrics, reflowState,
|
rv = aFrame->Reflow(mPresContext, mMetrics, reflowState,
|
||||||
aFrameReflowStatus);
|
aFrameReflowStatus);
|
||||||
mOuterReflowState.mSpaceManager->Translate(-tx, -ty);
|
mOuterReflowState.mSpaceManager->Translate(-tx, -ty);
|
||||||
|
|
|
@ -153,6 +153,7 @@ InitDebugFlags()
|
||||||
#undef REALLY_NOISY_FIRST_LINE
|
#undef REALLY_NOISY_FIRST_LINE
|
||||||
#undef NOISY_FIRST_LETTER
|
#undef NOISY_FIRST_LETTER
|
||||||
#undef NOISY_MAX_ELEMENT_SIZE
|
#undef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
#undef NOISY_MAXIMUM_WIDTH
|
||||||
#undef NOISY_FLOATER_CLEARING
|
#undef NOISY_FLOATER_CLEARING
|
||||||
#undef NOISY_FINAL_SIZE
|
#undef NOISY_FINAL_SIZE
|
||||||
#undef NOISY_REMOVE_FRAME
|
#undef NOISY_REMOVE_FRAME
|
||||||
|
@ -390,6 +391,9 @@ public:
|
||||||
|
|
||||||
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
||||||
if (aMaximumWidth > mMaximumWidth) {
|
if (aMaximumWidth > mMaximumWidth) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::UpdateMaximumWidth block %p caching max width %d\n", mBlock, aMaximumWidth);
|
||||||
|
#endif
|
||||||
mMaximumWidth = aMaximumWidth;
|
mMaximumWidth = aMaximumWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +701,9 @@ nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("BRS: setting compute-MES to %d\n", (nsnull != aMetrics.maxElementSize));
|
||||||
|
#endif
|
||||||
mMaxElementSize.SizeTo(0, 0);
|
mMaxElementSize.SizeTo(0, 0);
|
||||||
SetFlag(BRS_COMPUTEMAXWIDTH,
|
SetFlag(BRS_COMPUTEMAXWIDTH,
|
||||||
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
||||||
|
@ -975,15 +982,21 @@ nsBlockReflowState::RecoverStateFrom(nsLineBox* aLine,
|
||||||
printf(": WARNING: xmost:%d\n", xmost);
|
printf(": WARNING: xmost:%d\n", xmost);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*sec*/ //printf("%p RecoverState aState.mKidXMost=%d\n", this, xmost);
|
//printf("%p RecoverState block %p aState.mKidXMost=%d\n", this, mBlock, xmost);
|
||||||
mKidXMost = xmost;
|
mKidXMost = xmost;
|
||||||
}
|
}
|
||||||
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If computing the maximum width, then update mMaximumWidth
|
// If computing the maximum width, then update mMaximumWidth
|
||||||
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
UpdateMaximumWidth(aLine->mMaximumWidth);
|
UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1944,13 +1957,14 @@ nsBlockFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
if (aMetrics.maxElementSize) {
|
if (aMetrics.maxElementSize) {
|
||||||
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
||||||
aMetrics.maxElementSize->width,
|
aMetrics.maxElementSize->width,
|
||||||
aMetrics.maxElementSize->height);
|
aMetrics.maxElementSize->height);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2075,12 +2089,16 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
if (nsnull != aMetrics.maxElementSize) {
|
||||||
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
||||||
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p initially setting MES %d\n",
|
||||||
|
this, aState.mMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Compute final width
|
// Compute final width
|
||||||
nscoord maxWidth = 0, maxHeight = 0;
|
nscoord maxWidth = 0, maxHeight = 0;
|
||||||
/*SEC*///printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
||||||
if (!HaveAutoWidth(aReflowState)) {
|
if (!HaveAutoWidth(aReflowState)) {
|
||||||
// Use style defined width
|
// Use style defined width
|
||||||
|
@ -2134,7 +2152,9 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// When no-wrap is true the max-element-size.width is the
|
// When no-wrap is true the max-element-size.width is the
|
||||||
// width of the widest line plus the right border. Note that
|
// width of the widest line plus the right border. Note that
|
||||||
// aState.mKidXMost already has the left border factored in
|
// aState.mKidXMost already has the left border factored in
|
||||||
maxWidth = aState.mKidXMost + borderPadding.right;
|
//maxWidth = aState.mKidXMost + borderPadding.right;
|
||||||
|
maxWidth = aState.mMaxElementSize.width +
|
||||||
|
borderPadding.left + borderPadding.right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add in border and padding dimensions to already computed
|
// Add in border and padding dimensions to already computed
|
||||||
|
@ -2266,6 +2286,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// Store away the final value
|
// Store away the final value
|
||||||
aMetrics.maxElementSize->width = maxWidth;
|
aMetrics.maxElementSize->width = maxWidth;
|
||||||
aMetrics.maxElementSize->height = maxHeight;
|
aMetrics.maxElementSize->height = maxHeight;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p returning MES %d\n",
|
||||||
|
this, aMetrics.maxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return bottom margin information
|
// Return bottom margin information
|
||||||
|
@ -2304,11 +2328,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// If we're requested to update our maximum width, then compute it
|
// If we're requested to update our maximum width, then compute it
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
// We need to add in for the right border/padding
|
// We need to add in for the right border/padding
|
||||||
// The line below should be completely unnecessary if max element sizes are
|
|
||||||
// computed correctly. But I found a case where this wasn't true.
|
|
||||||
// Still investigating, leaving the line in as a place holder
|
|
||||||
// XXX, should be unnecessary: aMetrics.mMaximumWidth = PR_MAX(aMetrics.mMaximumWidth, aMetrics.width);
|
|
||||||
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the combined area of our children
|
// Compute the combined area of our children
|
||||||
|
@ -3168,6 +3191,10 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
// Update the line's maximum width
|
// Update the line's maximum width
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
// Remove any floaters associated with the line from the space
|
// Remove any floaters associated with the line from the space
|
||||||
|
@ -3181,7 +3208,7 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
// on this line the code to reflow the floater looks at both...
|
// on this line the code to reflow the floater looks at both...
|
||||||
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
||||||
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
||||||
|
|
||||||
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
||||||
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
@ -3190,6 +3217,25 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
}
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaxElementWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't really know what changed in the line, so use the union
|
// We don't really know what changed in the line, so use the union
|
||||||
|
@ -3936,6 +3982,10 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
|
||||||
// updated value in the line, and update the current maximum width
|
// updated value in the line, and update the current maximum width
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowBlockFrame parent block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4695,6 +4745,10 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = maxElementSize.width;
|
aLine->mMaxElementWidth = maxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PlaceLine: %p setting MES for line %p to %d\n",
|
||||||
|
this, aLine, maxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -4823,6 +4877,10 @@ nsBlockFrame::ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
||||||
aMaxElementSize->height = maxHeight;
|
aMaxElementSize->height = maxHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::ComputeLineMaxElementSize: %p returning MES %d\n",
|
||||||
|
this, aMaxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4846,12 +4904,20 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = aMaxElementSize.width;
|
aLine->mMaxElementWidth = aMaxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PostPlaceLine: %p setting line %p MES %d\n",
|
||||||
|
this, aLine, aMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an unconstrained reflow, then cache the line width in the
|
// If this is an unconstrained reflow, then cache the line width in the
|
||||||
// line. We'll need this during incremental reflow if we're asked to
|
// line. We'll need this during incremental reflow if we're asked to
|
||||||
// calculate the maximum width
|
// calculate the maximum width
|
||||||
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::PostPlaceLine block %p line %p caching max width %d\n",
|
||||||
|
this, aLine, aLine->mBounds.XMost());
|
||||||
|
#endif
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4867,11 +4933,11 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// then make sure we take up all of the available width
|
// then make sure we take up all of the available width
|
||||||
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
||||||
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
||||||
/*sec*/ //printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
else if (xmost > aState.mKidXMost) {
|
else if (xmost > aState.mKidXMost) {
|
||||||
aState.mKidXMost = xmost;
|
aState.mKidXMost = xmost;
|
||||||
/*sec*/ //printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6406,7 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsCOMPtr<nsILineIterator> it;
|
nsCOMPtr<nsILineIterator> it;
|
||||||
nsIFrame *mainframe = this;
|
nsIFrame *mainframe = this;
|
||||||
nsCOMPtr<nsIFocusTracker> tracker;
|
nsCOMPtr<nsIFocusTracker> tracker;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
||||||
|
|
|
@ -153,6 +153,7 @@ InitDebugFlags()
|
||||||
#undef REALLY_NOISY_FIRST_LINE
|
#undef REALLY_NOISY_FIRST_LINE
|
||||||
#undef NOISY_FIRST_LETTER
|
#undef NOISY_FIRST_LETTER
|
||||||
#undef NOISY_MAX_ELEMENT_SIZE
|
#undef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
#undef NOISY_MAXIMUM_WIDTH
|
||||||
#undef NOISY_FLOATER_CLEARING
|
#undef NOISY_FLOATER_CLEARING
|
||||||
#undef NOISY_FINAL_SIZE
|
#undef NOISY_FINAL_SIZE
|
||||||
#undef NOISY_REMOVE_FRAME
|
#undef NOISY_REMOVE_FRAME
|
||||||
|
@ -390,6 +391,9 @@ public:
|
||||||
|
|
||||||
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
||||||
if (aMaximumWidth > mMaximumWidth) {
|
if (aMaximumWidth > mMaximumWidth) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::UpdateMaximumWidth block %p caching max width %d\n", mBlock, aMaximumWidth);
|
||||||
|
#endif
|
||||||
mMaximumWidth = aMaximumWidth;
|
mMaximumWidth = aMaximumWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +701,9 @@ nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("BRS: setting compute-MES to %d\n", (nsnull != aMetrics.maxElementSize));
|
||||||
|
#endif
|
||||||
mMaxElementSize.SizeTo(0, 0);
|
mMaxElementSize.SizeTo(0, 0);
|
||||||
SetFlag(BRS_COMPUTEMAXWIDTH,
|
SetFlag(BRS_COMPUTEMAXWIDTH,
|
||||||
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
||||||
|
@ -975,15 +982,21 @@ nsBlockReflowState::RecoverStateFrom(nsLineBox* aLine,
|
||||||
printf(": WARNING: xmost:%d\n", xmost);
|
printf(": WARNING: xmost:%d\n", xmost);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*sec*/ //printf("%p RecoverState aState.mKidXMost=%d\n", this, xmost);
|
//printf("%p RecoverState block %p aState.mKidXMost=%d\n", this, mBlock, xmost);
|
||||||
mKidXMost = xmost;
|
mKidXMost = xmost;
|
||||||
}
|
}
|
||||||
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If computing the maximum width, then update mMaximumWidth
|
// If computing the maximum width, then update mMaximumWidth
|
||||||
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
UpdateMaximumWidth(aLine->mMaximumWidth);
|
UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1944,13 +1957,14 @@ nsBlockFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
if (aMetrics.maxElementSize) {
|
if (aMetrics.maxElementSize) {
|
||||||
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
||||||
aMetrics.maxElementSize->width,
|
aMetrics.maxElementSize->width,
|
||||||
aMetrics.maxElementSize->height);
|
aMetrics.maxElementSize->height);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2075,12 +2089,16 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
if (nsnull != aMetrics.maxElementSize) {
|
||||||
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
||||||
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p initially setting MES %d\n",
|
||||||
|
this, aState.mMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Compute final width
|
// Compute final width
|
||||||
nscoord maxWidth = 0, maxHeight = 0;
|
nscoord maxWidth = 0, maxHeight = 0;
|
||||||
/*SEC*///printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
||||||
if (!HaveAutoWidth(aReflowState)) {
|
if (!HaveAutoWidth(aReflowState)) {
|
||||||
// Use style defined width
|
// Use style defined width
|
||||||
|
@ -2134,7 +2152,9 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// When no-wrap is true the max-element-size.width is the
|
// When no-wrap is true the max-element-size.width is the
|
||||||
// width of the widest line plus the right border. Note that
|
// width of the widest line plus the right border. Note that
|
||||||
// aState.mKidXMost already has the left border factored in
|
// aState.mKidXMost already has the left border factored in
|
||||||
maxWidth = aState.mKidXMost + borderPadding.right;
|
//maxWidth = aState.mKidXMost + borderPadding.right;
|
||||||
|
maxWidth = aState.mMaxElementSize.width +
|
||||||
|
borderPadding.left + borderPadding.right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add in border and padding dimensions to already computed
|
// Add in border and padding dimensions to already computed
|
||||||
|
@ -2266,6 +2286,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// Store away the final value
|
// Store away the final value
|
||||||
aMetrics.maxElementSize->width = maxWidth;
|
aMetrics.maxElementSize->width = maxWidth;
|
||||||
aMetrics.maxElementSize->height = maxHeight;
|
aMetrics.maxElementSize->height = maxHeight;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p returning MES %d\n",
|
||||||
|
this, aMetrics.maxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return bottom margin information
|
// Return bottom margin information
|
||||||
|
@ -2304,11 +2328,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// If we're requested to update our maximum width, then compute it
|
// If we're requested to update our maximum width, then compute it
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
// We need to add in for the right border/padding
|
// We need to add in for the right border/padding
|
||||||
// The line below should be completely unnecessary if max element sizes are
|
|
||||||
// computed correctly. But I found a case where this wasn't true.
|
|
||||||
// Still investigating, leaving the line in as a place holder
|
|
||||||
// XXX, should be unnecessary: aMetrics.mMaximumWidth = PR_MAX(aMetrics.mMaximumWidth, aMetrics.width);
|
|
||||||
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the combined area of our children
|
// Compute the combined area of our children
|
||||||
|
@ -3168,6 +3191,10 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
// Update the line's maximum width
|
// Update the line's maximum width
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
// Remove any floaters associated with the line from the space
|
// Remove any floaters associated with the line from the space
|
||||||
|
@ -3181,7 +3208,7 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
// on this line the code to reflow the floater looks at both...
|
// on this line the code to reflow the floater looks at both...
|
||||||
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
||||||
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
||||||
|
|
||||||
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
||||||
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
@ -3190,6 +3217,25 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
}
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaxElementWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't really know what changed in the line, so use the union
|
// We don't really know what changed in the line, so use the union
|
||||||
|
@ -3936,6 +3982,10 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
|
||||||
// updated value in the line, and update the current maximum width
|
// updated value in the line, and update the current maximum width
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowBlockFrame parent block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4695,6 +4745,10 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = maxElementSize.width;
|
aLine->mMaxElementWidth = maxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PlaceLine: %p setting MES for line %p to %d\n",
|
||||||
|
this, aLine, maxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -4823,6 +4877,10 @@ nsBlockFrame::ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
||||||
aMaxElementSize->height = maxHeight;
|
aMaxElementSize->height = maxHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::ComputeLineMaxElementSize: %p returning MES %d\n",
|
||||||
|
this, aMaxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4846,12 +4904,20 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = aMaxElementSize.width;
|
aLine->mMaxElementWidth = aMaxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PostPlaceLine: %p setting line %p MES %d\n",
|
||||||
|
this, aLine, aMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an unconstrained reflow, then cache the line width in the
|
// If this is an unconstrained reflow, then cache the line width in the
|
||||||
// line. We'll need this during incremental reflow if we're asked to
|
// line. We'll need this during incremental reflow if we're asked to
|
||||||
// calculate the maximum width
|
// calculate the maximum width
|
||||||
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::PostPlaceLine block %p line %p caching max width %d\n",
|
||||||
|
this, aLine, aLine->mBounds.XMost());
|
||||||
|
#endif
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4867,11 +4933,11 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// then make sure we take up all of the available width
|
// then make sure we take up all of the available width
|
||||||
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
||||||
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
||||||
/*sec*/ //printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
else if (xmost > aState.mKidXMost) {
|
else if (xmost > aState.mKidXMost) {
|
||||||
aState.mKidXMost = xmost;
|
aState.mKidXMost = xmost;
|
||||||
/*sec*/ //printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6406,7 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsCOMPtr<nsILineIterator> it;
|
nsCOMPtr<nsILineIterator> it;
|
||||||
nsIFrame *mainframe = this;
|
nsIFrame *mainframe = this;
|
||||||
nsCOMPtr<nsIFocusTracker> tracker;
|
nsCOMPtr<nsIFocusTracker> tracker;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
||||||
|
|
|
@ -153,6 +153,7 @@ InitDebugFlags()
|
||||||
#undef REALLY_NOISY_FIRST_LINE
|
#undef REALLY_NOISY_FIRST_LINE
|
||||||
#undef NOISY_FIRST_LETTER
|
#undef NOISY_FIRST_LETTER
|
||||||
#undef NOISY_MAX_ELEMENT_SIZE
|
#undef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
#undef NOISY_MAXIMUM_WIDTH
|
||||||
#undef NOISY_FLOATER_CLEARING
|
#undef NOISY_FLOATER_CLEARING
|
||||||
#undef NOISY_FINAL_SIZE
|
#undef NOISY_FINAL_SIZE
|
||||||
#undef NOISY_REMOVE_FRAME
|
#undef NOISY_REMOVE_FRAME
|
||||||
|
@ -390,6 +391,9 @@ public:
|
||||||
|
|
||||||
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
||||||
if (aMaximumWidth > mMaximumWidth) {
|
if (aMaximumWidth > mMaximumWidth) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::UpdateMaximumWidth block %p caching max width %d\n", mBlock, aMaximumWidth);
|
||||||
|
#endif
|
||||||
mMaximumWidth = aMaximumWidth;
|
mMaximumWidth = aMaximumWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +701,9 @@ nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("BRS: setting compute-MES to %d\n", (nsnull != aMetrics.maxElementSize));
|
||||||
|
#endif
|
||||||
mMaxElementSize.SizeTo(0, 0);
|
mMaxElementSize.SizeTo(0, 0);
|
||||||
SetFlag(BRS_COMPUTEMAXWIDTH,
|
SetFlag(BRS_COMPUTEMAXWIDTH,
|
||||||
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
||||||
|
@ -975,15 +982,21 @@ nsBlockReflowState::RecoverStateFrom(nsLineBox* aLine,
|
||||||
printf(": WARNING: xmost:%d\n", xmost);
|
printf(": WARNING: xmost:%d\n", xmost);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*sec*/ //printf("%p RecoverState aState.mKidXMost=%d\n", this, xmost);
|
//printf("%p RecoverState block %p aState.mKidXMost=%d\n", this, mBlock, xmost);
|
||||||
mKidXMost = xmost;
|
mKidXMost = xmost;
|
||||||
}
|
}
|
||||||
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If computing the maximum width, then update mMaximumWidth
|
// If computing the maximum width, then update mMaximumWidth
|
||||||
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
UpdateMaximumWidth(aLine->mMaximumWidth);
|
UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1944,13 +1957,14 @@ nsBlockFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
if (aMetrics.maxElementSize) {
|
if (aMetrics.maxElementSize) {
|
||||||
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
||||||
aMetrics.maxElementSize->width,
|
aMetrics.maxElementSize->width,
|
||||||
aMetrics.maxElementSize->height);
|
aMetrics.maxElementSize->height);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2075,12 +2089,16 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
if (nsnull != aMetrics.maxElementSize) {
|
||||||
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
||||||
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p initially setting MES %d\n",
|
||||||
|
this, aState.mMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Compute final width
|
// Compute final width
|
||||||
nscoord maxWidth = 0, maxHeight = 0;
|
nscoord maxWidth = 0, maxHeight = 0;
|
||||||
/*SEC*///printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
||||||
if (!HaveAutoWidth(aReflowState)) {
|
if (!HaveAutoWidth(aReflowState)) {
|
||||||
// Use style defined width
|
// Use style defined width
|
||||||
|
@ -2134,7 +2152,9 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// When no-wrap is true the max-element-size.width is the
|
// When no-wrap is true the max-element-size.width is the
|
||||||
// width of the widest line plus the right border. Note that
|
// width of the widest line plus the right border. Note that
|
||||||
// aState.mKidXMost already has the left border factored in
|
// aState.mKidXMost already has the left border factored in
|
||||||
maxWidth = aState.mKidXMost + borderPadding.right;
|
//maxWidth = aState.mKidXMost + borderPadding.right;
|
||||||
|
maxWidth = aState.mMaxElementSize.width +
|
||||||
|
borderPadding.left + borderPadding.right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add in border and padding dimensions to already computed
|
// Add in border and padding dimensions to already computed
|
||||||
|
@ -2266,6 +2286,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// Store away the final value
|
// Store away the final value
|
||||||
aMetrics.maxElementSize->width = maxWidth;
|
aMetrics.maxElementSize->width = maxWidth;
|
||||||
aMetrics.maxElementSize->height = maxHeight;
|
aMetrics.maxElementSize->height = maxHeight;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p returning MES %d\n",
|
||||||
|
this, aMetrics.maxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return bottom margin information
|
// Return bottom margin information
|
||||||
|
@ -2304,11 +2328,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// If we're requested to update our maximum width, then compute it
|
// If we're requested to update our maximum width, then compute it
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
// We need to add in for the right border/padding
|
// We need to add in for the right border/padding
|
||||||
// The line below should be completely unnecessary if max element sizes are
|
|
||||||
// computed correctly. But I found a case where this wasn't true.
|
|
||||||
// Still investigating, leaving the line in as a place holder
|
|
||||||
// XXX, should be unnecessary: aMetrics.mMaximumWidth = PR_MAX(aMetrics.mMaximumWidth, aMetrics.width);
|
|
||||||
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the combined area of our children
|
// Compute the combined area of our children
|
||||||
|
@ -3168,6 +3191,10 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
// Update the line's maximum width
|
// Update the line's maximum width
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
// Remove any floaters associated with the line from the space
|
// Remove any floaters associated with the line from the space
|
||||||
|
@ -3181,7 +3208,7 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
// on this line the code to reflow the floater looks at both...
|
// on this line the code to reflow the floater looks at both...
|
||||||
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
||||||
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
||||||
|
|
||||||
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
||||||
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
@ -3190,6 +3217,25 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
}
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaxElementWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't really know what changed in the line, so use the union
|
// We don't really know what changed in the line, so use the union
|
||||||
|
@ -3936,6 +3982,10 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
|
||||||
// updated value in the line, and update the current maximum width
|
// updated value in the line, and update the current maximum width
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowBlockFrame parent block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4695,6 +4745,10 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = maxElementSize.width;
|
aLine->mMaxElementWidth = maxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PlaceLine: %p setting MES for line %p to %d\n",
|
||||||
|
this, aLine, maxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -4823,6 +4877,10 @@ nsBlockFrame::ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
||||||
aMaxElementSize->height = maxHeight;
|
aMaxElementSize->height = maxHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::ComputeLineMaxElementSize: %p returning MES %d\n",
|
||||||
|
this, aMaxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4846,12 +4904,20 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = aMaxElementSize.width;
|
aLine->mMaxElementWidth = aMaxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PostPlaceLine: %p setting line %p MES %d\n",
|
||||||
|
this, aLine, aMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an unconstrained reflow, then cache the line width in the
|
// If this is an unconstrained reflow, then cache the line width in the
|
||||||
// line. We'll need this during incremental reflow if we're asked to
|
// line. We'll need this during incremental reflow if we're asked to
|
||||||
// calculate the maximum width
|
// calculate the maximum width
|
||||||
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::PostPlaceLine block %p line %p caching max width %d\n",
|
||||||
|
this, aLine, aLine->mBounds.XMost());
|
||||||
|
#endif
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4867,11 +4933,11 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// then make sure we take up all of the available width
|
// then make sure we take up all of the available width
|
||||||
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
||||||
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
||||||
/*sec*/ //printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
else if (xmost > aState.mKidXMost) {
|
else if (xmost > aState.mKidXMost) {
|
||||||
aState.mKidXMost = xmost;
|
aState.mKidXMost = xmost;
|
||||||
/*sec*/ //printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6406,7 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsCOMPtr<nsILineIterator> it;
|
nsCOMPtr<nsILineIterator> it;
|
||||||
nsIFrame *mainframe = this;
|
nsIFrame *mainframe = this;
|
||||||
nsCOMPtr<nsIFocusTracker> tracker;
|
nsCOMPtr<nsIFocusTracker> tracker;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
||||||
|
|
|
@ -56,6 +56,8 @@ nsBlockReflowContext::nsBlockReflowContext(nsIPresContext* aPresContext,
|
||||||
mBlockShouldInvalidateItself(PR_FALSE)
|
mBlockShouldInvalidateItself(PR_FALSE)
|
||||||
{
|
{
|
||||||
mStyleSpacing = nsnull;
|
mStyleSpacing = nsnull;
|
||||||
|
if (mComputeMaximumWidth)
|
||||||
|
mMetrics.mFlags |= NS_REFLOW_CALC_MAX_WIDTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
|
@ -265,11 +267,6 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
|
||||||
reason = eReflowReason_Incremental;
|
reason = eReflowReason_Incremental;
|
||||||
// Make sure we only incrementally reflow once
|
// Make sure we only incrementally reflow once
|
||||||
mNextRCFrame = nsnull;
|
mNextRCFrame = nsnull;
|
||||||
|
|
||||||
// If we should compute the maximum width, then let the block know
|
|
||||||
if (mComputeMaximumWidth) {
|
|
||||||
mMetrics.mFlags |= NS_REFLOW_CALC_MAX_WIDTH;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (mOuterReflowState.reason == eReflowReason_StyleChange) {
|
else if (mOuterReflowState.reason == eReflowReason_StyleChange) {
|
||||||
reason = eReflowReason_StyleChange;
|
reason = eReflowReason_StyleChange;
|
||||||
|
@ -458,13 +455,17 @@ nsBlockReflowContext::ReflowBlock(nsIFrame* aFrame,
|
||||||
|
|
||||||
// Update the reflow metrics with the maximum width
|
// Update the reflow metrics with the maximum width
|
||||||
mMetrics.mMaximumWidth = mMetrics.width;
|
mMetrics.mMaximumWidth = mMetrics.width;
|
||||||
|
#ifdef NOISY_REFLOW
|
||||||
|
printf("*** nsBlockReflowContext::ReflowBlock block %p returning max width %d\n",
|
||||||
|
aFrame, mMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
// The second reflow is just as a resize reflow with the constrained
|
// The second reflow is just as a resize reflow with the constrained
|
||||||
// width
|
// width
|
||||||
reflowState.availableWidth = oldAvailableWidth;
|
reflowState.availableWidth = oldAvailableWidth;
|
||||||
reflowState.mComputedWidth = oldComputedWidth;
|
reflowState.mComputedWidth = oldComputedWidth;
|
||||||
reason = eReflowReason_Resize;
|
reason = eReflowReason_Resize;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = aFrame->Reflow(mPresContext, mMetrics, reflowState,
|
rv = aFrame->Reflow(mPresContext, mMetrics, reflowState,
|
||||||
aFrameReflowStatus);
|
aFrameReflowStatus);
|
||||||
mOuterReflowState.mSpaceManager->Translate(-tx, -ty);
|
mOuterReflowState.mSpaceManager->Translate(-tx, -ty);
|
||||||
|
|
|
@ -153,6 +153,7 @@ InitDebugFlags()
|
||||||
#undef REALLY_NOISY_FIRST_LINE
|
#undef REALLY_NOISY_FIRST_LINE
|
||||||
#undef NOISY_FIRST_LETTER
|
#undef NOISY_FIRST_LETTER
|
||||||
#undef NOISY_MAX_ELEMENT_SIZE
|
#undef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
#undef NOISY_MAXIMUM_WIDTH
|
||||||
#undef NOISY_FLOATER_CLEARING
|
#undef NOISY_FLOATER_CLEARING
|
||||||
#undef NOISY_FINAL_SIZE
|
#undef NOISY_FINAL_SIZE
|
||||||
#undef NOISY_REMOVE_FRAME
|
#undef NOISY_REMOVE_FRAME
|
||||||
|
@ -390,6 +391,9 @@ public:
|
||||||
|
|
||||||
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
||||||
if (aMaximumWidth > mMaximumWidth) {
|
if (aMaximumWidth > mMaximumWidth) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::UpdateMaximumWidth block %p caching max width %d\n", mBlock, aMaximumWidth);
|
||||||
|
#endif
|
||||||
mMaximumWidth = aMaximumWidth;
|
mMaximumWidth = aMaximumWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +701,9 @@ nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("BRS: setting compute-MES to %d\n", (nsnull != aMetrics.maxElementSize));
|
||||||
|
#endif
|
||||||
mMaxElementSize.SizeTo(0, 0);
|
mMaxElementSize.SizeTo(0, 0);
|
||||||
SetFlag(BRS_COMPUTEMAXWIDTH,
|
SetFlag(BRS_COMPUTEMAXWIDTH,
|
||||||
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
||||||
|
@ -975,15 +982,21 @@ nsBlockReflowState::RecoverStateFrom(nsLineBox* aLine,
|
||||||
printf(": WARNING: xmost:%d\n", xmost);
|
printf(": WARNING: xmost:%d\n", xmost);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*sec*/ //printf("%p RecoverState aState.mKidXMost=%d\n", this, xmost);
|
//printf("%p RecoverState block %p aState.mKidXMost=%d\n", this, mBlock, xmost);
|
||||||
mKidXMost = xmost;
|
mKidXMost = xmost;
|
||||||
}
|
}
|
||||||
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If computing the maximum width, then update mMaximumWidth
|
// If computing the maximum width, then update mMaximumWidth
|
||||||
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
UpdateMaximumWidth(aLine->mMaximumWidth);
|
UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1944,13 +1957,14 @@ nsBlockFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
if (aMetrics.maxElementSize) {
|
if (aMetrics.maxElementSize) {
|
||||||
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
||||||
aMetrics.maxElementSize->width,
|
aMetrics.maxElementSize->width,
|
||||||
aMetrics.maxElementSize->height);
|
aMetrics.maxElementSize->height);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2075,12 +2089,16 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
if (nsnull != aMetrics.maxElementSize) {
|
||||||
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
||||||
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p initially setting MES %d\n",
|
||||||
|
this, aState.mMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Compute final width
|
// Compute final width
|
||||||
nscoord maxWidth = 0, maxHeight = 0;
|
nscoord maxWidth = 0, maxHeight = 0;
|
||||||
/*SEC*///printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
||||||
if (!HaveAutoWidth(aReflowState)) {
|
if (!HaveAutoWidth(aReflowState)) {
|
||||||
// Use style defined width
|
// Use style defined width
|
||||||
|
@ -2134,7 +2152,9 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// When no-wrap is true the max-element-size.width is the
|
// When no-wrap is true the max-element-size.width is the
|
||||||
// width of the widest line plus the right border. Note that
|
// width of the widest line plus the right border. Note that
|
||||||
// aState.mKidXMost already has the left border factored in
|
// aState.mKidXMost already has the left border factored in
|
||||||
maxWidth = aState.mKidXMost + borderPadding.right;
|
//maxWidth = aState.mKidXMost + borderPadding.right;
|
||||||
|
maxWidth = aState.mMaxElementSize.width +
|
||||||
|
borderPadding.left + borderPadding.right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add in border and padding dimensions to already computed
|
// Add in border and padding dimensions to already computed
|
||||||
|
@ -2266,6 +2286,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// Store away the final value
|
// Store away the final value
|
||||||
aMetrics.maxElementSize->width = maxWidth;
|
aMetrics.maxElementSize->width = maxWidth;
|
||||||
aMetrics.maxElementSize->height = maxHeight;
|
aMetrics.maxElementSize->height = maxHeight;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p returning MES %d\n",
|
||||||
|
this, aMetrics.maxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return bottom margin information
|
// Return bottom margin information
|
||||||
|
@ -2304,11 +2328,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// If we're requested to update our maximum width, then compute it
|
// If we're requested to update our maximum width, then compute it
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
// We need to add in for the right border/padding
|
// We need to add in for the right border/padding
|
||||||
// The line below should be completely unnecessary if max element sizes are
|
|
||||||
// computed correctly. But I found a case where this wasn't true.
|
|
||||||
// Still investigating, leaving the line in as a place holder
|
|
||||||
// XXX, should be unnecessary: aMetrics.mMaximumWidth = PR_MAX(aMetrics.mMaximumWidth, aMetrics.width);
|
|
||||||
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the combined area of our children
|
// Compute the combined area of our children
|
||||||
|
@ -3168,6 +3191,10 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
// Update the line's maximum width
|
// Update the line's maximum width
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
// Remove any floaters associated with the line from the space
|
// Remove any floaters associated with the line from the space
|
||||||
|
@ -3181,7 +3208,7 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
// on this line the code to reflow the floater looks at both...
|
// on this line the code to reflow the floater looks at both...
|
||||||
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
||||||
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
||||||
|
|
||||||
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
||||||
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
@ -3190,6 +3217,25 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
}
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaxElementWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't really know what changed in the line, so use the union
|
// We don't really know what changed in the line, so use the union
|
||||||
|
@ -3936,6 +3982,10 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
|
||||||
// updated value in the line, and update the current maximum width
|
// updated value in the line, and update the current maximum width
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowBlockFrame parent block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4695,6 +4745,10 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = maxElementSize.width;
|
aLine->mMaxElementWidth = maxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PlaceLine: %p setting MES for line %p to %d\n",
|
||||||
|
this, aLine, maxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -4823,6 +4877,10 @@ nsBlockFrame::ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
||||||
aMaxElementSize->height = maxHeight;
|
aMaxElementSize->height = maxHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::ComputeLineMaxElementSize: %p returning MES %d\n",
|
||||||
|
this, aMaxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4846,12 +4904,20 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = aMaxElementSize.width;
|
aLine->mMaxElementWidth = aMaxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PostPlaceLine: %p setting line %p MES %d\n",
|
||||||
|
this, aLine, aMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an unconstrained reflow, then cache the line width in the
|
// If this is an unconstrained reflow, then cache the line width in the
|
||||||
// line. We'll need this during incremental reflow if we're asked to
|
// line. We'll need this during incremental reflow if we're asked to
|
||||||
// calculate the maximum width
|
// calculate the maximum width
|
||||||
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::PostPlaceLine block %p line %p caching max width %d\n",
|
||||||
|
this, aLine, aLine->mBounds.XMost());
|
||||||
|
#endif
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4867,11 +4933,11 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// then make sure we take up all of the available width
|
// then make sure we take up all of the available width
|
||||||
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
||||||
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
||||||
/*sec*/ //printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
else if (xmost > aState.mKidXMost) {
|
else if (xmost > aState.mKidXMost) {
|
||||||
aState.mKidXMost = xmost;
|
aState.mKidXMost = xmost;
|
||||||
/*sec*/ //printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6406,7 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsCOMPtr<nsILineIterator> it;
|
nsCOMPtr<nsILineIterator> it;
|
||||||
nsIFrame *mainframe = this;
|
nsIFrame *mainframe = this;
|
||||||
nsCOMPtr<nsIFocusTracker> tracker;
|
nsCOMPtr<nsIFocusTracker> tracker;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
||||||
|
|
|
@ -153,6 +153,7 @@ InitDebugFlags()
|
||||||
#undef REALLY_NOISY_FIRST_LINE
|
#undef REALLY_NOISY_FIRST_LINE
|
||||||
#undef NOISY_FIRST_LETTER
|
#undef NOISY_FIRST_LETTER
|
||||||
#undef NOISY_MAX_ELEMENT_SIZE
|
#undef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
#undef NOISY_MAXIMUM_WIDTH
|
||||||
#undef NOISY_FLOATER_CLEARING
|
#undef NOISY_FLOATER_CLEARING
|
||||||
#undef NOISY_FINAL_SIZE
|
#undef NOISY_FINAL_SIZE
|
||||||
#undef NOISY_REMOVE_FRAME
|
#undef NOISY_REMOVE_FRAME
|
||||||
|
@ -390,6 +391,9 @@ public:
|
||||||
|
|
||||||
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
void UpdateMaximumWidth(nscoord aMaximumWidth) {
|
||||||
if (aMaximumWidth > mMaximumWidth) {
|
if (aMaximumWidth > mMaximumWidth) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::UpdateMaximumWidth block %p caching max width %d\n", mBlock, aMaximumWidth);
|
||||||
|
#endif
|
||||||
mMaximumWidth = aMaximumWidth;
|
mMaximumWidth = aMaximumWidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -697,6 +701,9 @@ nsBlockReflowState::nsBlockReflowState(const nsHTMLReflowState& aReflowState,
|
||||||
}
|
}
|
||||||
|
|
||||||
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
SetFlag(BRS_COMPUTEMAXELEMENTSIZE, (nsnull != aMetrics.maxElementSize));
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("BRS: setting compute-MES to %d\n", (nsnull != aMetrics.maxElementSize));
|
||||||
|
#endif
|
||||||
mMaxElementSize.SizeTo(0, 0);
|
mMaxElementSize.SizeTo(0, 0);
|
||||||
SetFlag(BRS_COMPUTEMAXWIDTH,
|
SetFlag(BRS_COMPUTEMAXWIDTH,
|
||||||
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
(NS_REFLOW_CALC_MAX_WIDTH == (aMetrics.mFlags & NS_REFLOW_CALC_MAX_WIDTH)));
|
||||||
|
@ -975,15 +982,21 @@ nsBlockReflowState::RecoverStateFrom(nsLineBox* aLine,
|
||||||
printf(": WARNING: xmost:%d\n", xmost);
|
printf(": WARNING: xmost:%d\n", xmost);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*sec*/ //printf("%p RecoverState aState.mKidXMost=%d\n", this, xmost);
|
//printf("%p RecoverState block %p aState.mKidXMost=%d\n", this, mBlock, xmost);
|
||||||
mKidXMost = xmost;
|
mKidXMost = xmost;
|
||||||
}
|
}
|
||||||
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
if (GetFlag(BRS_COMPUTEMAXELEMENTSIZE)) {
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If computing the maximum width, then update mMaximumWidth
|
// If computing the maximum width, then update mMaximumWidth
|
||||||
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockReflowState::RecoverStateFrom block %p caching max width %d\n", mBlock, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
UpdateMaximumWidth(aLine->mMaximumWidth);
|
UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1944,13 +1957,14 @@ nsBlockFrame::Reflow(nsIPresContext* aPresContext,
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/*
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
if (aMetrics.maxElementSize) {
|
if (aMetrics.maxElementSize) {
|
||||||
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
printf("block %p returning with maxElementSize=%d,%d\n", this,
|
||||||
aMetrics.maxElementSize->width,
|
aMetrics.maxElementSize->width,
|
||||||
aMetrics.maxElementSize->height);
|
aMetrics.maxElementSize->height);
|
||||||
}
|
}
|
||||||
*/
|
#endif
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2075,12 +2089,16 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
if (nsnull != aMetrics.maxElementSize) {
|
||||||
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
aMetrics.maxElementSize->width = aState.mMaxElementSize.width;
|
||||||
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
aMetrics.maxElementSize->height = aState.mMaxElementSize.height;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p initially setting MES %d\n",
|
||||||
|
this, aState.mMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Compute final width
|
// Compute final width
|
||||||
nscoord maxWidth = 0, maxHeight = 0;
|
nscoord maxWidth = 0, maxHeight = 0;
|
||||||
/*SEC*///printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
nscoord minWidth = aState.mKidXMost + borderPadding.right;
|
||||||
if (!HaveAutoWidth(aReflowState)) {
|
if (!HaveAutoWidth(aReflowState)) {
|
||||||
// Use style defined width
|
// Use style defined width
|
||||||
|
@ -2134,7 +2152,9 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// When no-wrap is true the max-element-size.width is the
|
// When no-wrap is true the max-element-size.width is the
|
||||||
// width of the widest line plus the right border. Note that
|
// width of the widest line plus the right border. Note that
|
||||||
// aState.mKidXMost already has the left border factored in
|
// aState.mKidXMost already has the left border factored in
|
||||||
maxWidth = aState.mKidXMost + borderPadding.right;
|
//maxWidth = aState.mKidXMost + borderPadding.right;
|
||||||
|
maxWidth = aState.mMaxElementSize.width +
|
||||||
|
borderPadding.left + borderPadding.right;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add in border and padding dimensions to already computed
|
// Add in border and padding dimensions to already computed
|
||||||
|
@ -2266,6 +2286,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// Store away the final value
|
// Store away the final value
|
||||||
aMetrics.maxElementSize->width = maxWidth;
|
aMetrics.maxElementSize->width = maxWidth;
|
||||||
aMetrics.maxElementSize->height = maxHeight;
|
aMetrics.maxElementSize->height = maxHeight;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::CFS: %p returning MES %d\n",
|
||||||
|
this, aMetrics.maxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return bottom margin information
|
// Return bottom margin information
|
||||||
|
@ -2304,11 +2328,10 @@ nsBlockFrame::ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
||||||
// If we're requested to update our maximum width, then compute it
|
// If we're requested to update our maximum width, then compute it
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
// We need to add in for the right border/padding
|
// We need to add in for the right border/padding
|
||||||
// The line below should be completely unnecessary if max element sizes are
|
|
||||||
// computed correctly. But I found a case where this wasn't true.
|
|
||||||
// Still investigating, leaving the line in as a place holder
|
|
||||||
// XXX, should be unnecessary: aMetrics.mMaximumWidth = PR_MAX(aMetrics.mMaximumWidth, aMetrics.width);
|
|
||||||
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
aMetrics.mMaximumWidth = aState.mMaximumWidth + borderPadding.right;
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ComputeFinalSize block %p setting aMetrics.mMaximumWidth to %d\n", this, aMetrics.mMaximumWidth);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute the combined area of our children
|
// Compute the combined area of our children
|
||||||
|
@ -3168,6 +3191,10 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
// Update the line's maximum width
|
// Update the line's maximum width
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
// Remove any floaters associated with the line from the space
|
// Remove any floaters associated with the line from the space
|
||||||
|
@ -3181,7 +3208,7 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
// on this line the code to reflow the floater looks at both...
|
// on this line the code to reflow the floater looks at both...
|
||||||
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
nscoord oldComputeMaxElementSize = aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE);
|
||||||
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
nscoord oldComputeMaximumWidth = aState.GetFlag(BRS_COMPUTEMAXWIDTH);
|
||||||
|
|
||||||
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXELEMENTSIZE, PR_FALSE);
|
||||||
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
aState.SetFlag(BRS_COMPUTEMAXWIDTH, PR_FALSE);
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
@ -3190,6 +3217,25 @@ nsBlockFrame::ReflowLine(nsBlockReflowState& aState,
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
rv = ReflowInlineFrames(aState, aLine, aKeepReflowGoing, aDamageDirtyArea);
|
||||||
|
if (NS_SUCCEEDED(rv))
|
||||||
|
{
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
}
|
||||||
|
if (aState.GetFlag(BRS_COMPUTEMAXELEMENTSIZE))
|
||||||
|
{
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf("nsBlockFrame::ReflowLine block %p line %p setting aLine.mMaxElementWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaxElementWidth);
|
||||||
|
#endif
|
||||||
|
aState.UpdateMaxElementSize(nsSize(aLine->mMaxElementWidth, aLine->mBounds.height));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We don't really know what changed in the line, so use the union
|
// We don't really know what changed in the line, so use the union
|
||||||
|
@ -3936,6 +3982,10 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
|
||||||
// updated value in the line, and update the current maximum width
|
// updated value in the line, and update the current maximum width
|
||||||
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
if (aState.GetFlag(BRS_COMPUTEMAXWIDTH)) {
|
||||||
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
aLine->mMaximumWidth = brc.GetMaximumWidth();
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::ReflowBlockFrame parent block %p line %p setting aLine.mMaximumWidth to %d\n",
|
||||||
|
this, aLine, aLine->mMaximumWidth);
|
||||||
|
#endif
|
||||||
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
aState.UpdateMaximumWidth(aLine->mMaximumWidth);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4695,6 +4745,10 @@ nsBlockFrame::PlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = maxElementSize.width;
|
aLine->mMaxElementWidth = maxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PlaceLine: %p setting MES for line %p to %d\n",
|
||||||
|
this, aLine, maxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -4823,6 +4877,10 @@ nsBlockFrame::ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
||||||
aMaxElementSize->height = maxHeight;
|
aMaxElementSize->height = maxHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::ComputeLineMaxElementSize: %p returning MES %d\n",
|
||||||
|
this, aMaxElementSize->width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4846,12 +4904,20 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// We also cache the max element width in the line. This is needed for
|
// We also cache the max element width in the line. This is needed for
|
||||||
// incremental reflow
|
// incremental reflow
|
||||||
aLine->mMaxElementWidth = aMaxElementSize.width;
|
aLine->mMaxElementWidth = aMaxElementSize.width;
|
||||||
|
#ifdef NOISY_MAX_ELEMENT_SIZE
|
||||||
|
printf ("nsBlockFrame::PostPlaceLine: %p setting line %p MES %d\n",
|
||||||
|
this, aLine, aMaxElementSize.width);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this is an unconstrained reflow, then cache the line width in the
|
// If this is an unconstrained reflow, then cache the line width in the
|
||||||
// line. We'll need this during incremental reflow if we're asked to
|
// line. We'll need this during incremental reflow if we're asked to
|
||||||
// calculate the maximum width
|
// calculate the maximum width
|
||||||
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
if (aState.GetFlag(BRS_UNCONSTRAINEDWIDTH)) {
|
||||||
|
#ifdef NOISY_MAXIMUM_WIDTH
|
||||||
|
printf("nsBlockFrame::PostPlaceLine block %p line %p caching max width %d\n",
|
||||||
|
this, aLine, aLine->mBounds.XMost());
|
||||||
|
#endif
|
||||||
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
aLine->mMaximumWidth = aLine->mBounds.XMost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4867,11 +4933,11 @@ nsBlockFrame::PostPlaceLine(nsBlockReflowState& aState,
|
||||||
// then make sure we take up all of the available width
|
// then make sure we take up all of the available width
|
||||||
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
if (aState.GetFlag(BRS_SHRINKWRAPWIDTH) && aLine->IsLineWrapped()) {
|
||||||
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
aState.mKidXMost = aState.BorderPadding().left + aState.mContentArea.width;
|
||||||
/*sec*/ //printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine A aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
else if (xmost > aState.mKidXMost) {
|
else if (xmost > aState.mKidXMost) {
|
||||||
aState.mKidXMost = xmost;
|
aState.mKidXMost = xmost;
|
||||||
/*sec*/ //printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
//printf("%p PostPlaceLine B aState.mKidXMost=%d\n", this, aState.mKidXMost);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6340,7 +6406,7 @@ nsBlockFrame::HandleEvent(nsIPresContext* aPresContext,
|
||||||
nsCOMPtr<nsILineIterator> it;
|
nsCOMPtr<nsILineIterator> it;
|
||||||
nsIFrame *mainframe = this;
|
nsIFrame *mainframe = this;
|
||||||
nsCOMPtr<nsIFocusTracker> tracker;
|
nsCOMPtr<nsIFocusTracker> tracker;
|
||||||
aPresContext->GetShell(getter_AddRefs(shell));
|
aPresContext->GetShell(getter_AddRefs(shell));
|
||||||
if (!shell)
|
if (!shell)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
result = shell->QueryInterface(NS_GET_IID(nsIFocusTracker),getter_AddRefs(tracker));
|
||||||
|
|
Загрузка…
Ссылка в новой задаче