Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1054)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2068723002: Paint local attachment backgrounds into composited scrolling contents layer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add/update tests and simplify added code. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index 37bc6617ca0184dea77755ea2bbc5af1699b06f7..af3a2979283bf32270c390a39f620fa1ab44d673 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -704,15 +704,36 @@ FloatQuad LayoutBox::absoluteContentQuad() const
return localToAbsoluteQuad(FloatRect(rect));
}
-LayoutRect LayoutBox::backgroundClipRect() const
-{
- // TODO(flackr): Check for the maximum background clip rect.
- switch (style()->backgroundClip()) {
+LayoutRect LayoutBox::backgroundRect(BackgroundRectOpacity rectOpacity) const
trchen 2016/08/13 00:14:08 I'm worried about the semantic of this function be
flackr 2016/08/16 17:52:51 When called with OpaqueBackgroundRect from backgro
trchen 2016/08/17 01:22:55 Great idea. It totally sounds clearer!
+{
+ EFillBox backgroundBox = TextFillBox;
+ // Find the largest background rect of the given opaqueness.
+ if (const FillLayer* current = &(style()->backgroundLayers())) {
+ do {
+ const FillLayer* cur = current;
+ current = current->next();
+ if (rectOpacity == OpaqueBackgroundRect) {
+ if (cur->blendMode() != WebBlendModeNormal || cur->composite() != CompositeSourceOver)
+ continue;
chrishtr 2016/08/12 17:03:00 Indentation.
flackr 2016/08/16 17:52:51 Done.
+ // Check if the image or color has alpha.
+ if (const StyleImage* image = cur->image()) {
+ if (!image->knownToBeOpaque(*this))
+ continue;
+ } else {
trchen 2016/08/13 00:06:42 } if (!current->next()) { 1. A layer with translu
flackr 2016/08/16 17:52:51 Yes, that is why we continue to the next layer if
trchen 2016/08/17 01:22:55 The background color is always applicable even if
flackr 2016/08/17 18:20:55 Thanks for the clarification. Done, but needed to
+ Color backgroundColor = resolveColor(CSSPropertyBackgroundColor);
+ if (backgroundColor.hasAlpha())
+ continue;
+ }
+ }
+ EFillBox currentClip = cur->clip();
+ // Adjust clip if attachment is local.
+ if (currentClip == BorderFillBox && cur->attachment() == LocalBackgroundAttachment)
+ currentClip = PaddingFillBox;
+ backgroundBox = enclosingFillBox(backgroundBox, currentClip);
trchen 2016/08/13 00:06:42 I'm worried about this line, because the unscrolle
flackr 2016/08/16 17:52:51 Right, I think we should treat background-attachme
trchen 2016/08/17 01:22:55 Agreed. We can do that plus a comment to explain.
flackr 2016/08/17 18:20:55 Done, and added a test for this case.
+ } while (current);
+ }
+ switch (backgroundBox) {
case BorderFillBox:
- // A 'border-box' clip on scrollable elements local attachment is treated as 'padding-box'.
- // https://www.w3.org/TR/css3-background/#the-background-attachment
- if (!style()->isOverflowVisible() && style()->backgroundLayers().attachment() == LocalBackgroundAttachment)
chrishtr 2016/08/12 17:03:00 Why can you remove this?
trchen 2016/08/13 00:06:42 The matching logic is in line 730 on the right sid
- return paddingBoxRect();
return borderBoxRect();
break;
case PaddingFillBox:
@@ -1376,10 +1397,6 @@ bool LayoutBox::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) c
if (isDocumentElement() || backgroundStolenForBeingBody())
return false;
- Color backgroundColor = resolveColor(CSSPropertyBackgroundColor);
- if (backgroundColor.hasAlpha())
- return false;
-
// If the element has appearance, it might be painted by theme.
// We cannot be sure if theme paints the background opaque.
// In this case it is safe to not assume opaqueness.
@@ -1393,10 +1410,9 @@ bool LayoutBox::backgroundIsKnownToBeOpaqueInRect(const LayoutRect& localRect) c
return false;
if (hasClipPath())
return false;
- // FIXME: The background color clip is defined by the last layer.
- if (style()->backgroundLayers().next())
+ if (style()->hasBlendMode())
return false;
- return backgroundClipRect().contains(localRect);
+ return backgroundRect(OpaqueBackgroundRect).contains(localRect);
}
static bool isCandidateForOpaquenessTest(const LayoutBox& childBox)
@@ -1769,13 +1785,12 @@ void LayoutBox::mapAncestorToLocal(const LayoutBoxModelObject* ancestor, Transfo
bool isFixedPos = style()->position() == FixedPosition;
- if (style()->canContainFixedPositionObjects() && !isFixedPos) {
- // If this box has a transform or contains paint, it acts as a fixed position container for fixed descendants,
- // and may itself also be fixed position. So propagate 'fixed' up only if this box is fixed position.
+ // If this box has a transform or contains paint, it acts as a fixed position container for fixed descendants,
+ // and may itself also be fixed position. So propagate 'fixed' up only if this box is fixed position.
+ if (style()->canContainFixedPositionObjects() && !isFixedPos)
mode &= ~IsFixed;
- } else if (isFixedPos) {
+ else if (isFixedPos)
mode |= IsFixed;
- }
LayoutBoxModelObject::mapAncestorToLocal(ancestor, transformState, mode);
}

Powered by Google App Engine
This is Rietveld 408576698