Bug 1109571 part 2 - Remove nsGkAtoms::tableCaptionFrame. Implement nsIFrame::IsTableCaption() and use that instead. r=roc
--- a/dom/base/nsGkAtomList.h
+++ b/dom/base/nsGkAtomList.h
@@ -1936,17 +1936,16 @@ GK_ATOM(rubyBaseContainerFrame, "RubyBas
GK_ATOM(rubyBaseFrame, "RubyBaseFrame")
GK_ATOM(rubyFrame, "RubyFrame")
GK_ATOM(rubyTextContainerFrame, "RubyTextContainerFrame")
GK_ATOM(rubyTextFrame, "RubyTextFrame")
GK_ATOM(scrollFrame, "ScrollFrame")
GK_ATOM(scrollbarFrame, "ScrollbarFrame")
GK_ATOM(sequenceFrame, "SequenceFrame")
GK_ATOM(sliderFrame, "sliderFrame")
-GK_ATOM(tableCaptionFrame, "TableCaptionFrame")
GK_ATOM(tableCellFrame, "TableCellFrame")
GK_ATOM(tableColFrame, "TableColFrame")
GK_ATOM(tableColGroupFrame, "TableColGroupFrame")
GK_ATOM(tableFrame, "TableFrame")
GK_ATOM(tableOuterFrame, "TableOuterFrame")
GK_ATOM(tableRowGroupFrame, "TableRowGroupFrame")
GK_ATOM(tableRowFrame, "TableRowFrame")
GK_ATOM(textInputFrame,"TextInputFrame")
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -1923,17 +1923,17 @@ AdjustCaptionParentFrame(nsContainerFram
static bool
GetCaptionAdjustedParent(nsContainerFrame* aParentFrame,
const nsIFrame* aChildFrame,
nsContainerFrame** aAdjParentFrame)
{
*aAdjParentFrame = aParentFrame;
bool haveCaption = false;
- if (nsGkAtoms::tableCaptionFrame == aChildFrame->GetType()) {
+ if (aChildFrame->IsTableCaption()) {
haveCaption = true;
*aAdjParentFrame = ::AdjustCaptionParentFrame(aParentFrame);
}
return haveCaption;
}
void
nsCSSFrameConstructor::AdjustParentFrame(nsContainerFrame** aParentFrame,
@@ -1950,20 +1950,20 @@ nsCSSFrameConstructor::AdjustParentFrame
*aParentFrame = ::AdjustCaptionParentFrame(*aParentFrame);
}
}
// Pull all the captions present in aItems out into aCaptions
static void
PullOutCaptionFrames(nsFrameItems& aItems, nsFrameItems& aCaptions)
{
- nsIFrame *child = aItems.FirstChild();
+ nsIFrame* child = aItems.FirstChild();
while (child) {
- nsIFrame *nextSibling = child->GetNextSibling();
- if (nsGkAtoms::tableCaptionFrame == child->GetType()) {
+ nsIFrame* nextSibling = child->GetNextSibling();
+ if (child->IsTableCaption()) {
aItems.RemoveFrame(child);
aCaptions.AddChild(child);
}
child = nextSibling;
}
}
@@ -8603,24 +8603,28 @@ nsCSSFrameConstructor::CreateContinuingF
if (nsGkAtoms::textFrame == frameType) {
newFrame = NS_NewContinuingTextFrame(shell, styleContext);
newFrame->Init(content, aParentFrame, aFrame);
} else if (nsGkAtoms::inlineFrame == frameType) {
newFrame = NS_NewInlineFrame(shell, styleContext);
newFrame->Init(content, aParentFrame, aFrame);
} else if (nsGkAtoms::blockFrame == frameType) {
+ MOZ_ASSERT(!aFrame->IsTableCaption(),
+ "no support for fragmenting table captions yet");
newFrame = NS_NewBlockFrame(shell, styleContext);
newFrame->Init(content, aParentFrame, aFrame);
#ifdef MOZ_XUL
} else if (nsGkAtoms::XULLabelFrame == frameType) {
newFrame = NS_NewXULLabelFrame(shell, styleContext);
newFrame->Init(content, aParentFrame, aFrame);
#endif
} else if (nsGkAtoms::columnSetFrame == frameType) {
+ MOZ_ASSERT(!aFrame->IsTableCaption(),
+ "no support for fragmenting table captions yet");
newFrame = NS_NewColumnSetFrame(shell, styleContext, nsFrameState(0));
newFrame->Init(content, aParentFrame, aFrame);
} else if (nsGkAtoms::pageFrame == frameType) {
nsContainerFrame* canvasFrame;
newFrame = ConstructPageFrame(shell, aPresContext, aParentFrame, aFrame,
canvasFrame);
} else if (nsGkAtoms::tableOuterFrame == frameType) {
newFrame =
@@ -9073,17 +9077,17 @@ nsCSSFrameConstructor::MaybeRecreateCont
// pseudo parent was created for the space, and should now be removed.
(IsWhitespaceFrame(aFrame) &&
parent->PrincipalChildList().OnlyChild()) ||
// If we're a table-column-group, then the GetFirstChild check above is
// not going to catch cases when we're the first child.
(inFlowFrame->GetType() == nsGkAtoms::tableColGroupFrame &&
parent->GetFirstChild(nsIFrame::kColGroupList) == inFlowFrame) ||
// Similar if we're a table-caption.
- (inFlowFrame->GetType() == nsGkAtoms::tableCaptionFrame &&
+ (inFlowFrame->IsTableCaption() &&
parent->GetFirstChild(nsIFrame::kCaptionList) == inFlowFrame)) {
// We're the first or last frame in the pseudo. Need to reframe.
// Good enough to recreate frames for |parent|'s content
*aResult = RecreateFramesForContent(parent->GetContent(), true, aFlags,
aDestroyedFramesFor);
return true;
}
}
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -1129,17 +1129,17 @@ nsLayoutUtils::GetChildListNameFor(nsIFr
? nsIFrame::kPopupList
: nsIFrame::kPrincipalList;
}
} else {
id = nsIFrame::kPrincipalList;
}
} else if (nsGkAtoms::tableColGroupFrame == childType) {
id = nsIFrame::kColGroupList;
- } else if (nsGkAtoms::tableCaptionFrame == childType) {
+ } else if (aChildFrame->IsTableCaption()) {
id = nsIFrame::kCaptionList;
} else {
id = nsIFrame::kPrincipalList;
}
}
#ifdef DEBUG
// Verify that the frame is actually in that child list or in the
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -9447,17 +9447,16 @@ void DR_State::InitFrameTypeTable()
AddFrameTypeInfo(nsGkAtoms::lineFrame, "line", "line");
AddFrameTypeInfo(nsGkAtoms::listControlFrame, "select", "select");
AddFrameTypeInfo(nsGkAtoms::objectFrame, "obj", "object");
AddFrameTypeInfo(nsGkAtoms::pageFrame, "page", "page");
AddFrameTypeInfo(nsGkAtoms::placeholderFrame, "place", "placeholder");
AddFrameTypeInfo(nsGkAtoms::canvasFrame, "canvas", "canvas");
AddFrameTypeInfo(nsGkAtoms::rootFrame, "root", "root");
AddFrameTypeInfo(nsGkAtoms::scrollFrame, "scroll", "scroll");
- AddFrameTypeInfo(nsGkAtoms::tableCaptionFrame, "caption", "tableCaption");
AddFrameTypeInfo(nsGkAtoms::tableCellFrame, "cell", "tableCell");
AddFrameTypeInfo(nsGkAtoms::bcTableCellFrame, "bcCell", "bcTableCell");
AddFrameTypeInfo(nsGkAtoms::tableColFrame, "col", "tableCol");
AddFrameTypeInfo(nsGkAtoms::tableColGroupFrame, "colG", "tableColGroup");
AddFrameTypeInfo(nsGkAtoms::tableFrame, "tbl", "table");
AddFrameTypeInfo(nsGkAtoms::tableOuterFrame, "tblO", "tableOuter");
AddFrameTypeInfo(nsGkAtoms::tableRowGroupFrame, "rowG", "tableRowGroup");
AddFrameTypeInfo(nsGkAtoms::tableRowFrame, "row", "tableRow");
--- a/layout/generic/nsIFrame.h
+++ b/layout/generic/nsIFrame.h
@@ -2867,16 +2867,21 @@ NS_PTR_TO_INT32(frame->Properties().Get(
* Is this a flex item? (i.e. a non-abs-pos child of a flex container)
*/
inline bool IsFlexItem() const;
/**
* Is this a flex or grid item? (i.e. a non-abs-pos child of a flex/grid container)
*/
inline bool IsFlexOrGridItem() const;
+ /**
+ * @return true if this frame is used as a table caption.
+ */
+ inline bool IsTableCaption() const;
+
inline bool IsBlockInside() const;
inline bool IsBlockOutside() const;
inline bool IsInlineOutside() const;
inline uint8_t GetDisplay() const;
inline bool IsFloating() const;
inline bool IsPositioned() const;
inline bool IsRelativelyPositioned() const;
inline bool IsAbsolutelyPositioned() const;
--- a/layout/generic/nsIFrameInlines.h
+++ b/layout/generic/nsIFrameInlines.h
@@ -4,16 +4,17 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsIFrameInlines_h___
#define nsIFrameInlines_h___
#include "nsContainerFrame.h"
#include "nsStyleStructInlines.h"
+#include "nsCSSAnonBoxes.h"
bool
nsIFrame::IsFlexItem() const
{
return GetParent() &&
GetParent()->GetType() == nsGkAtoms::flexContainerFrame &&
!(GetStateBits() & NS_FRAME_OUT_OF_FLOW);
}
@@ -26,16 +27,23 @@ nsIFrame::IsFlexOrGridItem() const
return (t == nsGkAtoms::flexContainerFrame ||
t == nsGkAtoms::gridContainerFrame) &&
!(GetStateBits() & NS_FRAME_OUT_OF_FLOW);
}
return false;
}
bool
+nsIFrame::IsTableCaption() const
+{
+ return StyleDisplay()->mDisplay == NS_STYLE_DISPLAY_TABLE_CAPTION &&
+ GetParent()->StyleContext()->GetPseudo() == nsCSSAnonBoxes::tableOuter;
+}
+
+bool
nsIFrame::IsFloating() const
{
return StyleDisplay()->IsFloating(this);
}
bool
nsIFrame::IsPositioned() const
{
--- a/layout/tables/nsTableOuterFrame.cpp
+++ b/layout/tables/nsTableOuterFrame.cpp
@@ -16,16 +16,17 @@
#include "prinrval.h"
#include "nsGkAtoms.h"
#include "nsHTMLParts.h"
#include "nsIPresShell.h"
#include "nsIServiceManager.h"
#include "nsIDOMNode.h"
#include "nsDisplayList.h"
#include "nsLayoutUtils.h"
+#include "nsIFrameInlines.h"
#include <algorithm>
using namespace mozilla;
using namespace mozilla::layout;
#define NO_SIDE 100
/* virtual */ nscoord
@@ -111,17 +112,17 @@ nsTableOuterFrame::SetInitialChildList(C
void
nsTableOuterFrame::AppendFrames(ChildListID aListID,
nsFrameList& aFrameList)
{
// We only have two child frames: the inner table and a caption frame.
// The inner frame is provided when we're initialized, and it cannot change
MOZ_ASSERT(kCaptionList == aListID, "unexpected child list");
MOZ_ASSERT(aFrameList.IsEmpty() ||
- aFrameList.FirstChild()->GetType() == nsGkAtoms::tableCaptionFrame,
+ aFrameList.FirstChild()->IsTableCaption(),
"appending non-caption frame to captionList");
mCaptionFrames.AppendFrames(this, aFrameList);
// Reflow the new caption frame. It's already marked dirty, so
// just tell the pres shell.
PresContext()->PresShell()->
FrameNeedsReflow(this, nsIPresShell::eTreeChange,
NS_FRAME_HAS_DIRTY_CHILDREN);
@@ -129,17 +130,17 @@ nsTableOuterFrame::AppendFrames(ChildLis
void
nsTableOuterFrame::InsertFrames(ChildListID aListID,
nsIFrame* aPrevFrame,
nsFrameList& aFrameList)
{
MOZ_ASSERT(kCaptionList == aListID, "unexpected child list");
MOZ_ASSERT(aFrameList.IsEmpty() ||
- aFrameList.FirstChild()->GetType() == nsGkAtoms::tableCaptionFrame,
+ aFrameList.FirstChild()->IsTableCaption(),
"inserting non-caption frame into captionList");
MOZ_ASSERT(!aPrevFrame || aPrevFrame->GetParent() == this,
"inserting after sibling frame with different parent");
mCaptionFrames.InsertFrames(nullptr, aPrevFrame, aFrameList);
// Reflow the new caption frame. It's already marked dirty, so
// just tell the pres shell.
PresContext()->PresShell()->