Bug 10209 - Part 6: Implement the CSS "containing block" concept correctly as a binary relation, as opposed to a unary relation; r=bzbarsky

This commit is contained in:
Ehsan Akhgari 2011-05-12 00:04:30 -04:00
Родитель 30f43ed109
Коммит c4f365dd4e
40 изменённых файлов: 150 добавлений и 199 удалений

Просмотреть файл

@ -2108,10 +2108,7 @@ GetPercentHeight(const nsStyleCoord& aStyle,
if (eStyleUnit_Percent != aStyle.GetUnit())
return PR_FALSE;
nsIFrame *f;
for (f = aFrame->GetParent(); f && !f->IsContainingBlock();
f = f->GetParent())
;
nsIFrame *f = aFrame->GetContainingBlock();
if (!f) {
NS_NOTREACHED("top of frame tree not a containing block");
return PR_FALSE;

Просмотреть файл

@ -780,6 +780,13 @@ public:
*/
static nsBlockFrame* GetAsBlock(nsIFrame* aFrame);
/*
* Whether the frame is an nsBlockFrame which is not a wrapper block.
*/
static bool IsNonWrapperBlock(nsIFrame* aFrame) {
return GetAsBlock(aFrame) && !aFrame->IsBlockWrapper();
}
/**
* If aFrame is an out of flow frame, return its placeholder, otherwise
* return its parent.

Просмотреть файл

@ -106,7 +106,6 @@ public:
nsIFrame* aOldFrame);
virtual nsIAtom* GetType() const;
virtual bool IsContainingBlock() const;
#ifdef ACCESSIBILITY
virtual already_AddRefed<nsAccessible> CreateAccessible();
@ -151,12 +150,6 @@ nsFieldSetFrame::GetType() const
return nsGkAtoms::fieldSetFrame;
}
bool
nsFieldSetFrame::IsContainingBlock() const
{
return PR_TRUE;
}
NS_IMETHODIMP
nsFieldSetFrame::SetInitialChildList(ChildListID aListID,
nsFrameList& aChildList)

Просмотреть файл

@ -361,12 +361,6 @@ nsHTMLButtonControlFrame::ReflowButtonContents(nsPresContext* aPresContext,
aDesiredSize.ascent += yoff;
}
/* virtual */ bool
nsHTMLButtonControlFrame::IsContainingBlock() const
{
return PR_TRUE;
}
PRIntn
nsHTMLButtonControlFrame::GetSkipSides() const
{

Просмотреть файл

@ -79,8 +79,6 @@ public:
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus);
virtual bool IsContainingBlock() const;
NS_IMETHOD HandleEvent(nsPresContext* aPresContext,
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus);

Просмотреть файл

@ -1758,15 +1758,6 @@ nsListControlFrame::GetType() const
return nsGkAtoms::listControlFrame;
}
bool
nsListControlFrame::IsContainingBlock() const
{
// We are in fact the containing block for our options. They should
// certainly not use our parent block (or worse yet our parent combobox) for
// their sizing.
return PR_TRUE;
}
void
nsListControlFrame::InvalidateInternal(const nsRect& aDamageRect,
nscoord aX, nscoord aY, nsIFrame* aForChild,

Просмотреть файл

@ -124,8 +124,6 @@ public:
~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock));
}
virtual bool IsContainingBlock() const;
virtual void InvalidateInternal(const nsRect& aDamageRect,
nscoord aX, nscoord aY, nsIFrame* aForChild,
PRUint32 aFlags);

Просмотреть файл

@ -629,22 +629,6 @@ nsBlockFrame::GetChildLists(nsTArray<ChildList>* aLists) const
}
}
/* virtual */ bool
nsBlockFrame::IsContainingBlock() const
{
// The block wrappers we use to wrap blocks inside inlines aren't
// described in the CSS spec. We need to make them not be containing
// blocks for the cases where we care about the 'direction' property
// of an element's containing block.
// Since the parent of such a block is either a normal block or
// another such pseudo, this shouldn't cause anything bad to happen.
// Also the anonymous blocks inside table cells are not containing blocks.
nsIAtom *pseudoType = GetStyleContext()->GetPseudo();
return pseudoType != nsCSSAnonBoxes::mozAnonymousBlock &&
pseudoType != nsCSSAnonBoxes::mozAnonymousPositionedBlock &&
pseudoType != nsCSSAnonBoxes::cellContent;
}
/* virtual */ bool
nsBlockFrame::IsFloatContainingBlock() const
{

Просмотреть файл

@ -181,7 +181,6 @@ public:
virtual nscoord GetCaretBaseline() const;
virtual void DestroyFrom(nsIFrame* aDestructRoot);
virtual nsSplittableType GetSplittableType() const;
virtual bool IsContainingBlock() const;
virtual bool IsFloatContainingBlock() const;
NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder,
const nsRect& aDirtyRect,

Просмотреть файл

@ -88,7 +88,6 @@ public:
nsHTMLReflowMetrics& aDesiredSize,
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus);
virtual bool IsContainingBlock() const { return true; }
virtual bool IsFrameOfType(PRUint32 aFlags) const
{
return nsHTMLContainerFrame::IsFrameOfType(aFlags &

Просмотреть файл

@ -1787,7 +1787,6 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder,
// XXX we REALLY need a "are you an inline-block sort of thing?" here!!!
if ((aFlags & DISPLAY_CHILD_INLINE) &&
(disp->mDisplay != NS_STYLE_DISPLAY_INLINE ||
aChild->IsContainingBlock() ||
(aChild->IsFrameOfType(eReplaced)))) {
// child is a non-inline frame in an inline context, i.e.,
// it acts like inline-block or inline-table. Therefore it is a
@ -4905,16 +4904,43 @@ nsFrame::IsFrameTreeTooDeep(const nsHTMLReflowState& aReflowState,
return PR_FALSE;
}
/* virtual */ bool nsFrame::IsContainingBlock() const
bool
nsIFrame::IsBlockWrapper() const
{
const nsStyleDisplay* display = GetStyleDisplay();
nsIAtom *pseudoType = GetStyleContext()->GetPseudo();
return (pseudoType == nsCSSAnonBoxes::mozAnonymousBlock ||
pseudoType == nsCSSAnonBoxes::mozAnonymousPositionedBlock ||
pseudoType == nsCSSAnonBoxes::cellContent);
}
// Absolute positioning causes |display->mDisplay| to be set to block,
// if needed.
return display->mDisplay == NS_STYLE_DISPLAY_BLOCK ||
display->mDisplay == NS_STYLE_DISPLAY_INLINE_BLOCK ||
display->mDisplay == NS_STYLE_DISPLAY_LIST_ITEM ||
display->mDisplay == NS_STYLE_DISPLAY_TABLE_CELL;
static nsIFrame*
GetNearestBlockContainer(nsIFrame* frame)
{
// The block wrappers we use to wrap blocks inside inlines aren't
// described in the CSS spec. We need to make them not be containing
// blocks.
// Since the parent of such a block is either a normal block or
// another such pseudo, this shouldn't cause anything bad to happen.
// Also the anonymous blocks inside table cells are not containing blocks.
while (frame->IsFrameOfType(nsIFrame::eLineParticipant) ||
frame->IsBlockWrapper()) {
frame = frame->GetParent();
NS_ASSERTION(frame, "How come we got to the root frame without seeing a containing block?");
}
return frame;
}
nsIFrame*
nsIFrame::GetContainingBlock() const
{
// MathML frames might have absolute positioning style, but they would
// still be in-flow. So we have to check to make sure that the frame
// is really out-of-flow too.
if (GetStyleDisplay()->IsAbsolutelyPositioned() &&
(GetStateBits() & NS_FRAME_OUT_OF_FLOW)) {
return GetParent(); // the parent is always the containing block
}
return GetNearestBlockContainer(GetParent());
}
#ifdef NS_DEBUG

Просмотреть файл

@ -231,7 +231,6 @@ public:
NS_IMETHOD SetNextInFlow(nsIFrame*);
NS_IMETHOD GetOffsetFromView(nsPoint& aOffset, nsIView** aView) const;
virtual nsIAtom* GetType() const;
virtual bool IsContainingBlock() const;
NS_IMETHOD GetSelected(bool *aSelected) const;
NS_IMETHOD IsSelectable(bool* aIsSelectable, PRUint8* aSelectStyle) const;

Просмотреть файл

@ -299,32 +299,18 @@ void nsHTMLReflowState::InitCBReflowState()
return;
}
// If outer tables ever become containing blocks, we need to make sure to use
// their mCBReflowState in the non-absolutely-positioned case for inner
// tables.
NS_ASSERTION(frame->GetType() != nsGkAtoms::tableFrame ||
!frame->GetParent()->IsContainingBlock(),
"Outer table should not be containing block");
if (parentReflowState->frame->IsContainingBlock() ||
// Absolutely positioned frames should always be kids of the frames that
// determine their containing block....
(NS_FRAME_GET_TYPE(mFrameType) == NS_CSS_FRAME_TYPE_ABSOLUTE)) {
// an absolutely positioned inner table needs to use the parent of
// the outer table. So the above comment about absolutely
// positioned frames is sort of a lie.
if (parentReflowState->parentReflowState &&
frame->GetType() == nsGkAtoms::tableFrame) {
mCBReflowState = parentReflowState->parentReflowState;
if (parentReflowState->frame == frame->GetContainingBlock()) {
// Inner table frames need to use the containing block of the outer
// table frame.
if (frame->GetType() == nsGkAtoms::tableFrame) {
mCBReflowState = parentReflowState->mCBReflowState;
} else {
mCBReflowState = parentReflowState;
}
return;
}
} else {
mCBReflowState = parentReflowState->mCBReflowState;
}
}
/* Check whether CalcQuirkContainingBlockHeight would stop on the
* given reflow state, using its block as a height. (essentially
@ -373,7 +359,7 @@ nsHTMLReflowState::InitResizeFlags(nsPresContext* aPresContext)
// mCBReflowState->mFlags.mVResize is set correctly below when
// reflowing descendant.
mFlags.mVResize = PR_TRUE;
} else if (mCBReflowState && !frame->IsContainingBlock()) {
} else if (mCBReflowState && !nsLayoutUtils::IsNonWrapperBlock(frame)) {
// XXX Is this problematic for relatively positioned inlines acting
// as containing block for absolutely positioned elements?
// Possibly; in that case we should at least be checking
@ -415,7 +401,7 @@ nsHTMLReflowState::InitResizeFlags(nsPresContext* aPresContext)
// line-height depends on block height
frame->AddStateBits(NS_FRAME_CONTAINS_RELATIVE_HEIGHT);
// but only on containing blocks if this frame is not a suitable block
dependsOnCBHeight |= !frame->IsContainingBlock();
dependsOnCBHeight |= !nsLayoutUtils::IsNonWrapperBlock(frame);
}
// If we're the descendant of a table cell that performs special height
@ -488,23 +474,6 @@ nsHTMLReflowState::GetContainingBlockContentWidth(const nsHTMLReflowState* aRefl
return rs->mComputedWidth;
}
/* static */
nsIFrame*
nsHTMLReflowState::GetContainingBlockFor(const nsIFrame* aFrame)
{
NS_PRECONDITION(aFrame, "Must have frame to work with");
nsIFrame* container = aFrame->GetParent();
if (aFrame->GetStyleDisplay()->IsAbsolutelyPositioned()) {
// Absolutely positioned frames are just kids of their containing
// blocks (which may happen to be inlines).
return container;
}
while (container && !container->IsContainingBlock()) {
container = container->GetParent();
}
return container;
}
void
nsHTMLReflowState::InitFrameType()
{
@ -701,22 +670,12 @@ nsHTMLReflowState::ComputeRelativeOffsets(const nsHTMLReflowState* cbrs,
}
}
static nsIFrame*
GetNearestContainingBlock(nsIFrame *aFrame)
{
nsIFrame *cb = aFrame;
do {
cb = cb->GetParent();
} while (!cb->IsContainingBlock());
return cb;
}
nsIFrame*
nsHTMLReflowState::GetHypotheticalBoxContainer(nsIFrame* aFrame,
nscoord& aCBLeftEdge,
nscoord& aCBWidth)
{
aFrame = GetNearestContainingBlock(aFrame);
aFrame = aFrame->GetContainingBlock();
NS_ASSERTION(aFrame != frame, "How did that happen?");
/* Now aFrame is the containing block we want */
@ -1190,7 +1149,7 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsPresContext* aPresContext,
if (leftIsAuto && rightIsAuto) {
// Use the direction of the original ("static-position") containing block
// to dictate whether 'left' or 'right' is treated like 'static-position'.
if (NS_STYLE_DIRECTION_LTR == GetNearestContainingBlock(placeholderFrame)
if (NS_STYLE_DIRECTION_LTR == placeholderFrame->GetContainingBlock()
->GetStyleVisibility()->mDirection) {
NS_ASSERTION(hypotheticalBox.mLeftIsExact, "should always have "
"exact value on containing block's start side");
@ -1571,7 +1530,12 @@ nsHTMLReflowState::ComputeContainingBlockRectangle(nsPresContext* aPres
aContainingBlockWidth = aContainingBlockRS->mComputedWidth;
aContainingBlockHeight = aContainingBlockRS->mComputedHeight;
if (NS_FRAME_GET_TYPE(mFrameType) == NS_CSS_FRAME_TYPE_ABSOLUTE) {
// mFrameType for abs-pos tables is NS_CSS_FRAME_TYPE_BLOCK, so we need to
// special case them here.
if (NS_FRAME_GET_TYPE(mFrameType) == NS_CSS_FRAME_TYPE_ABSOLUTE ||
(frame->GetType() == nsGkAtoms::tableFrame &&
frame->GetStyleDisplay()->IsAbsolutelyPositioned() &&
(frame->GetParent()->GetStateBits() & NS_FRAME_OUT_OF_FLOW))) {
// See if the ancestor is block-level or inline-level
if (NS_FRAME_GET_TYPE(aContainingBlockRS->mFrameType) == NS_CSS_FRAME_TYPE_INLINE) {
// Base our size on the actual size of the frame. In cases when this is
@ -2168,7 +2132,7 @@ nscoord
nsHTMLReflowState::CalcLineHeight() const
{
nscoord blockHeight =
frame->IsContainingBlock() ? mComputedHeight :
nsLayoutUtils::IsNonWrapperBlock(frame) ? mComputedHeight :
(mCBReflowState ? mCBReflowState->mComputedHeight : NS_AUTOHEIGHT);
return CalcLineHeight(frame->GetStyleContext(), blockHeight);

Просмотреть файл

@ -405,13 +405,6 @@ public:
static nscoord
GetContainingBlockContentWidth(const nsHTMLReflowState* aReflowState);
/**
* Find the containing block of aFrame. This may return null if
* there isn't one (but that should really only happen for root
* frames).
*/
static nsIFrame* GetContainingBlockFor(const nsIFrame* aFrame);
/**
* Calculate the used line-height property. The return value will be >= 0.
*/

Просмотреть файл

@ -1982,9 +1982,17 @@ public:
}
/**
* Is this frame a containing block for non-positioned elements?
* Returns true if the frame is a block wrapper.
*/
virtual bool IsContainingBlock() const = 0;
bool IsBlockWrapper() const;
/**
* Get this frame's CSS containing block.
*
* The algorithm is defined in
* http://www.w3.org/TR/CSS2/visudet.html#containing-block-details.
*/
nsIFrame* GetContainingBlock() const;
/**
* Is this frame a containing block for floating elements?

Просмотреть файл

@ -168,9 +168,3 @@ nsPageContentFrame::GetFrameName(nsAString& aResult) const
return MakeFrameName(NS_LITERAL_STRING("PageContent"), aResult);
}
#endif
/* virtual */ bool
nsPageContentFrame::IsContainingBlock() const
{
return PR_TRUE;
}

Просмотреть файл

@ -56,7 +56,6 @@ public:
const nsHTMLReflowState& aMaxSize,
nsReflowStatus& aStatus);
virtual bool IsContainingBlock() const;
virtual bool IsFrameOfType(PRUint32 aFlags) const
{
return ViewportFrame::IsFrameOfType(aFlags &

Просмотреть файл

@ -175,12 +175,6 @@ nsPageFrame::GetFrameName(nsAString& aResult) const
}
#endif
/* virtual */ bool
nsPageFrame::IsContainingBlock() const
{
return PR_TRUE;
}
void
nsPageFrame::ProcessSpecialCodes(const nsString& aStr, nsString& aNewStr)
{

Просмотреть файл

@ -59,8 +59,6 @@ public:
const nsRect& aDirtyRect,
const nsDisplayListSet& aLists);
virtual bool IsContainingBlock() const;
/**
* Get the "type" of the frame
*

Просмотреть файл

@ -290,12 +290,6 @@ ViewportFrame::GetType() const
return nsGkAtoms::viewportFrame;
}
/* virtual */ bool
ViewportFrame::IsContainingBlock() const
{
return PR_TRUE;
}
void
ViewportFrame::InvalidateInternal(const nsRect& aDamageRect,
nscoord aX, nscoord aY, nsIFrame* aForChild,

Просмотреть файл

@ -101,8 +101,6 @@ public:
*/
virtual nsIAtom* GetType() const;
virtual bool IsContainingBlock() const;
virtual void InvalidateInternal(const nsRect& aDamageRect,
nscoord aX, nscoord aY, nsIFrame* aForChild,
PRUint32 aFlags);

Просмотреть файл

@ -0,0 +1,16 @@
<!DOCTYPE HTML>
<style>
@font-face {
font-family: Ahem;
src: url(../fonts/Ahem.ttf);
}
* {
font-family: Ahem;
}
</style>
<body style="font-size: 100px; padding-top: 5px">
<div style="position: relative; display: inline;">
<table style="height: 50%; position: absolute; width: 50px; background: green">
</table>
</div>
</body>

Просмотреть файл

@ -0,0 +1,16 @@
<!DOCTYPE HTML>
<style>
@font-face {
font-family: Ahem;
src: url(../fonts/Ahem.ttf);
}
* {
font-family: Ahem;
}
</style>
<body style="font-size: 100px">
<div style="position: relative; height:100px;">
<table style="height: 50%; position: absolute; width: 50px; background: green">
</table>
</div>
</body>

Просмотреть файл

@ -0,0 +1,14 @@
<!DOCTYPE html>
<style>
@font-face {
font-family: Ahem;
src: url(../fonts/Ahem.ttf);
}
* {
font-family: Ahem;
}
</style>
<body style="margin: 0">
<div style="width: 100px; height: 100px; background: green">
</div>
</body>

Просмотреть файл

@ -0,0 +1,13 @@
<!DOCTYPE html>
<style>
@font-face {
font-family: Ahem;
src: url(../fonts/Ahem.ttf);
}
* {
font-family: Ahem;
}
</style>
<body style="position: relative; display: inline; border-right: 1px solid black; font-size: 100px; line-height: 100px; margin: 0">
<table style="position: absolute; width: 100px; height: 100%; top: 0; left: 0; background: green"></table>
</body>

Просмотреть файл

@ -0,0 +1,14 @@
<!DOCTYPE HTML>
<style>
@font-face {
font-family: Ahem;
src: url(../fonts/Ahem.ttf);
}
* {
font-family: Ahem;
}
</style>
<body>
<div style="width: 50px; height: 50px; background: green">
</div>
</body>

Просмотреть файл

@ -18,6 +18,9 @@
== 9458-zorder-4.html 9458-zorder-ref-inline-block.html
== 9458-zorder-5.html 9458-zorder-ref-inline-block.html
== 10036-1.html 10036-1-ref.html
skip-if(!cocoaWidget) HTTP(..) == 10209-1.html 10209-ref.html # Bug 667079
HTTP(..) == 10209-2.html 10209-ref.html
asserts(4) skip-if(!cocoaWidget) HTTP(..) == 10209-3.html 10209-3-ref.html # Assertions: bug 666606, skip because of bug 667079
== 18217-basic-1.html 18217-basic-1-ref.html
== 18217-basic-2a.html 18217-basic-2-ref.html
== 18217-basic-2b.html 18217-basic-2-ref.html

Просмотреть файл

@ -131,7 +131,7 @@ GetContainingBlockFor(nsIFrame* aFrame) {
if (!aFrame) {
return nsnull;
}
return nsHTMLReflowState::GetContainingBlockFor(aFrame);
return aFrame->GetContainingBlock();
}
nsComputedDOMStyle::nsComputedDOMStyle()
@ -3332,7 +3332,7 @@ nsComputedDOMStyle::GetLineHeightCoord(nscoord& aCoord)
if (!mInnerFrame)
return PR_FALSE;
if (mInnerFrame->IsContainingBlock()) {
if (nsLayoutUtils::IsNonWrapperBlock(mInnerFrame)) {
blockHeight = mInnerFrame->GetContentRect().height;
} else {
GetCBContentHeight(blockHeight);

Просмотреть файл

@ -1043,12 +1043,6 @@ nsTableCellFrame::GetType() const
return nsGkAtoms::tableCellFrame;
}
/* virtual */ bool
nsTableCellFrame::IsContainingBlock() const
{
return PR_TRUE;
}
#ifdef DEBUG
NS_IMETHODIMP
nsTableCellFrame::GetFrameName(nsAString& aResult) const

Просмотреть файл

@ -149,8 +149,6 @@ public:
*/
virtual nsIAtom* GetType() const;
virtual bool IsContainingBlock() const;
#ifdef DEBUG
NS_IMETHOD GetFrameName(nsAString& aResult) const;
#endif

Просмотреть файл

@ -429,12 +429,6 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsPresContext* aPresContext,
return rv;
}
/* virtual */ bool
nsTableColGroupFrame::IsContainingBlock() const
{
return PR_TRUE;
}
nsTableColFrame * nsTableColGroupFrame::GetFirstColumn()
{
return GetNextColumn(nsnull);

Просмотреть файл

@ -142,10 +142,6 @@ public:
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus);
/* needed only because we use Reflow in a hacky way, see
nsTableFrame::ReflowColGroups */
virtual bool IsContainingBlock() const;
/**
* Get the "type" of the frame
*

Просмотреть файл

@ -359,12 +359,6 @@ nsTableFrame::SetInitialChildList(ChildListID aListID,
return NS_OK;
}
/* virtual */ bool
nsTableFrame::IsContainingBlock() const
{
return PR_TRUE;
}
void nsTableFrame::AttributeChangedFor(nsIFrame* aFrame,
nsIContent* aContent,
nsIAtom* aAttribute)

Просмотреть файл

@ -164,8 +164,6 @@ public:
// height reflow will occur.
static void RequestSpecialHeightReflow(const nsHTMLReflowState& aReflowState);
virtual bool IsContainingBlock() const;
static void RePositionViews(nsIFrame* aFrame);
static bool PageBreakAfter(nsIFrame* aSourceFrame,

Просмотреть файл

@ -199,12 +199,6 @@ nsTableOuterFrame::CreateAccessible()
}
#endif
/* virtual */ bool
nsTableOuterFrame::IsContainingBlock() const
{
return PR_FALSE;
}
void
nsTableOuterFrame::DestroyFrom(nsIFrame* aDestructRoot)
{

Просмотреть файл

@ -99,8 +99,6 @@ public:
virtual void DestroyFrom(nsIFrame* aDestructRoot);
virtual bool IsContainingBlock() const;
NS_IMETHOD SetInitialChildList(ChildListID aListID,
nsFrameList& aChildList);

Просмотреть файл

@ -69,12 +69,6 @@ NS_QUERYFRAME_HEAD(nsTableRowGroupFrame)
NS_QUERYFRAME_ENTRY(nsTableRowGroupFrame)
NS_QUERYFRAME_TAIL_INHERITING(nsHTMLContainerFrame)
/* virtual */ bool
nsTableRowGroupFrame::IsContainingBlock() const
{
return PR_TRUE;
}
PRInt32
nsTableRowGroupFrame::GetRowCount()
{

Просмотреть файл

@ -149,8 +149,6 @@ public:
*/
virtual nsIAtom* GetType() const;
virtual bool IsContainingBlock() const;
nsTableRowFrame* GetFirstRow();
#ifdef DEBUG

Просмотреть файл

@ -102,14 +102,6 @@ nsScrollbarFrame::Reflow(nsPresContext* aPresContext,
return NS_OK;
}
/* virtual */ bool
nsScrollbarFrame::IsContainingBlock() const
{
// Return true so that the nsHTMLReflowState code is happy with us
// being a reflow root.
return PR_TRUE;
}
nsIAtom*
nsScrollbarFrame::GetType() const
{

Просмотреть файл

@ -96,8 +96,6 @@ public:
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus);
virtual bool IsContainingBlock() const;
virtual nsIAtom* GetType() const;
void SetScrollbarMediatorContent(nsIContent* aMediator);