author | Andrew Comminos <andrew@comminos.com> |
Mon, 30 May 2016 16:03:50 -0400 | |
changeset 340849 | 952eae508967ae46d36909d179159f2a2205169c |
parent 340848 | 259734abfe3a734aaa1b93dedf39adb9cce0a3ff |
child 340850 | 8e4a3ad34c694dce33e7c12fdb8e7ff681e93dae |
push id | 1183 |
push user | raliiev@mozilla.com |
push date | Mon, 05 Sep 2016 20:01:49 +0000 |
treeherder | mozilla-release@3148731bed45 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | mattwoodrow |
bugs | 1276734 |
milestone | 49.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
|
layout/tables/nsTableFrame.cpp | file | annotate | diff | comparison | revisions | |
layout/tables/nsTableFrame.h | file | annotate | diff | comparison | revisions |
--- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -1112,17 +1112,17 @@ void nsDisplayTableItem::ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder, const nsDisplayItemGeometry* aGeometry, nsRegion *aInvalidRegion) { auto geometry = static_cast<const nsDisplayTableItemGeometry*>(aGeometry); bool invalidateForAttachmentFixed = false; - if (mPartHasFixedBackground) { + if (mDrawsBackground && mPartHasFixedBackground) { nsPoint frameOffsetToViewport = mFrame->GetOffsetTo( mFrame->PresContext()->PresShell()->GetRootFrame()); invalidateForAttachmentFixed = frameOffsetToViewport != geometry->mFrameOffsetToViewport; } if (invalidateForAttachmentFixed || (aBuilder->ShouldSyncDecodeImages() && @@ -1132,18 +1132,19 @@ nsDisplayTableItem::ComputeInvalidationR } nsDisplayItem::ComputeInvalidationRegion(aBuilder, aGeometry, aInvalidRegion); } class nsDisplayTableBorderBackground : public nsDisplayTableItem { public: nsDisplayTableBorderBackground(nsDisplayListBuilder* aBuilder, - nsTableFrame* aFrame) : - nsDisplayTableItem(aBuilder, aFrame) { + nsTableFrame* aFrame, + bool aDrawsBackground) : + nsDisplayTableItem(aBuilder, aFrame, aDrawsBackground) { MOZ_COUNT_CTOR(nsDisplayTableBorderBackground); } #ifdef NS_BUILD_REFCNT_LOGGING virtual ~nsDisplayTableBorderBackground() { MOZ_COUNT_DTOR(nsDisplayTableBorderBackground); } #endif @@ -1316,35 +1317,36 @@ void nsTableFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DO_GLOBAL_REFLOW_COUNT_DSP_COLOR("nsTableFrame", NS_RGB(255,128,255)); nsDisplayTableItem* item = nullptr; if (IsVisibleInSelection(aBuilder)) { + nsMargin deflate = GetDeflationForBackground(PresContext()); if (StyleVisibility()->IsVisible()) { - nsMargin deflate = GetDeflationForBackground(PresContext()); // If 'deflate' is (0,0,0,0) then we can paint the table background // in its own display item, so do that to take advantage of // opacity and visibility optimizations if (deflate == nsMargin(0, 0, 0, 0)) { DisplayBackgroundUnconditional(aBuilder, aLists, false); } } // This background is created if any of the table parts are visible, // or if we're doing event handling (since DisplayGenericTablePart // needs the item for the |sortEventBackgrounds|-dependent code). // Specific visibility decisions are delegated to the table background // painter, which handles borders and backgrounds for the table. if (aBuilder->IsForEventDelivery() || AnyTablePartHasBorderOrBackground(this, GetNextSibling()) || AnyTablePartHasBorderOrBackground(mColGroups.FirstChild(), nullptr)) { - item = new (aBuilder) nsDisplayTableBorderBackground(aBuilder, this); + item = new (aBuilder) nsDisplayTableBorderBackground(aBuilder, this, + deflate != nsMargin(0, 0, 0, 0)); aLists.BorderBackground()->AppendNewToTop(item); } } DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists, item); if (item) { UpdateItemForColGroupBackgrounds(item, mColGroups); } }
--- a/layout/tables/nsTableFrame.h +++ b/layout/tables/nsTableFrame.h @@ -43,35 +43,38 @@ static inline bool FrameHasBorderOrBackg (!f->StyleBackground()->IsTransparent() || f->StyleDisplay()->mAppearance || f->StyleBorder()->HasBorder())); } class nsDisplayTableItem : public nsDisplayItem { public: - nsDisplayTableItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) : + nsDisplayTableItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, + bool aDrawsBackground = true) : nsDisplayItem(aBuilder, aFrame), - mPartHasFixedBackground(false) {} + mPartHasFixedBackground(false), + mDrawsBackground(aDrawsBackground) {} // With collapsed borders, parts of the collapsed border can extend outside // the table part frames, so allow this display element to blow out to our // overflow rect. This is also useful for row frames that have spanning // cells extending outside them. virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) override; virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override; virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder, const nsDisplayItemGeometry* aGeometry, nsRegion *aInvalidRegion) override; void UpdateForFrameBackground(nsIFrame* aFrame); private: bool mPartHasFixedBackground; + bool mDrawsBackground; }; class nsAutoPushCurrentTableItem { public: nsAutoPushCurrentTableItem() : mBuilder(nullptr) {} void Push(nsDisplayListBuilder* aBuilder, nsDisplayTableItem* aPushItem)