diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp index ef8b81d1e83d..378c6201bbf1 100644 --- a/layout/forms/nsComboboxControlFrame.cpp +++ b/layout/forms/nsComboboxControlFrame.cpp @@ -291,6 +291,7 @@ nsComboboxControlFrame::nsComboboxControlFrame() mCacheSize.width = kSizeNotSet; mCacheSize.height = kSizeNotSet; + mCachedAscent = kSizeNotSet; mCachedMaxElementSize.width = kSizeNotSet; mCachedMaxElementSize.height = kSizeNotSet; mCachedAvailableSize.width = kSizeNotSet; @@ -968,6 +969,7 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext, SetChildFrameSize(aDropDownBtn, aBtnWidth, aDesiredSize.height); aDesiredSize.width = 0; aDesiredSize.height = dispHeight; + // XXX What about ascent and descent? return; } @@ -1129,6 +1131,11 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext, aDesiredSize.maxElementSize->width = aDesiredSize.width; aDesiredSize.maxElementSize->height = aDesiredSize.height; } + + aDesiredSize.ascent = + txtKidSize.ascent + aReflowState.mComputedBorderPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; + // Now cache the available height as our height without border and padding // This sets up the optimization for if a new available width comes in and we are equal or // less than it we can bail @@ -1139,7 +1146,8 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext, if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) { mCachedAvailableSize.height = aDesiredSize.height - (aBorderPadding.top + aBorderPadding.bottom); } - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, + mCachedMaxElementSize, aDesiredSize); } /////////////////////////////////////////////////////////////////// @@ -1239,7 +1247,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // cached AvailableSize.width == aCacheSize.width // // NOTE: this returns whether we are doing an Incremental reflow - nsFormControlFrame::SkipResizeReflow(mCacheSize, + nsFormControlFrame::SkipResizeReflow(mCacheSize, + mCachedAscent, mCachedMaxElementSize, mCachedAvailableSize, aDesiredSize, aReflowState, @@ -1284,12 +1293,6 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, nsRect buttonRect; nsRect dropdownRect; - // get our border and padding, - // XXX - should be the same mComputedBorderPadding? - // maybe we should use that? - nsMargin borderPadding(0, 0, 0, 0); - CalcBorderPadding(borderPadding); - // Get the current sizes of the combo box child frames mDisplayFrame->GetRect(displayRect); mButtonFrame->GetRect(buttonRect); @@ -1340,7 +1343,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, REFLOW_DEBUG_MSG("------------Reflowing AreaFrame and bailing----\n\n"); ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus, mDisplayFrame, mButtonFrame, mItemDisplayWidth, - scrollbarWidth, borderPadding); + scrollbarWidth, aReflowState.mComputedBorderPadding); REFLOW_COUNTER(); UNCONSTRAINED_CHECK(); REFLOW_DEBUG_MSG3("&** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); @@ -1397,8 +1400,10 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, REFLOW_DEBUG_MSG("---- Doing AreaFrame Reflow and then bailing out\n"); // Do simple reflow and bail out ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus, - mDisplayFrame, mButtonFrame, - mItemDisplayWidth, scrollbarWidth, borderPadding, kSizeNotSet, PR_TRUE); + mDisplayFrame, mButtonFrame, + mItemDisplayWidth, scrollbarWidth, + aReflowState.mComputedBorderPadding, + kSizeNotSet, PR_TRUE); REFLOW_DEBUG_MSG3("+** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); REFLOW_COUNTER(); UNCONSTRAINED_CHECK(); @@ -1422,6 +1427,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, aDesiredSize.width = mCacheSize.width; aDesiredSize.height = mCacheSize.height; + aDesiredSize.ascent = mCachedAscent; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; if (aDesiredSize.maxElementSize != nsnull) { aDesiredSize.maxElementSize->width = mCachedMaxElementSize.width; @@ -1556,7 +1563,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // for the display area mDropdownFrame->GetRect(dropdownRect); if (eReflowReason_Resize == aReflowState.reason) { - dropdownRect.Deflate(borderPadding); + dropdownRect.Deflate(aReflowState.mComputedBorderPadding); } // Get maximum size of the largest item in the dropdown @@ -1627,7 +1634,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // this reflows and makes and last minute adjustments ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus, mDisplayFrame, mButtonFrame, mItemDisplayWidth, scrollbarWidth, - borderPadding, size.height); + aReflowState.mComputedBorderPadding, size.height); // The dropdown was reflowed UNCONSTRAINED before, now we need to check to see // if it needs to be resized. @@ -1703,13 +1710,17 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // this is so if our cached avilable size is ever equal to or less // than the real avilable size we can bail out if (aReflowState.availableWidth != NS_UNCONSTRAINEDSIZE) { - mCachedAvailableSize.width = aDesiredSize.width - (borderPadding.left + borderPadding.right); + mCachedAvailableSize.width = aDesiredSize.width - + (aReflowState.mComputedBorderPadding.left + + aReflowState.mComputedBorderPadding.right); } if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) { - mCachedAvailableSize.height = aDesiredSize.height - (borderPadding.top + borderPadding.bottom); + mCachedAvailableSize.height = aDesiredSize.height - + (aReflowState.mComputedBorderPadding.top + + aReflowState.mComputedBorderPadding.bottom); } - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize); REFLOW_DEBUG_MSG3("** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); REFLOW_COUNTER(); @@ -1951,7 +1962,10 @@ nsComboboxControlFrame::ActuallyDisplayText(nsAString& aText, PRBool aNotify) { nsresult rv = NS_OK; if (aText.IsEmpty()) { - nsAutoString space(PRUnichar(' ')); + // Have to use a non-breaking space for line-height calculations + // to be right + static const PRUnichar spaceArr[] = { 0xA0, 0x00 }; + nsDependentString space(spaceArr); rv = mDisplayContent->SetText(space.get(), space.Length(), aNotify); } else { const nsAFlatString& flat = PromiseFlatString(aText); diff --git a/layout/forms/nsComboboxControlFrame.h b/layout/forms/nsComboboxControlFrame.h index 911af4921da4..6c833a738ef2 100644 --- a/layout/forms/nsComboboxControlFrame.h +++ b/layout/forms/nsComboboxControlFrame.h @@ -281,6 +281,7 @@ protected: nsSize mCacheSize; nsSize mCachedMaxElementSize; nsSize mCachedAvailableSize; + nscoord mCachedAscent; nsSize mCachedUncDropdownSize; nsSize mCachedUncComboSize; diff --git a/layout/forms/nsFormControlFrame.cpp b/layout/forms/nsFormControlFrame.cpp index 7a6d3a233521..328f96d09e67 100644 --- a/layout/forms/nsFormControlFrame.cpp +++ b/layout/forms/nsFormControlFrame.cpp @@ -149,11 +149,13 @@ nsFormControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) } void nsFormControlFrame::SetupCachedSizes(nsSize& aCacheSize, - nsSize& aCachedMaxElementSize, - nsHTMLReflowMetrics& aDesiredSize) + nscoord& aCachedAscent, + nsSize& aCachedMaxElementSize, + nsHTMLReflowMetrics& aDesiredSize) { aCacheSize.width = aDesiredSize.width; aCacheSize.height = aDesiredSize.height; + aCachedAscent = aDesiredSize.ascent; if (aDesiredSize.maxElementSize != nsnull) { aCachedMaxElementSize.width = aDesiredSize.maxElementSize->width; aCachedMaxElementSize.height = aDesiredSize.maxElementSize->height; @@ -254,6 +256,7 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize, #else //------------------------------------------------------------ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize, + nscoord& aCachedAscent, nsSize& aCachedMaxElementSize, nsSize& aCachedAvailableSize, nsHTMLReflowMetrics& aDesiredSize, @@ -362,13 +365,13 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize, if (aBailOnWidth || aBailOnHeight) { aDesiredSize.width = aCacheSize.width; aDesiredSize.height = aCacheSize.height; + aDesiredSize.ascent = aCachedAscent; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; if (aDesiredSize.maxElementSize != nsnull) { aDesiredSize.maxElementSize->width = aCachedMaxElementSize.width; aDesiredSize.maxElementSize->height = aCachedMaxElementSize.height; } - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; } } } @@ -555,7 +558,7 @@ nsFormControlFrame::Reflow(nsIPresContext* aPresContext, nsresult rv = nsLeafFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); aStatus = NS_FRAME_COMPLETE; - SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize); NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); return rv; } diff --git a/layout/forms/nsFormControlFrame.h b/layout/forms/nsFormControlFrame.h index 3c8c47670efb..92ba316c0fbe 100644 --- a/layout/forms/nsFormControlFrame.h +++ b/layout/forms/nsFormControlFrame.h @@ -219,10 +219,12 @@ public: NS_IMETHOD GetProperty(nsIAtom* aName, nsAString& aValue); // Resize Reflow Optimiaztion Methods static void SetupCachedSizes(nsSize& aCacheSize, + nscoord& aCachedAscent, nsSize& aCachedMaxElementSize, nsHTMLReflowMetrics& aDesiredSize); static void SkipResizeReflow(nsSize& aCacheSize, + nscoord& aCachedAscent, nsSize& aCachedMaxElementSize, nsSize& aCachedAvailableSize, nsHTMLReflowMetrics& aDesiredSize, @@ -329,6 +331,7 @@ protected: // Reflow Optimization nsSize mCacheSize; + nscoord mCachedAscent; nsSize mCachedMaxElementSize; private: diff --git a/layout/forms/nsGfxButtonControlFrame.cpp b/layout/forms/nsGfxButtonControlFrame.cpp index c10527ed5447..6642962df823 100644 --- a/layout/forms/nsGfxButtonControlFrame.cpp +++ b/layout/forms/nsGfxButtonControlFrame.cpp @@ -171,163 +171,6 @@ nsGfxButtonControlFrame::AddComputedBorderPaddingToDesiredSize(nsHTMLReflowMetri return NS_OK; } -nsresult -nsGfxButtonControlFrame::DoNavQuirksReflow(nsIPresContext* aPresContext, - nsHTMLReflowMetrics& aDesiredSize, - const nsHTMLReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - nsIFrame* firstKid = mFrames.FirstChild(); - - nsCOMPtr fontMet; - nsresult res = nsFormControlHelper::GetFrameFontFM(aPresContext, (nsIFormControlFrame *)this, getter_AddRefs(fontMet)); - nsSize desiredSize; - if (NS_SUCCEEDED(res) && fontMet) { - aReflowState.rendContext->SetFont(fontMet); - - // Get the text from the "value" attribute - // for measuring the height, width of the text - nsAutoString value; - res = GetValue(&value); - - if (res != NS_CONTENT_ATTR_HAS_VALUE && value.IsEmpty()) { - // Generate localized label. - // We can't make any assumption as to what the default would be - // because the value is localized for non-english platforms, thus - // it might not be the string "Reset", "Submit Query", or "Browse..." - res = GetDefaultLabel(value); - if (NS_FAILED(res)) { - return res; - } - } - - const nsStyleText* textStyle; - GetStyleData(eStyleStruct_Text, (const nsStyleStruct *&)textStyle); - if (!textStyle->WhiteSpaceIsSignificant()) { - value.CompressWhitespace(); - } - - if (value.IsEmpty()) { - // Have to have _something_ or we won't be drawn - value.Assign(NS_LITERAL_STRING(" ")); - } - - CalcNavQuirkSizing(aPresContext, aReflowState.rendContext, value, - desiredSize); - - // Note: The Quirks sizing includes a 2px border in its calculation of "desiredSize" - // So we must subtract off the 2 pixel border. - // Quirk sizing also assumes a 0px padding - float p2t; - aPresContext->GetPixelsToTwips(&p2t); - nscoord borderTwips = NSIntPixelsToTwips(4, p2t); - desiredSize.width -= borderTwips; - desiredSize.height -= borderTwips; - - // Now figure out how much vertical padding was added and - // then subtract it, so we can add in the padding later - // horizontal pading is 0px; - nscoord hgt; - fontMet->GetHeight(hgt); - desiredSize.height -= PR_MAX(0, desiredSize.height - hgt); - - // This calculates the reflow size - // get the css size and let the frame use or override it - nsSize styleSize; - nsFormControlFrame::GetStyleSize(aPresContext, aReflowState, styleSize); - - if (CSS_NOTSET != styleSize.width) { // css provides width - NS_ASSERTION(styleSize.width+aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right >= 0, "form control's computed width is < 0"); - if (NS_INTRINSICSIZE != styleSize.width) { - desiredSize.width = styleSize.width; - desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right; - } - } else { - desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right; - } - - if (CSS_NOTSET != styleSize.height) { // css provides height - NS_ASSERTION(styleSize.height > 0, "form control's computed height is <= 0"); - if (NS_INTRINSICSIZE != styleSize.height) { - desiredSize.height = styleSize.height; - desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom; - } - } else { - desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom; - } - - aDesiredSize.width = desiredSize.width; - aDesiredSize.height = desiredSize.height; - } else { - // XXX ASSERT HERE - desiredSize.width = 0; - desiredSize.height = 0; - } - - // remove it from the the desired size - // because the content need to fit inside of it - desiredSize.width -= (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right); - desiredSize.height -= (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom); - - // Ok, now we think we know what size we are so we can reflow our contents - // But we need to make sure we aren't smaller or larger then the min/max - if (desiredSize.width < aReflowState.mComputedMinWidth) { - desiredSize.width = aReflowState.mComputedMinWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right); - } else if (desiredSize.width > aReflowState.mComputedMaxWidth) { - desiredSize.width = aReflowState.mComputedMaxWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right); - } - - if (desiredSize.height < aReflowState.mComputedMinHeight) { - desiredSize.height = aReflowState.mComputedMinHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom); - } else if (desiredSize.height > aReflowState.mComputedMaxHeight) { - desiredSize.height = aReflowState.mComputedMaxHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom); - } - - // XXX Proper handling of incremental reflow... - nsReflowReason reason = aReflowState.reason; - if (eReflowReason_Incremental == reason) { - // See if it's targeted at us - nsHTMLReflowCommand *command = aReflowState.path->mReflowCommand; - - if (command) { - Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE); - - nsReflowType reflowType; - command->GetType(reflowType); - if (eReflowType_StyleChanged == reflowType) { - reason = eReflowReason_StyleChange; - } - else { - reason = eReflowReason_Resize; - } - } - } - - // now reflow the first child (generated content) - nsHTMLReflowState reflowState(aPresContext, aReflowState, firstKid, desiredSize, reason); - reflowState.mComputedWidth = desiredSize.width; - reflowState.mComputedHeight = desiredSize.height; - - nsHTMLReflowMetrics childReflowMetrics(aDesiredSize); - nsRect kidRect; - firstKid->GetRect(kidRect); - ReflowChild(firstKid, aPresContext, childReflowMetrics, reflowState, kidRect.x, kidRect.y, 0, aStatus); - - aDesiredSize.ascent = childReflowMetrics.ascent + - aReflowState.mComputedBorderPadding.top; - aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; - - // Center the child and add back in the border and badding - // our inner area frame is already doing centering so we only need to center vertically. - nsRect rect = nsRect(aReflowState.mComputedBorderPadding.left, - aReflowState.mComputedBorderPadding.top, - desiredSize.width, - desiredSize.height); - firstKid->SetRect(aPresContext, rect); - - return NS_OK; -} - // Create the text content used as label for the button. // The frame will be generated by the frame constructor. NS_IMETHODIMP @@ -359,11 +202,6 @@ nsGfxButtonControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext, value.CompressWhitespace(); } - if (value.IsEmpty()) { - // Have to have _something_ or we won't be drawn - value.Assign(NS_LITERAL_STRING(" ")); - } - // Add a child text content node for the label nsCOMPtr labelContent(do_CreateInstance(kTextNodeCID,&result)); if (NS_SUCCEEDED(result) && labelContent) { @@ -475,7 +313,7 @@ nsGfxButtonControlFrame::GetDefaultLabel(nsString& aString) rv = nsFormControlHelper::GetLocalizedString(propname, NS_LITERAL_STRING("Browse").get(), aString); } else { - aString.Assign(NS_LITERAL_STRING(" ")); + aString.Assign(NS_LITERAL_STRING("")); rv = NS_OK; } return rv; @@ -519,17 +357,6 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext, DO_GLOBAL_REFLOW_COUNT("nsGfxButtonControlFrame", aReflowState.reason); DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus); - nsresult rv = NS_OK; - -#if 0 - nsresult skiprv = nsFormControlFrame::SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext, - aDesiredSize, aReflowState, aStatus); - - if (NS_SUCCEEDED(skiprv)) { - return skiprv; - } -#endif - if ((kSuggestedNotSet != mSuggestedWidth) || (kSuggestedNotSet != mSuggestedHeight)) { nsHTMLReflowState suggestedReflowState(aReflowState); @@ -543,76 +370,13 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext, suggestedReflowState.mComputedHeight = mSuggestedHeight; } - rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus); + return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus); - } else { // Normal reflow. - -#if 1 - // nsHTMLButtonControlFrame::Reflow registers it for Standard Mode - // and sets up mPresContext - if (eReflowReason_Initial == aReflowState.reason) { - nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE); - } - // Do NavQuirks Sizing and layout - rv = DoNavQuirksReflow(aPresContext, aDesiredSize, aReflowState, aStatus); - - // Make sure we obey min/max-width and min/max-height - if (aDesiredSize.width > aReflowState.mComputedMaxWidth) { - aDesiredSize.width = aReflowState.mComputedMaxWidth; - } - if (aDesiredSize.width < aReflowState.mComputedMinWidth) { - aDesiredSize.width = aReflowState.mComputedMinWidth; - } - - if (aDesiredSize.height > aReflowState.mComputedMaxHeight) { - aDesiredSize.height = aReflowState.mComputedMaxHeight; - } - if (aDesiredSize.height < aReflowState.mComputedMinHeight) { - aDesiredSize.height = aReflowState.mComputedMinHeight; - } -#else - // Do Standard mode sizing and layout - rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); -#endif } + + // Normal reflow. -#ifdef DEBUG_rodsXXXX - COMPARE_QUIRK_SIZE("nsGfxButtonControlFrame", 84, 24) // with the text "Press Me" in it -#endif - aStatus = NS_FRAME_COMPLETE; - - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); - - if (aDesiredSize.maxElementSize != nsnull) { - aDesiredSize.maxElementSize->width = aDesiredSize.width; - aDesiredSize.maxElementSize->height = aDesiredSize.height; - } - - NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); - return rv; -} - -void -nsGfxButtonControlFrame::CalcNavQuirkSizing(nsIPresContext* aPresContext, - nsIRenderingContext* aRendContext, - nsString& aLabel, - nsSize& aSize) -{ - float p2t; - float t2p; - aPresContext->GetPixelsToTwips(&p2t); - aPresContext->GetTwipsToPixels(&t2p); - - // Get text size, round to nearest pixel, multiply by 3/2 - // XXX this algorithm seems suspect: rounding before multiply can't be good, - // and 3/2 seems ... arbitrary - nsFormControlHelper::GetTextSize(aPresContext, this, - aLabel, aSize, - aRendContext); - aSize.width = NSToCoordRound(aSize.width * t2p); - aSize.height = NSToCoordRound(aSize.height * t2p); - aSize.width = NSIntPixelsToTwips(3 * aSize.width / 2, p2t); - aSize.height = NSIntPixelsToTwips(3 * aSize.height / 2, p2t); + return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); } NS_IMETHODIMP diff --git a/layout/forms/nsHTMLButtonControlFrame.cpp b/layout/forms/nsHTMLButtonControlFrame.cpp index 9171a0fcf1d7..307c7b74589b 100644 --- a/layout/forms/nsHTMLButtonControlFrame.cpp +++ b/layout/forms/nsHTMLButtonControlFrame.cpp @@ -410,6 +410,7 @@ nsHTMLButtonControlFrame::Paint(nsIPresContext* aPresContext, static void ButtonHack(nsHTMLReflowState& aReflowState, const char* aMessage) { + // XXXbz is this still relevant? if (aReflowState.mComputedWidth == 0) { aReflowState.mComputedWidth = aReflowState.availableWidth; } @@ -551,7 +552,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, focusPadding.left + aReflowState.mComputedBorderPadding.left, focusPadding.top + aReflowState.mComputedBorderPadding.top, 0, aStatus); - + // calculate the min internal size so the contents gets centered correctly // minInternalWidth is not being used at all and causes a warning--commenting // out until someone wants it. @@ -573,7 +574,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, // Place the child FinishReflowChild(firstKid, aPresContext, &reflowState, aDesiredSize, - focusPadding.left + aReflowState.mComputedBorderPadding.right, + focusPadding.left + aReflowState.mComputedBorderPadding.left, yoff + focusPadding.top + aReflowState.mComputedBorderPadding.top, 0); #if 0 // old way @@ -602,6 +603,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, #endif AddComputedBorderPaddingToDesiredSize(aDesiredSize, aReflowState); + //aDesiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right; //aDesiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom; @@ -612,9 +614,6 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, } #endif - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; - if (nsnull != aDesiredSize.maxElementSize) { aDesiredSize.maxElementSize->width = aDesiredSize.width; aDesiredSize.maxElementSize->height = aDesiredSize.height; @@ -633,10 +632,15 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, } if (aDesiredSize.height < aReflowState.mComputedMinHeight) { aDesiredSize.height = aReflowState.mComputedMinHeight; - } + } + + aDesiredSize.ascent += aReflowState.mComputedBorderPadding.top + focusPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; + aStatus = NS_FRAME_COMPLETE; - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, + mCachedMaxElementSize, aDesiredSize); NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); return NS_OK; } diff --git a/layout/forms/nsHTMLButtonControlFrame.h b/layout/forms/nsHTMLButtonControlFrame.h index 96a5e94e9f56..73516e059cee 100644 --- a/layout/forms/nsHTMLButtonControlFrame.h +++ b/layout/forms/nsHTMLButtonControlFrame.h @@ -170,6 +170,7 @@ protected: //Resize Reflow OpitmizationSize; nsSize mCacheSize; + nscoord mCachedAscent; nsSize mCachedMaxElementSize; }; diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index bbf0d658bd7f..5a68d41f6433 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -837,7 +837,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, // so we can check timings against the old version #if 1 - nsFormControlFrame::SkipResizeReflow(mCacheSize, + nsFormControlFrame::SkipResizeReflow(mCacheSize, + mCachedAscent, mCachedMaxElementSize, mCachedAvailableSize, aDesiredSize, aReflowState, @@ -999,6 +1000,7 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, } mCachedUnconstrainedSize.width = scrolledAreaDesiredSize.width; mCachedUnconstrainedSize.height = scrolledAreaDesiredSize.height; + mCachedAscent = scrolledAreaDesiredSize.ascent; mCachedDesiredMaxSize.width = scrolledAreaDesiredSize.maxElementSize->width; mCachedDesiredMaxSize.height = scrolledAreaDesiredSize.maxElementSize->height; } else { @@ -1280,8 +1282,9 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, } else { aDesiredSize.width = visibleWidth; aDesiredSize.height = visibleHeight; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; + aDesiredSize.ascent = + scrolledAreaDesiredSize.ascent + aReflowState.mComputedBorderPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; } if (nsnull != aDesiredSize.maxElementSize) { @@ -1319,7 +1322,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, //REFLOW_DEBUG_MSG3("** nsLCF Caching AW: %d AH: %d\n", PX(mCachedAvailableSize.width), PX(mCachedAvailableSize.height)); - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, + mCachedMaxElementSize, aDesiredSize); REFLOW_DEBUG_MSG3("** Done nsLCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); diff --git a/layout/forms/nsListControlFrame.h b/layout/forms/nsListControlFrame.h index d1035094c8cf..5af52a335144 100644 --- a/layout/forms/nsListControlFrame.h +++ b/layout/forms/nsListControlFrame.h @@ -423,6 +423,7 @@ protected: //Resize Reflow OpitmizationSize; nsSize mCacheSize; + nscoord mCachedAscent; nsSize mCachedMaxElementSize; nsSize mCachedUnconstrainedSize; nsSize mCachedAvailableSize; diff --git a/layout/html/base/src/nsScrollFrame.cpp b/layout/html/base/src/nsScrollFrame.cpp index a89987a1a943..004657f930ea 100644 --- a/layout/html/base/src/nsScrollFrame.cpp +++ b/layout/html/base/src/nsScrollFrame.cpp @@ -955,8 +955,9 @@ nsScrollFrame::Reflow(nsIPresContext* aPresContext, aDesiredSize.maxElementSize->height = maxHeight; } - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; + aDesiredSize.ascent = + kidDesiredSize.ascent + aReflowState.mComputedBorderPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; NS_FRAME_TRACE_MSG(NS_FRAME_TRACE_CALLS, ("exit nsScrollFrame::Reflow: status=%d width=%d height=%d", diff --git a/layout/html/document/src/forms.css b/layout/html/document/src/forms.css index 2d544b287c62..b4d98bbd609b 100644 --- a/layout/html/document/src/forms.css +++ b/layout/html/document/src/forms.css @@ -74,6 +74,9 @@ label { /* default inputs, text inputs, and selects */ input { -moz-appearance: textfield; + /* The sum of border-top, border-bottom, padding-top, padding-bottom + must be the same here, for buttons, and for . For + buttons, make sure to include the -moz-focus-inner border/padding. */ + padding: 0px 8px 0px 8px; border: 2px outset ButtonFace; background-color: ButtonFace; color: ButtonText; font: -moz-button; line-height: normal !important; white-space: pre; - vertical-align: text-bottom; cursor: default; -moz-box-sizing: border-box; -moz-user-select: none; @@ -407,15 +411,16 @@ button:active:hover, input[type="reset"]:active:hover, input[type="button"]:active:hover, input[type="submit"]:active:hover { - padding: 3px 0 1px 0; + padding: 0px 7px 0px 9px; border-style: inset; } button:-moz-focus-inner, input[type="reset"]:-moz-focus-inner, input[type="button"]:-moz-focus-inner, -input[type="submit"]:-moz-focus-inner { - padding: 1px 2px 1px 2px; +input[type="submit"]:-moz-focus-inner, +input[type="file"] > input[type="button"]:-moz-focus-inner { + padding: 0px 2px 0px 2px; border: 1px dotted transparent; } @@ -436,7 +441,9 @@ select[disabled] > input[type="button"], select[disabled] > input[type="button"]:active, input[type="submit"][disabled]:active, input[type="submit"][disabled] { - padding: 3px 1px 3px 1px; + /* The sum of border-top, border-bottom, padding-top, padding-bottom + must be the same here and for text inputs */ + padding: 1px 8px 1px 8px; border: 1px outset ButtonShadow; color: GrayText; } diff --git a/layout/html/forms/src/nsComboboxControlFrame.cpp b/layout/html/forms/src/nsComboboxControlFrame.cpp index ef8b81d1e83d..378c6201bbf1 100644 --- a/layout/html/forms/src/nsComboboxControlFrame.cpp +++ b/layout/html/forms/src/nsComboboxControlFrame.cpp @@ -291,6 +291,7 @@ nsComboboxControlFrame::nsComboboxControlFrame() mCacheSize.width = kSizeNotSet; mCacheSize.height = kSizeNotSet; + mCachedAscent = kSizeNotSet; mCachedMaxElementSize.width = kSizeNotSet; mCachedMaxElementSize.height = kSizeNotSet; mCachedAvailableSize.width = kSizeNotSet; @@ -968,6 +969,7 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext, SetChildFrameSize(aDropDownBtn, aBtnWidth, aDesiredSize.height); aDesiredSize.width = 0; aDesiredSize.height = dispHeight; + // XXX What about ascent and descent? return; } @@ -1129,6 +1131,11 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext, aDesiredSize.maxElementSize->width = aDesiredSize.width; aDesiredSize.maxElementSize->height = aDesiredSize.height; } + + aDesiredSize.ascent = + txtKidSize.ascent + aReflowState.mComputedBorderPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; + // Now cache the available height as our height without border and padding // This sets up the optimization for if a new available width comes in and we are equal or // less than it we can bail @@ -1139,7 +1146,8 @@ nsComboboxControlFrame::ReflowCombobox(nsIPresContext * aPresContext, if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) { mCachedAvailableSize.height = aDesiredSize.height - (aBorderPadding.top + aBorderPadding.bottom); } - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, + mCachedMaxElementSize, aDesiredSize); } /////////////////////////////////////////////////////////////////// @@ -1239,7 +1247,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // cached AvailableSize.width == aCacheSize.width // // NOTE: this returns whether we are doing an Incremental reflow - nsFormControlFrame::SkipResizeReflow(mCacheSize, + nsFormControlFrame::SkipResizeReflow(mCacheSize, + mCachedAscent, mCachedMaxElementSize, mCachedAvailableSize, aDesiredSize, aReflowState, @@ -1284,12 +1293,6 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, nsRect buttonRect; nsRect dropdownRect; - // get our border and padding, - // XXX - should be the same mComputedBorderPadding? - // maybe we should use that? - nsMargin borderPadding(0, 0, 0, 0); - CalcBorderPadding(borderPadding); - // Get the current sizes of the combo box child frames mDisplayFrame->GetRect(displayRect); mButtonFrame->GetRect(buttonRect); @@ -1340,7 +1343,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, REFLOW_DEBUG_MSG("------------Reflowing AreaFrame and bailing----\n\n"); ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus, mDisplayFrame, mButtonFrame, mItemDisplayWidth, - scrollbarWidth, borderPadding); + scrollbarWidth, aReflowState.mComputedBorderPadding); REFLOW_COUNTER(); UNCONSTRAINED_CHECK(); REFLOW_DEBUG_MSG3("&** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); @@ -1397,8 +1400,10 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, REFLOW_DEBUG_MSG("---- Doing AreaFrame Reflow and then bailing out\n"); // Do simple reflow and bail out ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus, - mDisplayFrame, mButtonFrame, - mItemDisplayWidth, scrollbarWidth, borderPadding, kSizeNotSet, PR_TRUE); + mDisplayFrame, mButtonFrame, + mItemDisplayWidth, scrollbarWidth, + aReflowState.mComputedBorderPadding, + kSizeNotSet, PR_TRUE); REFLOW_DEBUG_MSG3("+** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); REFLOW_COUNTER(); UNCONSTRAINED_CHECK(); @@ -1422,6 +1427,8 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, aDesiredSize.width = mCacheSize.width; aDesiredSize.height = mCacheSize.height; + aDesiredSize.ascent = mCachedAscent; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; if (aDesiredSize.maxElementSize != nsnull) { aDesiredSize.maxElementSize->width = mCachedMaxElementSize.width; @@ -1556,7 +1563,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // for the display area mDropdownFrame->GetRect(dropdownRect); if (eReflowReason_Resize == aReflowState.reason) { - dropdownRect.Deflate(borderPadding); + dropdownRect.Deflate(aReflowState.mComputedBorderPadding); } // Get maximum size of the largest item in the dropdown @@ -1627,7 +1634,7 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // this reflows and makes and last minute adjustments ReflowCombobox(aPresContext, firstPassState, aDesiredSize, aStatus, mDisplayFrame, mButtonFrame, mItemDisplayWidth, scrollbarWidth, - borderPadding, size.height); + aReflowState.mComputedBorderPadding, size.height); // The dropdown was reflowed UNCONSTRAINED before, now we need to check to see // if it needs to be resized. @@ -1703,13 +1710,17 @@ nsComboboxControlFrame::Reflow(nsIPresContext* aPresContext, // this is so if our cached avilable size is ever equal to or less // than the real avilable size we can bail out if (aReflowState.availableWidth != NS_UNCONSTRAINEDSIZE) { - mCachedAvailableSize.width = aDesiredSize.width - (borderPadding.left + borderPadding.right); + mCachedAvailableSize.width = aDesiredSize.width - + (aReflowState.mComputedBorderPadding.left + + aReflowState.mComputedBorderPadding.right); } if (aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE) { - mCachedAvailableSize.height = aDesiredSize.height - (borderPadding.top + borderPadding.bottom); + mCachedAvailableSize.height = aDesiredSize.height - + (aReflowState.mComputedBorderPadding.top + + aReflowState.mComputedBorderPadding.bottom); } - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize); REFLOW_DEBUG_MSG3("** Done nsCCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); REFLOW_COUNTER(); @@ -1951,7 +1962,10 @@ nsComboboxControlFrame::ActuallyDisplayText(nsAString& aText, PRBool aNotify) { nsresult rv = NS_OK; if (aText.IsEmpty()) { - nsAutoString space(PRUnichar(' ')); + // Have to use a non-breaking space for line-height calculations + // to be right + static const PRUnichar spaceArr[] = { 0xA0, 0x00 }; + nsDependentString space(spaceArr); rv = mDisplayContent->SetText(space.get(), space.Length(), aNotify); } else { const nsAFlatString& flat = PromiseFlatString(aText); diff --git a/layout/html/forms/src/nsComboboxControlFrame.h b/layout/html/forms/src/nsComboboxControlFrame.h index 911af4921da4..6c833a738ef2 100644 --- a/layout/html/forms/src/nsComboboxControlFrame.h +++ b/layout/html/forms/src/nsComboboxControlFrame.h @@ -281,6 +281,7 @@ protected: nsSize mCacheSize; nsSize mCachedMaxElementSize; nsSize mCachedAvailableSize; + nscoord mCachedAscent; nsSize mCachedUncDropdownSize; nsSize mCachedUncComboSize; diff --git a/layout/html/forms/src/nsFormControlFrame.cpp b/layout/html/forms/src/nsFormControlFrame.cpp index 7a6d3a233521..328f96d09e67 100644 --- a/layout/html/forms/src/nsFormControlFrame.cpp +++ b/layout/html/forms/src/nsFormControlFrame.cpp @@ -149,11 +149,13 @@ nsFormControlFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr) } void nsFormControlFrame::SetupCachedSizes(nsSize& aCacheSize, - nsSize& aCachedMaxElementSize, - nsHTMLReflowMetrics& aDesiredSize) + nscoord& aCachedAscent, + nsSize& aCachedMaxElementSize, + nsHTMLReflowMetrics& aDesiredSize) { aCacheSize.width = aDesiredSize.width; aCacheSize.height = aDesiredSize.height; + aCachedAscent = aDesiredSize.ascent; if (aDesiredSize.maxElementSize != nsnull) { aCachedMaxElementSize.width = aDesiredSize.maxElementSize->width; aCachedMaxElementSize.height = aDesiredSize.maxElementSize->height; @@ -254,6 +256,7 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize, #else //------------------------------------------------------------ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize, + nscoord& aCachedAscent, nsSize& aCachedMaxElementSize, nsSize& aCachedAvailableSize, nsHTMLReflowMetrics& aDesiredSize, @@ -362,13 +365,13 @@ void nsFormControlFrame::SkipResizeReflow(nsSize& aCacheSize, if (aBailOnWidth || aBailOnHeight) { aDesiredSize.width = aCacheSize.width; aDesiredSize.height = aCacheSize.height; + aDesiredSize.ascent = aCachedAscent; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; if (aDesiredSize.maxElementSize != nsnull) { aDesiredSize.maxElementSize->width = aCachedMaxElementSize.width; aDesiredSize.maxElementSize->height = aCachedMaxElementSize.height; } - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; } } } @@ -555,7 +558,7 @@ nsFormControlFrame::Reflow(nsIPresContext* aPresContext, nsresult rv = nsLeafFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); aStatus = NS_FRAME_COMPLETE; - SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + SetupCachedSizes(mCacheSize, mCachedAscent, mCachedMaxElementSize, aDesiredSize); NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); return rv; } diff --git a/layout/html/forms/src/nsFormControlFrame.h b/layout/html/forms/src/nsFormControlFrame.h index 3c8c47670efb..92ba316c0fbe 100644 --- a/layout/html/forms/src/nsFormControlFrame.h +++ b/layout/html/forms/src/nsFormControlFrame.h @@ -219,10 +219,12 @@ public: NS_IMETHOD GetProperty(nsIAtom* aName, nsAString& aValue); // Resize Reflow Optimiaztion Methods static void SetupCachedSizes(nsSize& aCacheSize, + nscoord& aCachedAscent, nsSize& aCachedMaxElementSize, nsHTMLReflowMetrics& aDesiredSize); static void SkipResizeReflow(nsSize& aCacheSize, + nscoord& aCachedAscent, nsSize& aCachedMaxElementSize, nsSize& aCachedAvailableSize, nsHTMLReflowMetrics& aDesiredSize, @@ -329,6 +331,7 @@ protected: // Reflow Optimization nsSize mCacheSize; + nscoord mCachedAscent; nsSize mCachedMaxElementSize; private: diff --git a/layout/html/forms/src/nsGfxButtonControlFrame.cpp b/layout/html/forms/src/nsGfxButtonControlFrame.cpp index c10527ed5447..6642962df823 100644 --- a/layout/html/forms/src/nsGfxButtonControlFrame.cpp +++ b/layout/html/forms/src/nsGfxButtonControlFrame.cpp @@ -171,163 +171,6 @@ nsGfxButtonControlFrame::AddComputedBorderPaddingToDesiredSize(nsHTMLReflowMetri return NS_OK; } -nsresult -nsGfxButtonControlFrame::DoNavQuirksReflow(nsIPresContext* aPresContext, - nsHTMLReflowMetrics& aDesiredSize, - const nsHTMLReflowState& aReflowState, - nsReflowStatus& aStatus) -{ - nsIFrame* firstKid = mFrames.FirstChild(); - - nsCOMPtr fontMet; - nsresult res = nsFormControlHelper::GetFrameFontFM(aPresContext, (nsIFormControlFrame *)this, getter_AddRefs(fontMet)); - nsSize desiredSize; - if (NS_SUCCEEDED(res) && fontMet) { - aReflowState.rendContext->SetFont(fontMet); - - // Get the text from the "value" attribute - // for measuring the height, width of the text - nsAutoString value; - res = GetValue(&value); - - if (res != NS_CONTENT_ATTR_HAS_VALUE && value.IsEmpty()) { - // Generate localized label. - // We can't make any assumption as to what the default would be - // because the value is localized for non-english platforms, thus - // it might not be the string "Reset", "Submit Query", or "Browse..." - res = GetDefaultLabel(value); - if (NS_FAILED(res)) { - return res; - } - } - - const nsStyleText* textStyle; - GetStyleData(eStyleStruct_Text, (const nsStyleStruct *&)textStyle); - if (!textStyle->WhiteSpaceIsSignificant()) { - value.CompressWhitespace(); - } - - if (value.IsEmpty()) { - // Have to have _something_ or we won't be drawn - value.Assign(NS_LITERAL_STRING(" ")); - } - - CalcNavQuirkSizing(aPresContext, aReflowState.rendContext, value, - desiredSize); - - // Note: The Quirks sizing includes a 2px border in its calculation of "desiredSize" - // So we must subtract off the 2 pixel border. - // Quirk sizing also assumes a 0px padding - float p2t; - aPresContext->GetPixelsToTwips(&p2t); - nscoord borderTwips = NSIntPixelsToTwips(4, p2t); - desiredSize.width -= borderTwips; - desiredSize.height -= borderTwips; - - // Now figure out how much vertical padding was added and - // then subtract it, so we can add in the padding later - // horizontal pading is 0px; - nscoord hgt; - fontMet->GetHeight(hgt); - desiredSize.height -= PR_MAX(0, desiredSize.height - hgt); - - // This calculates the reflow size - // get the css size and let the frame use or override it - nsSize styleSize; - nsFormControlFrame::GetStyleSize(aPresContext, aReflowState, styleSize); - - if (CSS_NOTSET != styleSize.width) { // css provides width - NS_ASSERTION(styleSize.width+aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right >= 0, "form control's computed width is < 0"); - if (NS_INTRINSICSIZE != styleSize.width) { - desiredSize.width = styleSize.width; - desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right; - } - } else { - desiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right; - } - - if (CSS_NOTSET != styleSize.height) { // css provides height - NS_ASSERTION(styleSize.height > 0, "form control's computed height is <= 0"); - if (NS_INTRINSICSIZE != styleSize.height) { - desiredSize.height = styleSize.height; - desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom; - } - } else { - desiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom; - } - - aDesiredSize.width = desiredSize.width; - aDesiredSize.height = desiredSize.height; - } else { - // XXX ASSERT HERE - desiredSize.width = 0; - desiredSize.height = 0; - } - - // remove it from the the desired size - // because the content need to fit inside of it - desiredSize.width -= (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right); - desiredSize.height -= (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom); - - // Ok, now we think we know what size we are so we can reflow our contents - // But we need to make sure we aren't smaller or larger then the min/max - if (desiredSize.width < aReflowState.mComputedMinWidth) { - desiredSize.width = aReflowState.mComputedMinWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right); - } else if (desiredSize.width > aReflowState.mComputedMaxWidth) { - desiredSize.width = aReflowState.mComputedMaxWidth - (aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right); - } - - if (desiredSize.height < aReflowState.mComputedMinHeight) { - desiredSize.height = aReflowState.mComputedMinHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom); - } else if (desiredSize.height > aReflowState.mComputedMaxHeight) { - desiredSize.height = aReflowState.mComputedMaxHeight - (aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom); - } - - // XXX Proper handling of incremental reflow... - nsReflowReason reason = aReflowState.reason; - if (eReflowReason_Incremental == reason) { - // See if it's targeted at us - nsHTMLReflowCommand *command = aReflowState.path->mReflowCommand; - - if (command) { - Invalidate(aPresContext, nsRect(0,0,mRect.width,mRect.height), PR_FALSE); - - nsReflowType reflowType; - command->GetType(reflowType); - if (eReflowType_StyleChanged == reflowType) { - reason = eReflowReason_StyleChange; - } - else { - reason = eReflowReason_Resize; - } - } - } - - // now reflow the first child (generated content) - nsHTMLReflowState reflowState(aPresContext, aReflowState, firstKid, desiredSize, reason); - reflowState.mComputedWidth = desiredSize.width; - reflowState.mComputedHeight = desiredSize.height; - - nsHTMLReflowMetrics childReflowMetrics(aDesiredSize); - nsRect kidRect; - firstKid->GetRect(kidRect); - ReflowChild(firstKid, aPresContext, childReflowMetrics, reflowState, kidRect.x, kidRect.y, 0, aStatus); - - aDesiredSize.ascent = childReflowMetrics.ascent + - aReflowState.mComputedBorderPadding.top; - aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; - - // Center the child and add back in the border and badding - // our inner area frame is already doing centering so we only need to center vertically. - nsRect rect = nsRect(aReflowState.mComputedBorderPadding.left, - aReflowState.mComputedBorderPadding.top, - desiredSize.width, - desiredSize.height); - firstKid->SetRect(aPresContext, rect); - - return NS_OK; -} - // Create the text content used as label for the button. // The frame will be generated by the frame constructor. NS_IMETHODIMP @@ -359,11 +202,6 @@ nsGfxButtonControlFrame::CreateAnonymousContent(nsIPresContext* aPresContext, value.CompressWhitespace(); } - if (value.IsEmpty()) { - // Have to have _something_ or we won't be drawn - value.Assign(NS_LITERAL_STRING(" ")); - } - // Add a child text content node for the label nsCOMPtr labelContent(do_CreateInstance(kTextNodeCID,&result)); if (NS_SUCCEEDED(result) && labelContent) { @@ -475,7 +313,7 @@ nsGfxButtonControlFrame::GetDefaultLabel(nsString& aString) rv = nsFormControlHelper::GetLocalizedString(propname, NS_LITERAL_STRING("Browse").get(), aString); } else { - aString.Assign(NS_LITERAL_STRING(" ")); + aString.Assign(NS_LITERAL_STRING("")); rv = NS_OK; } return rv; @@ -519,17 +357,6 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext, DO_GLOBAL_REFLOW_COUNT("nsGfxButtonControlFrame", aReflowState.reason); DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus); - nsresult rv = NS_OK; - -#if 0 - nsresult skiprv = nsFormControlFrame::SkipResizeReflow(mCacheSize, mCachedMaxElementSize, aPresContext, - aDesiredSize, aReflowState, aStatus); - - if (NS_SUCCEEDED(skiprv)) { - return skiprv; - } -#endif - if ((kSuggestedNotSet != mSuggestedWidth) || (kSuggestedNotSet != mSuggestedHeight)) { nsHTMLReflowState suggestedReflowState(aReflowState); @@ -543,76 +370,13 @@ nsGfxButtonControlFrame::Reflow(nsIPresContext* aPresContext, suggestedReflowState.mComputedHeight = mSuggestedHeight; } - rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus); + return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, suggestedReflowState, aStatus); - } else { // Normal reflow. - -#if 1 - // nsHTMLButtonControlFrame::Reflow registers it for Standard Mode - // and sets up mPresContext - if (eReflowReason_Initial == aReflowState.reason) { - nsFormControlFrame::RegUnRegAccessKey(aPresContext, NS_STATIC_CAST(nsIFrame*, this), PR_TRUE); - } - // Do NavQuirks Sizing and layout - rv = DoNavQuirksReflow(aPresContext, aDesiredSize, aReflowState, aStatus); - - // Make sure we obey min/max-width and min/max-height - if (aDesiredSize.width > aReflowState.mComputedMaxWidth) { - aDesiredSize.width = aReflowState.mComputedMaxWidth; - } - if (aDesiredSize.width < aReflowState.mComputedMinWidth) { - aDesiredSize.width = aReflowState.mComputedMinWidth; - } - - if (aDesiredSize.height > aReflowState.mComputedMaxHeight) { - aDesiredSize.height = aReflowState.mComputedMaxHeight; - } - if (aDesiredSize.height < aReflowState.mComputedMinHeight) { - aDesiredSize.height = aReflowState.mComputedMinHeight; - } -#else - // Do Standard mode sizing and layout - rv = nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); -#endif } + + // Normal reflow. -#ifdef DEBUG_rodsXXXX - COMPARE_QUIRK_SIZE("nsGfxButtonControlFrame", 84, 24) // with the text "Press Me" in it -#endif - aStatus = NS_FRAME_COMPLETE; - - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); - - if (aDesiredSize.maxElementSize != nsnull) { - aDesiredSize.maxElementSize->width = aDesiredSize.width; - aDesiredSize.maxElementSize->height = aDesiredSize.height; - } - - NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); - return rv; -} - -void -nsGfxButtonControlFrame::CalcNavQuirkSizing(nsIPresContext* aPresContext, - nsIRenderingContext* aRendContext, - nsString& aLabel, - nsSize& aSize) -{ - float p2t; - float t2p; - aPresContext->GetPixelsToTwips(&p2t); - aPresContext->GetTwipsToPixels(&t2p); - - // Get text size, round to nearest pixel, multiply by 3/2 - // XXX this algorithm seems suspect: rounding before multiply can't be good, - // and 3/2 seems ... arbitrary - nsFormControlHelper::GetTextSize(aPresContext, this, - aLabel, aSize, - aRendContext); - aSize.width = NSToCoordRound(aSize.width * t2p); - aSize.height = NSToCoordRound(aSize.height * t2p); - aSize.width = NSIntPixelsToTwips(3 * aSize.width / 2, p2t); - aSize.height = NSIntPixelsToTwips(3 * aSize.height / 2, p2t); + return nsHTMLButtonControlFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); } NS_IMETHODIMP diff --git a/layout/html/forms/src/nsHTMLButtonControlFrame.cpp b/layout/html/forms/src/nsHTMLButtonControlFrame.cpp index 9171a0fcf1d7..307c7b74589b 100644 --- a/layout/html/forms/src/nsHTMLButtonControlFrame.cpp +++ b/layout/html/forms/src/nsHTMLButtonControlFrame.cpp @@ -410,6 +410,7 @@ nsHTMLButtonControlFrame::Paint(nsIPresContext* aPresContext, static void ButtonHack(nsHTMLReflowState& aReflowState, const char* aMessage) { + // XXXbz is this still relevant? if (aReflowState.mComputedWidth == 0) { aReflowState.mComputedWidth = aReflowState.availableWidth; } @@ -551,7 +552,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, focusPadding.left + aReflowState.mComputedBorderPadding.left, focusPadding.top + aReflowState.mComputedBorderPadding.top, 0, aStatus); - + // calculate the min internal size so the contents gets centered correctly // minInternalWidth is not being used at all and causes a warning--commenting // out until someone wants it. @@ -573,7 +574,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, // Place the child FinishReflowChild(firstKid, aPresContext, &reflowState, aDesiredSize, - focusPadding.left + aReflowState.mComputedBorderPadding.right, + focusPadding.left + aReflowState.mComputedBorderPadding.left, yoff + focusPadding.top + aReflowState.mComputedBorderPadding.top, 0); #if 0 // old way @@ -602,6 +603,7 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, #endif AddComputedBorderPaddingToDesiredSize(aDesiredSize, aReflowState); + //aDesiredSize.width += aReflowState.mComputedBorderPadding.left + aReflowState.mComputedBorderPadding.right; //aDesiredSize.height += aReflowState.mComputedBorderPadding.top + aReflowState.mComputedBorderPadding.bottom; @@ -612,9 +614,6 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, } #endif - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; - if (nsnull != aDesiredSize.maxElementSize) { aDesiredSize.maxElementSize->width = aDesiredSize.width; aDesiredSize.maxElementSize->height = aDesiredSize.height; @@ -633,10 +632,15 @@ nsHTMLButtonControlFrame::Reflow(nsIPresContext* aPresContext, } if (aDesiredSize.height < aReflowState.mComputedMinHeight) { aDesiredSize.height = aReflowState.mComputedMinHeight; - } + } + + aDesiredSize.ascent += aReflowState.mComputedBorderPadding.top + focusPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; + aStatus = NS_FRAME_COMPLETE; - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, + mCachedMaxElementSize, aDesiredSize); NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); return NS_OK; } diff --git a/layout/html/forms/src/nsHTMLButtonControlFrame.h b/layout/html/forms/src/nsHTMLButtonControlFrame.h index 96a5e94e9f56..73516e059cee 100644 --- a/layout/html/forms/src/nsHTMLButtonControlFrame.h +++ b/layout/html/forms/src/nsHTMLButtonControlFrame.h @@ -170,6 +170,7 @@ protected: //Resize Reflow OpitmizationSize; nsSize mCacheSize; + nscoord mCachedAscent; nsSize mCachedMaxElementSize; }; diff --git a/layout/html/forms/src/nsListControlFrame.cpp b/layout/html/forms/src/nsListControlFrame.cpp index bbf0d658bd7f..5a68d41f6433 100644 --- a/layout/html/forms/src/nsListControlFrame.cpp +++ b/layout/html/forms/src/nsListControlFrame.cpp @@ -837,7 +837,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, // so we can check timings against the old version #if 1 - nsFormControlFrame::SkipResizeReflow(mCacheSize, + nsFormControlFrame::SkipResizeReflow(mCacheSize, + mCachedAscent, mCachedMaxElementSize, mCachedAvailableSize, aDesiredSize, aReflowState, @@ -999,6 +1000,7 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, } mCachedUnconstrainedSize.width = scrolledAreaDesiredSize.width; mCachedUnconstrainedSize.height = scrolledAreaDesiredSize.height; + mCachedAscent = scrolledAreaDesiredSize.ascent; mCachedDesiredMaxSize.width = scrolledAreaDesiredSize.maxElementSize->width; mCachedDesiredMaxSize.height = scrolledAreaDesiredSize.maxElementSize->height; } else { @@ -1280,8 +1282,9 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, } else { aDesiredSize.width = visibleWidth; aDesiredSize.height = visibleHeight; - aDesiredSize.ascent = aDesiredSize.height; - aDesiredSize.descent = 0; + aDesiredSize.ascent = + scrolledAreaDesiredSize.ascent + aReflowState.mComputedBorderPadding.top; + aDesiredSize.descent = aDesiredSize.height - aDesiredSize.ascent; } if (nsnull != aDesiredSize.maxElementSize) { @@ -1319,7 +1322,8 @@ nsListControlFrame::Reflow(nsIPresContext* aPresContext, //REFLOW_DEBUG_MSG3("** nsLCF Caching AW: %d AH: %d\n", PX(mCachedAvailableSize.width), PX(mCachedAvailableSize.height)); - nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedMaxElementSize, aDesiredSize); + nsFormControlFrame::SetupCachedSizes(mCacheSize, mCachedAscent, + mCachedMaxElementSize, aDesiredSize); REFLOW_DEBUG_MSG3("** Done nsLCF DW: %d DH: %d\n\n", PX(aDesiredSize.width), PX(aDesiredSize.height)); diff --git a/layout/html/forms/src/nsListControlFrame.h b/layout/html/forms/src/nsListControlFrame.h index d1035094c8cf..5af52a335144 100644 --- a/layout/html/forms/src/nsListControlFrame.h +++ b/layout/html/forms/src/nsListControlFrame.h @@ -423,6 +423,7 @@ protected: //Resize Reflow OpitmizationSize; nsSize mCacheSize; + nscoord mCachedAscent; nsSize mCachedMaxElementSize; nsSize mCachedUnconstrainedSize; nsSize mCachedAvailableSize; diff --git a/layout/style/forms.css b/layout/style/forms.css index 2d544b287c62..b4d98bbd609b 100644 --- a/layout/style/forms.css +++ b/layout/style/forms.css @@ -74,6 +74,9 @@ label { /* default inputs, text inputs, and selects */ input { -moz-appearance: textfield; + /* The sum of border-top, border-bottom, padding-top, padding-bottom + must be the same here, for buttons, and for . For + buttons, make sure to include the -moz-focus-inner border/padding. */ + padding: 0px 8px 0px 8px; border: 2px outset ButtonFace; background-color: ButtonFace; color: ButtonText; font: -moz-button; line-height: normal !important; white-space: pre; - vertical-align: text-bottom; cursor: default; -moz-box-sizing: border-box; -moz-user-select: none; @@ -407,15 +411,16 @@ button:active:hover, input[type="reset"]:active:hover, input[type="button"]:active:hover, input[type="submit"]:active:hover { - padding: 3px 0 1px 0; + padding: 0px 7px 0px 9px; border-style: inset; } button:-moz-focus-inner, input[type="reset"]:-moz-focus-inner, input[type="button"]:-moz-focus-inner, -input[type="submit"]:-moz-focus-inner { - padding: 1px 2px 1px 2px; +input[type="submit"]:-moz-focus-inner, +input[type="file"] > input[type="button"]:-moz-focus-inner { + padding: 0px 2px 0px 2px; border: 1px dotted transparent; } @@ -436,7 +441,9 @@ select[disabled] > input[type="button"], select[disabled] > input[type="button"]:active, input[type="submit"][disabled]:active, input[type="submit"][disabled] { - padding: 3px 1px 3px 1px; + /* The sum of border-top, border-bottom, padding-top, padding-bottom + must be the same here and for text inputs */ + padding: 1px 8px 1px 8px; border: 1px outset ButtonShadow; color: GrayText; }