diff --git a/content/base/src/nsStyleContext.cpp b/content/base/src/nsStyleContext.cpp index d702d1b7bc35..27ac6e57ddd9 100644 --- a/content/base/src/nsStyleContext.cpp +++ b/content/base/src/nsStyleContext.cpp @@ -238,6 +238,8 @@ struct StylePositionImpl: public nsStylePosition { mHeightFlags = NS_STYLE_POSITION_VALUE_AUTO; mHeight = 0; mZIndex = 0; + mClipFlags = NS_STYLE_CLIP_AUTO; + mClip.SizeTo(0,0,0,0); } ~StylePositionImpl(void) diff --git a/content/html/style/src/nsCSSStyleRule.cpp b/content/html/style/src/nsCSSStyleRule.cpp index 1fd22b5b9d44..85c763736ceb 100644 --- a/content/html/style/src/nsCSSStyleRule.cpp +++ b/content/html/style/src/nsCSSStyleRule.cpp @@ -1017,6 +1017,32 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a } else if (ourPosition->mZIndex.GetUnit() == eCSSUnit_Absolute) { position->mZIndex = ourPosition->mZIndex.GetIntValue(); } + + // clip property + if (nsnull != ourPosition->mClip) { + position->mClipFlags = NS_STYLE_CLIP_RECT; + + if (ourPosition->mClip->mTop.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.top = ourPosition->mClip->mTop.GetIntValue(); + } else if (ourPosition->mClip->mTop.IsLengthUnit()) { + position->mClip.top = CalcLength(ourPosition->mClip->mTop, font, aPresContext); + } + if (ourPosition->mClip->mRight.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.right = ourPosition->mClip->mRight.GetIntValue(); + } else if (ourPosition->mClip->mRight.IsLengthUnit()) { + position->mClip.right = CalcLength(ourPosition->mClip->mRight, font, aPresContext); + } + if (ourPosition->mClip->mBottom.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.bottom = ourPosition->mClip->mBottom.GetIntValue(); + } else if (ourPosition->mClip->mBottom.IsLengthUnit()) { + position->mClip.bottom = CalcLength(ourPosition->mClip->mBottom, font, aPresContext); + } + if (ourPosition->mClip->mLeft.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.left = ourPosition->mClip->mLeft.GetIntValue(); + } else if (ourPosition->mClip->mLeft.IsLengthUnit()) { + position->mClip.left = CalcLength(ourPosition->mClip->mLeft, font, aPresContext); + } + } } } diff --git a/layout/base/public/nsIStyleContext.h b/layout/base/public/nsIStyleContext.h index 672ae5fc702b..9ca1f95832a9 100644 --- a/layout/base/public/nsIStyleContext.h +++ b/layout/base/public/nsIStyleContext.h @@ -140,20 +140,22 @@ protected: }; struct nsStylePosition : public nsStyleStruct { - PRUint8 mPosition; // see nsStyleConsts.h - PRUint8 mOverflow; // see nsStyleConsts.h + PRUint8 mPosition; // see nsStyleConsts.h + PRUint8 mOverflow; // see nsStyleConsts.h + PRUint8 mClipFlags; // see nsStyleConsts.h - PRUint8 mLeftOffsetFlags; // see nsStyleConsts.h - PRUint8 mTopOffsetFlags; // see nsStyleConsts.h - PRUint8 mWidthFlags; // see nsStyleConsts.h - PRUint8 mHeightFlags; // see nsStyleConsts.h + PRUint8 mLeftOffsetFlags; // see nsStyleConsts.h + PRUint8 mTopOffsetFlags; // see nsStyleConsts.h + PRUint8 mWidthFlags; // see nsStyleConsts.h + PRUint8 mHeightFlags; // see nsStyleConsts.h - nscoord mLeftOffset; - nscoord mTopOffset; - nscoord mWidth; - nscoord mHeight; + nscoord mLeftOffset; + nscoord mTopOffset; + nscoord mWidth; + nscoord mHeight; - PRInt32 mZIndex; + PRInt32 mZIndex; + nsMargin mClip; // offsets from respective edge protected: nsStylePosition(); diff --git a/layout/base/src/nsStyleConsts.h b/layout/base/src/nsStyleConsts.h index 35421fb1603d..777302eef5de 100644 --- a/layout/base/src/nsStyleConsts.h +++ b/layout/base/src/nsStyleConsts.h @@ -70,9 +70,6 @@ #define NS_STYLE_CLEAR_COLUMN 6 #define NS_STYLE_CLEAR_PAGE 7 -// See nsStyleXXX -#define NS_STYLE_CLIP_AUTO 0 - // See nsStyleColor #define NS_STYLE_CURSOR_INHERIT 0 #define NS_STYLE_CURSOR_DEFAULT 1 diff --git a/layout/base/src/nsStyleContext.cpp b/layout/base/src/nsStyleContext.cpp index d702d1b7bc35..27ac6e57ddd9 100644 --- a/layout/base/src/nsStyleContext.cpp +++ b/layout/base/src/nsStyleContext.cpp @@ -238,6 +238,8 @@ struct StylePositionImpl: public nsStylePosition { mHeightFlags = NS_STYLE_POSITION_VALUE_AUTO; mHeight = 0; mZIndex = 0; + mClipFlags = NS_STYLE_CLIP_AUTO; + mClip.SizeTo(0,0,0,0); } ~StylePositionImpl(void) diff --git a/layout/html/base/src/nsAbsoluteFrame.cpp b/layout/html/base/src/nsAbsoluteFrame.cpp index 04d612f0ab57..0036c8043a30 100644 --- a/layout/html/base/src/nsAbsoluteFrame.cpp +++ b/layout/html/base/src/nsAbsoluteFrame.cpp @@ -63,9 +63,9 @@ AbsoluteFrame::~AbsoluteFrame() { } -nsIView* AbsoluteFrame::CreateView(nsIView* aContainingView, - const nsRect& aRect, - PRInt32 aZIndex) +nsIView* AbsoluteFrame::CreateView(nsIView* aContainingView, + const nsRect& aRect, + nsStylePosition* aPosition) { nsIView* view; @@ -85,17 +85,29 @@ nsIView* AbsoluteFrame::CreateView(nsIView* aContainingView, // See if the containing view is a scroll view nsIScrollableView* scrollView = nsnull; nsresult result; + nsRect clip; + nsRect* pClip = NS_STYLE_CLIP_RECT == aPosition->mClipFlags ? + &clip : nsnull; + + // Is there a clip rect specified? + if (NS_STYLE_CLIP_RECT == aPosition->mClipFlags) { + // XXX Michael: this needs to change + clip.SetRect(aPosition->mClip.left, aPosition->mClip.top, + aPosition->mClip.right, aPosition->mClip.bottom); + } result = aContainingView->QueryInterface(kIScrollableViewIID, (void**)&scrollView); if (NS_OK == result) { nsIView* scrolledView = scrollView->GetScrolledView(); - view->Init(viewManager, aRect, scrolledView, nsnull, nsnull, nsnull, aZIndex); + view->Init(viewManager, aRect, scrolledView, nsnull, nsnull, nsnull, + aPosition->mZIndex, pClip); viewManager->InsertChild(scrolledView, view, 0); NS_RELEASE(scrolledView); NS_RELEASE(scrollView); } else { - view->Init(viewManager, aRect, aContainingView, nsnull, nsnull, nsnull, aZIndex); + view->Init(viewManager, aRect, aContainingView, nsnull, nsnull, nsnull, + aPosition->mZIndex, pClip); viewManager->InsertChild(aContainingView, view, 0); } @@ -250,7 +262,7 @@ NS_METHOD AbsoluteFrame::ResizeReflow(nsIPresContext* aPresContext, ComputeViewBounds(containingRect, position, rect); // Create a view for the frame - nsIView* view = CreateView(containingView, rect, position->mZIndex); + nsIView* view = CreateView(containingView, rect, position); NS_RELEASE(containingView); mFrame->SetView(view); diff --git a/layout/html/base/src/nsAbsoluteFrame.h b/layout/html/base/src/nsAbsoluteFrame.h index e84269153ebc..7046de8b6b34 100644 --- a/layout/html/base/src/nsAbsoluteFrame.h +++ b/layout/html/base/src/nsAbsoluteFrame.h @@ -53,9 +53,9 @@ protected: virtual ~AbsoluteFrame(); - nsIView* CreateView(nsIView* aContainingView, - const nsRect& aRect, - PRInt32 aZIndex); + nsIView* CreateView(nsIView* aContainingView, + const nsRect& aRect, + nsStylePosition* aPosition); nsIFrame* GetContainingBlock(); void ComputeViewBounds(const nsRect& aContainingInnerRect, nsStylePosition* aPosition, diff --git a/layout/html/style/src/nsCSSStyleRule.cpp b/layout/html/style/src/nsCSSStyleRule.cpp index 1fd22b5b9d44..85c763736ceb 100644 --- a/layout/html/style/src/nsCSSStyleRule.cpp +++ b/layout/html/style/src/nsCSSStyleRule.cpp @@ -1017,6 +1017,32 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a } else if (ourPosition->mZIndex.GetUnit() == eCSSUnit_Absolute) { position->mZIndex = ourPosition->mZIndex.GetIntValue(); } + + // clip property + if (nsnull != ourPosition->mClip) { + position->mClipFlags = NS_STYLE_CLIP_RECT; + + if (ourPosition->mClip->mTop.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.top = ourPosition->mClip->mTop.GetIntValue(); + } else if (ourPosition->mClip->mTop.IsLengthUnit()) { + position->mClip.top = CalcLength(ourPosition->mClip->mTop, font, aPresContext); + } + if (ourPosition->mClip->mRight.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.right = ourPosition->mClip->mRight.GetIntValue(); + } else if (ourPosition->mClip->mRight.IsLengthUnit()) { + position->mClip.right = CalcLength(ourPosition->mClip->mRight, font, aPresContext); + } + if (ourPosition->mClip->mBottom.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.bottom = ourPosition->mClip->mBottom.GetIntValue(); + } else if (ourPosition->mClip->mBottom.IsLengthUnit()) { + position->mClip.bottom = CalcLength(ourPosition->mClip->mBottom, font, aPresContext); + } + if (ourPosition->mClip->mLeft.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.left = ourPosition->mClip->mLeft.GetIntValue(); + } else if (ourPosition->mClip->mLeft.IsLengthUnit()) { + position->mClip.left = CalcLength(ourPosition->mClip->mLeft, font, aPresContext); + } + } } } diff --git a/layout/style/nsCSSStyleRule.cpp b/layout/style/nsCSSStyleRule.cpp index 1fd22b5b9d44..85c763736ceb 100644 --- a/layout/style/nsCSSStyleRule.cpp +++ b/layout/style/nsCSSStyleRule.cpp @@ -1017,6 +1017,32 @@ void CSSStyleRuleImpl::MapStyleInto(nsIStyleContext* aContext, nsIPresContext* a } else if (ourPosition->mZIndex.GetUnit() == eCSSUnit_Absolute) { position->mZIndex = ourPosition->mZIndex.GetIntValue(); } + + // clip property + if (nsnull != ourPosition->mClip) { + position->mClipFlags = NS_STYLE_CLIP_RECT; + + if (ourPosition->mClip->mTop.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.top = ourPosition->mClip->mTop.GetIntValue(); + } else if (ourPosition->mClip->mTop.IsLengthUnit()) { + position->mClip.top = CalcLength(ourPosition->mClip->mTop, font, aPresContext); + } + if (ourPosition->mClip->mRight.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.right = ourPosition->mClip->mRight.GetIntValue(); + } else if (ourPosition->mClip->mRight.IsLengthUnit()) { + position->mClip.right = CalcLength(ourPosition->mClip->mRight, font, aPresContext); + } + if (ourPosition->mClip->mBottom.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.bottom = ourPosition->mClip->mBottom.GetIntValue(); + } else if (ourPosition->mClip->mBottom.IsLengthUnit()) { + position->mClip.bottom = CalcLength(ourPosition->mClip->mBottom, font, aPresContext); + } + if (ourPosition->mClip->mLeft.GetUnit() == eCSSUnit_Enumerated) { + position->mClip.left = ourPosition->mClip->mLeft.GetIntValue(); + } else if (ourPosition->mClip->mLeft.IsLengthUnit()) { + position->mClip.left = CalcLength(ourPosition->mClip->mLeft, font, aPresContext); + } + } } } diff --git a/layout/style/nsStyleContext.cpp b/layout/style/nsStyleContext.cpp index d702d1b7bc35..27ac6e57ddd9 100644 --- a/layout/style/nsStyleContext.cpp +++ b/layout/style/nsStyleContext.cpp @@ -238,6 +238,8 @@ struct StylePositionImpl: public nsStylePosition { mHeightFlags = NS_STYLE_POSITION_VALUE_AUTO; mHeight = 0; mZIndex = 0; + mClipFlags = NS_STYLE_CLIP_AUTO; + mClip.SizeTo(0,0,0,0); } ~StylePositionImpl(void)