Skip to content

Commit

Permalink
Bug 1644468 - Invalidate XUL trees when window focus changes. r=miko
Browse files Browse the repository at this point in the history
  • Loading branch information
mstange committed Jun 11, 2020
1 parent 753b48e commit 9d49a15
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
18 changes: 18 additions & 0 deletions layout/painting/nsDisplayListInvalidation.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,24 @@ class nsDisplayThemedBackgroundGeometry : public nsDisplayItemGeometry {
bool mWindowIsActive;
};

class nsDisplayTreeBodyGeometry
: public nsDisplayItemGenericGeometry,
public nsImageGeometryMixin<nsDisplayTreeBodyGeometry> {
public:
nsDisplayTreeBodyGeometry(nsDisplayItem* aItem,
nsDisplayListBuilder* aBuilder,
bool aWindowIsActive)
: nsDisplayItemGenericGeometry(aItem, aBuilder),
nsImageGeometryMixin(aItem, aBuilder),
mWindowIsActive(aWindowIsActive) {}

bool InvalidateForSyncDecodeImages() const override {
return ShouldInvalidateToSyncDecodeImages();
}

bool mWindowIsActive = false;
};

class nsDisplayBoxShadowInnerGeometry : public nsDisplayItemGeometry {
public:
nsDisplayBoxShadowInnerGeometry(nsDisplayItem* aItem,
Expand Down
18 changes: 12 additions & 6 deletions layout/xul/tree/nsTreeBodyFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2481,22 +2481,28 @@ class nsDisplayTreeBody final : public nsPaintedDisplayItem {

nsDisplayItemGeometry* AllocateGeometry(
nsDisplayListBuilder* aBuilder) override {
return new nsDisplayItemGenericImageGeometry(this, aBuilder);
return new nsDisplayTreeBodyGeometry(this, aBuilder, IsWindowActive());
}

void Destroy(nsDisplayListBuilder* aBuilder) override {
aBuilder->UnregisterThemeGeometry(this);
nsPaintedDisplayItem::Destroy(aBuilder);
}

bool IsWindowActive() const {
EventStates docState =
mFrame->PresContext()->Document()->GetDocumentState();
return !docState.HasState(NS_DOCUMENT_STATE_WINDOW_INACTIVE);
}

void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
const nsDisplayItemGeometry* aGeometry,
nsRegion* aInvalidRegion) const override {
auto geometry =
static_cast<const nsDisplayItemGenericImageGeometry*>(aGeometry);
auto geometry = static_cast<const nsDisplayTreeBodyGeometry*>(aGeometry);

if (aBuilder->ShouldSyncDecodeImages() &&
geometry->ShouldInvalidateToSyncDecodeImages()) {
if ((aBuilder->ShouldSyncDecodeImages() &&
geometry->ShouldInvalidateToSyncDecodeImages()) ||
IsWindowActive() != geometry->mWindowIsActive) {
bool snap;
aInvalidRegion->Or(*aInvalidRegion, GetBounds(aBuilder, &snap));
}
Expand All @@ -2514,7 +2520,7 @@ class nsDisplayTreeBody final : public nsPaintedDisplayItem {
ImgDrawResult result = static_cast<nsTreeBodyFrame*>(mFrame)->PaintTreeBody(
*aCtx, GetPaintRect(), ToReferenceFrame(), aBuilder);

nsDisplayItemGenericImageGeometry::UpdateDrawResult(this, result);
nsDisplayTreeBodyGeometry::UpdateDrawResult(this, result);
}

NS_DISPLAY_DECL_NAME("XULTreeBody", TYPE_XUL_TREE_BODY)
Expand Down

0 comments on commit 9d49a15

Please sign in to comment.