From c3c3f9d0be8a50eed3703b89ffdc875f61e24f58 Mon Sep 17 00:00:00 2001 From: Michael Ventnor Date: Wed, 28 Jan 2009 22:28:14 +1300 Subject: [PATCH] Bug 475197. -moz-box-shadow needs to be hooked up to buttons and fieldsets since they have custom background painting code. r+sr=roc --- layout/base/nsCSSRendering.cpp | 13 ++++++------- layout/forms/nsButtonFrameRenderer.cpp | 9 +++++++++ layout/forms/nsFieldSetFrame.cpp | 10 ++++++++++ 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 0ea75937c856..c662b8e630cf 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -1056,14 +1056,13 @@ nsCSSRendering::PaintBoxShadow(nsPresContext* aPresContext, const nsPoint& aForFramePt, const nsRect& aDirtyRect) { - nsMargin borderValues; - PRIntn sidesToSkip; - nsRect frameRect; - const nsStyleBorder* styleBorder = aForFrame->GetStyleBorder(); - borderValues = styleBorder->GetActualBorder(); - sidesToSkip = aForFrame->GetSkipSides(); - frameRect = nsRect(aForFramePt, aForFrame->GetSize()); + if (!styleBorder->mBoxShadow) + return; + + nsMargin borderValues = styleBorder->GetActualBorder(); + PRIntn sidesToSkip = aForFrame->GetSkipSides(); + nsRect frameRect = nsRect(aForFramePt, aForFrame->GetSize()); // Get any border radius, since box-shadow must also have rounded corners if the frame does nscoord twipsRadii[8]; diff --git a/layout/forms/nsButtonFrameRenderer.cpp b/layout/forms/nsButtonFrameRenderer.cpp index 69e60a29226b..a00dcf772174 100644 --- a/layout/forms/nsButtonFrameRenderer.cpp +++ b/layout/forms/nsButtonFrameRenderer.cpp @@ -109,6 +109,7 @@ public: } virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx, const nsRect& aDirtyRect); + virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder); NS_DISPLAY_DECL_NAME("ButtonBorderBackground") private: nsButtonFrameRenderer* mBFR; @@ -133,6 +134,11 @@ private: nsButtonFrameRenderer* mBFR; }; +nsRect nsDisplayButtonBorderBackground::GetBounds(nsDisplayListBuilder* aBuilder) +{ + return mFrame->GetOverflowRect() + aBuilder->ToReferenceFrame(mFrame); +} + void nsDisplayButtonBorderBackground::Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx, const nsRect& aDirtyRect) @@ -224,6 +230,9 @@ nsButtonFrameRenderer::PaintBorderAndBackground(nsPresContext* aPresContext, const nsStyleBorder* border = context->GetStyleBorder(); + nsCSSRendering::PaintBoxShadow(aPresContext, aRenderingContext, mFrame, + aRect.TopLeft(), aDirtyRect); + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, mFrame, aDirtyRect, buttonRect, PR_FALSE); nsCSSRendering::PaintBorder(aPresContext, aRenderingContext, mFrame, diff --git a/layout/forms/nsFieldSetFrame.cpp b/layout/forms/nsFieldSetFrame.cpp index c86571f3aa1a..bdcc3075b600 100644 --- a/layout/forms/nsFieldSetFrame.cpp +++ b/layout/forms/nsFieldSetFrame.cpp @@ -186,6 +186,7 @@ public: HitTestState* aState); virtual void Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx, const nsRect& aDirtyRect); + virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder); NS_DISPLAY_DECL_NAME("FieldSetBorderBackground") }; @@ -198,6 +199,12 @@ nsIFrame* nsDisplayFieldSetBorderBackground::HitTest(nsDisplayListBuilder* aBuil return mFrame; } +nsRect +nsDisplayFieldSetBorderBackground::GetBounds(nsDisplayListBuilder* aBuilder) +{ + return mFrame->GetOverflowRect() + aBuilder->ToReferenceFrame(mFrame); +} + void nsDisplayFieldSetBorderBackground::Paint(nsDisplayListBuilder* aBuilder, nsIRenderingContext* aCtx, const nsRect& aDirtyRect) @@ -272,6 +279,9 @@ nsFieldSetFrame::PaintBorderBackground(nsIRenderingContext& aRenderingContext, nsRect rect(aPt.x, aPt.y + yoff, mRect.width, mRect.height - yoff); + nsCSSRendering::PaintBoxShadow(presContext, aRenderingContext, this, + rect.TopLeft(), aDirtyRect); + nsCSSRendering::PaintBackground(presContext, aRenderingContext, this, aDirtyRect, rect, PR_TRUE);