author | Xidorn Quan <quanxunzhen@gmail.com> |
Thu, 30 Apr 2015 18:27:54 +1200 | |
changeset 241749 | 91674f65637c7552e2e81d5148c3334a4b155eb2 |
parent 241748 | 1b5fc672f0d457311015f21585b4b512fdf219ba |
child 241750 | 9dce4112cd949b897adf6a4a09a7c881251e92e8 |
push id | 28669 |
push user | ryanvm@gmail.com |
push date | Thu, 30 Apr 2015 17:57:05 +0000 |
treeherder | mozilla-central@7723b15ea695 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 1159101 |
milestone | 40.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -1389,28 +1389,16 @@ nsFrameConstructorSaveState::~nsFrameCon #endif } } NS_ASSERTION(!mItems->LastChild() || !mItems->LastChild()->GetNextSibling(), "Something corrupted our list"); } } -static -bool IsBorderCollapse(nsIFrame* aFrame) -{ - for (nsIFrame* frame = aFrame; frame; frame = frame->GetParent()) { - if (nsGkAtoms::tableFrame == frame->GetType()) { - return ((nsTableFrame*)frame)->IsBorderCollapse(); - } - } - NS_ASSERTION(false, "program error"); - return false; -} - /** * Moves aFrameList from aOldParent to aNewParent. This updates the parent * pointer of the frames in the list, and reparents their views as needed. * nsFrame::SetParent sets the NS_FRAME_HAS_VIEW bit on aNewParent and its * ancestors as needed. Then it sets the list as the initial child list * on aNewParent, unless aNewParent either already has kids or has been * reflowed; in that case it appends the new frames. Note that this * method differs from ReparentFrames in that it doesn't change the kids' @@ -2182,32 +2170,34 @@ nsCSSFrameConstructor::ConstructTableCel { NS_PRECONDITION(aDisplay->mDisplay == NS_STYLE_DISPLAY_TABLE_CELL, "Unexpected call"); nsIContent* const content = aItem.mContent; nsStyleContext* const styleContext = aItem.mStyleContext; const uint32_t nameSpaceID = aItem.mNameSpaceID; - bool borderCollapse = IsBorderCollapse(aParentFrame); + nsTableFrame* tableFrame = + static_cast<nsTableRowFrame*>(aParentFrame)->GetTableFrame(); nsContainerFrame* newFrame; // <mtable> is border separate in mathml.css and the MathML code doesn't implement // border collapse. For those users who style <mtable> with border collapse, // give them the default non-MathML table frames that understand border collapse. // This won't break us because MathML table frames are all subclasses of the default // table code, and so we can freely mix <mtable> with <mtr> or <tr>, <mtd> or <td>. // What will happen is just that non-MathML frames won't understand MathML attributes // and will therefore miss the special handling that the MathML code does. - if (kNameSpaceID_MathML == nameSpaceID && !borderCollapse) - newFrame = NS_NewMathMLmtdFrame(mPresShell, styleContext); - else + if (kNameSpaceID_MathML == nameSpaceID && !tableFrame->IsBorderCollapse()) { + newFrame = NS_NewMathMLmtdFrame(mPresShell, styleContext, tableFrame); + } else { // Warning: If you change this and add a wrapper frame around table cell // frames, make sure Bug 368554 doesn't regress! // See IsInAutoWidthTableCellForQuirk() in nsImageFrame.cpp. - newFrame = NS_NewTableCellFrame(mPresShell, styleContext, borderCollapse); + newFrame = NS_NewTableCellFrame(mPresShell, styleContext, tableFrame); + } // Initialize the table cell frame InitAndRestoreFrame(aState, content, aParentFrame, newFrame); // Resolve pseudo style and initialize the body cell frame nsRefPtr<nsStyleContext> innerPseudoStyle; innerPseudoStyle = mPresShell->StyleSet()-> ResolveAnonymousBoxStyle(nsCSSAnonBoxes::cellContent, styleContext); @@ -8694,18 +8684,20 @@ nsCSSFrameConstructor::CreateContinuingF rowFrame->SetInitialChildList(kPrincipalList, newChildList); newFrame = rowFrame; } else if (IS_TABLE_CELL(frameType)) { // Warning: If you change this and add a wrapper frame around table cell // frames, make sure Bug 368554 doesn't regress! // See IsInAutoWidthTableCellForQuirk() in nsImageFrame.cpp. + nsTableFrame* tableFrame = + static_cast<nsTableRowFrame*>(aParentFrame)->GetTableFrame(); nsTableCellFrame* cellFrame = - NS_NewTableCellFrame(shell, styleContext, IsBorderCollapse(aParentFrame)); + NS_NewTableCellFrame(shell, styleContext, tableFrame); cellFrame->Init(content, aParentFrame, aFrame); if (cellFrame->GetStateBits() & NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN) { nsTableFrame::RegisterPositionedTablePart(cellFrame); } // Create a continuing area frame nsIFrame* blockFrame = aFrame->GetFirstPrincipalChild();
--- a/layout/generic/nsHTMLParts.h +++ b/layout/generic/nsHTMLParts.h @@ -191,17 +191,17 @@ NS_NewTableColGroupFrame(nsIPresShell* a class nsTableRowFrame; nsTableRowFrame* NS_NewTableRowFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); class nsTableRowGroupFrame; nsTableRowGroupFrame* NS_NewTableRowGroupFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); class nsTableCellFrame; nsTableCellFrame* -NS_NewTableCellFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, bool aIsBorderCollapse); +NS_NewTableCellFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, nsTableFrame* aTableFrame); nsresult NS_NewHTMLContentSink(nsIHTMLContentSink** aInstancePtrResult, nsIDocument* aDoc, nsIURI* aURL, nsISupports* aContainer, // e.g. docshell nsIChannel* aChannel); nsresult NS_NewHTMLFragmentContentSink(nsIFragmentContentSink** aInstancePtrResult);
--- a/layout/mathml/nsMathMLParts.h +++ b/layout/mathml/nsMathMLParts.h @@ -4,16 +4,18 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef nsMathMLParts_h___ #define nsMathMLParts_h___ #include "nscore.h" #include "nsISupports.h" +class nsTableFrame; + // Factory methods for creating MathML objects nsIFrame* NS_NewMathMLTokenFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmoFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmrowFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmpaddedFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmspaceFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmsFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmfencedFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); @@ -21,17 +23,17 @@ nsIFrame* NS_NewMathMLmfracFrame(nsIPres nsIFrame* NS_NewMathMLmsubFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmsupFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmsubsupFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmunderoverFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmmultiscriptsFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsContainerFrame* NS_NewMathMLmtableOuterFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsContainerFrame* NS_NewMathMLmtableFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsContainerFrame* NS_NewMathMLmtrFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); -nsContainerFrame* NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); +nsContainerFrame* NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, nsTableFrame* aTableFrame); nsContainerFrame* NS_NewMathMLmtdInnerFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmsqrtFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmrootFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmactionFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLmencloseFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsIFrame* NS_NewMathMLsemanticsFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); nsContainerFrame* NS_NewMathMLmathBlockFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, nsFrameState aFlags);
--- a/layout/mathml/nsMathMLmtableFrame.cpp +++ b/layout/mathml/nsMathMLmtableFrame.cpp @@ -1102,19 +1102,20 @@ nsMathMLmtrFrame::AttributeChanged(int32 return NS_OK; } // -------- // implementation of nsMathMLmtdFrame nsContainerFrame* -NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) +NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, + nsTableFrame* aTableFrame) { - return new (aPresShell) nsMathMLmtdFrame(aContext); + return new (aPresShell) nsMathMLmtdFrame(aContext, aTableFrame); } NS_IMPL_FRAMEARENA_HELPERS(nsMathMLmtdFrame) nsMathMLmtdFrame::~nsMathMLmtdFrame() { }
--- a/layout/mathml/nsMathMLmtableFrame.h +++ b/layout/mathml/nsMathMLmtableFrame.h @@ -233,17 +233,18 @@ protected: // -------------- class nsMathMLmtdFrame : public nsTableCellFrame { public: NS_DECL_FRAMEARENA_HELPERS friend nsContainerFrame* NS_NewMathMLmtdFrame(nsIPresShell* aPresShell, - nsStyleContext* aContext); + nsStyleContext* aContext, + nsTableFrame* aTableFrame); // overloaded nsTableCellFrame methods virtual void Init(nsIContent* aContent, nsContainerFrame* aParent, nsIFrame* aPrevInFlow) override; virtual nsresult @@ -263,17 +264,18 @@ public: return nsTableCellFrame::IsFrameOfType(aFlags & ~(nsIFrame::eMathML)); } virtual nsMargin* GetBorderWidth(nsMargin& aBorder) const override; virtual nsMargin GetBorderOverflow() override; protected: - explicit nsMathMLmtdFrame(nsStyleContext* aContext) : nsTableCellFrame(aContext) {} + nsMathMLmtdFrame(nsStyleContext* aContext, nsTableFrame* aTableFrame) + : nsTableCellFrame(aContext, aTableFrame) {} virtual ~nsMathMLmtdFrame(); }; // class nsMathMLmtdFrame // -------------- class nsMathMLmtdInnerFrame : public nsBlockFrame, public nsMathMLFrame { public:
--- a/layout/tables/nsTableCellFrame.cpp +++ b/layout/tables/nsTableCellFrame.cpp @@ -37,19 +37,20 @@ //TABLECELL SELECTION #include "nsFrameSelection.h" #include "mozilla/LookAndFeel.h" using namespace mozilla; using namespace mozilla::gfx; using namespace mozilla::image; -nsTableCellFrame::nsTableCellFrame(nsStyleContext* aContext) : - nsContainerFrame(aContext) - , mDesiredSize(WritingMode()) +nsTableCellFrame::nsTableCellFrame(nsStyleContext* aContext, + nsTableFrame* aTableFrame) + : nsContainerFrame(aContext) + , mDesiredSize(aTableFrame->GetWritingMode()) { mColIndex = 0; mPriorAvailWidth = 0; SetContentEmpty(false); SetHasPctOverHeight(false); } @@ -1064,22 +1065,22 @@ nsTableCellFrame::GetCellIndexes(int32_t } aColIndex = mColIndex; return NS_OK; } nsTableCellFrame* NS_NewTableCellFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, - bool aIsBorderCollapse) + nsTableFrame* aTableFrame) { - if (aIsBorderCollapse) - return new (aPresShell) nsBCTableCellFrame(aContext); + if (aTableFrame->IsBorderCollapse()) + return new (aPresShell) nsBCTableCellFrame(aContext, aTableFrame); else - return new (aPresShell) nsTableCellFrame(aContext); + return new (aPresShell) nsTableCellFrame(aContext, aTableFrame); } NS_IMPL_FRAMEARENA_HELPERS(nsBCTableCellFrame) nsMargin* nsTableCellFrame::GetBorderWidth(nsMargin& aBorder) const { aBorder = StyleBorder()->GetComputedBorder(); @@ -1097,18 +1098,19 @@ nsresult nsTableCellFrame::GetFrameName(nsAString& aResult) const { return MakeFrameName(NS_LITERAL_STRING("TableCell"), aResult); } #endif // nsBCTableCellFrame -nsBCTableCellFrame::nsBCTableCellFrame(nsStyleContext* aContext) -:nsTableCellFrame(aContext) +nsBCTableCellFrame::nsBCTableCellFrame(nsStyleContext* aContext, + nsTableFrame* aTableFrame) + : nsTableCellFrame(aContext, aTableFrame) { mTopBorder = mRightBorder = mBottomBorder = mLeftBorder = 0; } nsBCTableCellFrame::~nsBCTableCellFrame() { }
--- a/layout/tables/nsTableCellFrame.h +++ b/layout/tables/nsTableCellFrame.h @@ -37,17 +37,17 @@ class nsTableCellFrame : public nsContai public: NS_DECL_QUERYFRAME_TARGET(nsTableCellFrame) NS_DECL_QUERYFRAME NS_DECL_FRAMEARENA_HELPERS // default constructor supplied by the compiler - explicit nsTableCellFrame(nsStyleContext* aContext); + nsTableCellFrame(nsStyleContext* aContext, nsTableFrame* aTableFrame); ~nsTableCellFrame(); nsTableRowFrame* GetTableRowFrame() const { nsIFrame* parent = GetParent(); MOZ_ASSERT(parent && parent->GetType() == nsGkAtoms::tableRowFrame); return static_cast<nsTableRowFrame*>(parent); } @@ -91,23 +91,16 @@ public: } virtual nsMargin GetUsedMargin() const override; virtual void NotifyPercentHeight(const nsHTMLReflowState& aReflowState) override; virtual bool NeedsToObserve(const nsHTMLReflowState& aReflowState) override; - /** instantiate a new instance of nsTableRowFrame. - * @param aPresShell the pres shell for this frame - * - * @return the frame that was created - */ - friend nsIFrame* NS_NewTableCellFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); - virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; DrawResult PaintCellBackground(nsRenderingContext& aRenderingContext, const nsRect& aDirtyRect, nsPoint aPt, uint32_t aFlags); @@ -310,17 +303,17 @@ inline void nsTableCellFrame::SetHasPctO // nsBCTableCellFrame class nsBCTableCellFrame final : public nsTableCellFrame { typedef mozilla::image::DrawResult DrawResult; public: NS_DECL_FRAMEARENA_HELPERS - explicit nsBCTableCellFrame(nsStyleContext* aContext); + nsBCTableCellFrame(nsStyleContext* aContext, nsTableFrame* aTableFrame); ~nsBCTableCellFrame(); virtual nsIAtom* GetType() const override; virtual nsMargin GetUsedBorder() const override; virtual bool GetBorderRadii(const nsSize& aFrameSize, const nsSize& aBorderArea,