| Index: third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
|
| index 6c6ec933ce0598843aae45578a2128c3483ef273..a757f5e362f632e2d3b2cd70e1061308f658b884 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
|
| @@ -33,6 +33,7 @@
|
| #include "core/layout/LayoutFlexibleBox.h"
|
| #include "core/layout/LayoutGeometryMap.h"
|
| #include "core/layout/LayoutInline.h"
|
| +#include "core/layout/LayoutTheme.h"
|
| #include "core/layout/LayoutView.h"
|
| #include "core/layout/compositing/CompositedLayerMapping.h"
|
| #include "core/layout/compositing/PaintLayerCompositor.h"
|
| @@ -115,6 +116,64 @@ bool LayoutBoxModelObject::usesCompositedScrolling() const
|
| return hasOverflowClip() && hasLayer() && layer()->getScrollableArea()->usesCompositedScrolling();
|
| }
|
|
|
| +bool LayoutBoxModelObject::hasLocalEquivalentBackground() const
|
| +{
|
| + int minBorderWidth = std::min(style()->borderTopWidth(),
|
| + std::min(style()->borderLeftWidth(),
|
| + std::min(style()->borderRightWidth(), style()->borderBottomWidth())));
|
| + bool outlineOverlapsPaddingBox = style()->outlineOffset() < -minBorderWidth;
|
| + bool hasCustomScrollbars = false;
|
| + // TODO(flackr): Detect opaque custom scrollbars which would cover up a border-box
|
| + // background.
|
| + if (PaintLayerScrollableArea* scrollableArea = getScrollableArea()) {
|
| + if ((scrollableArea->horizontalScrollbar() && scrollableArea->horizontalScrollbar()->isCustomScrollbar())
|
| + || (scrollableArea->verticalScrollbar() && scrollableArea->verticalScrollbar()->isCustomScrollbar())) {
|
| + hasCustomScrollbars = true;
|
| + }
|
| + }
|
| +
|
| + const FillLayer* layer = &(style()->backgroundLayers());
|
| + for (; layer; layer = layer->next()) {
|
| + if (layer->attachment() == LocalBackgroundAttachment)
|
| + continue;
|
| +
|
| + // If the outline draws inside the border, it intends to draw on top of the scroller's background,
|
| + // however because it is painted into a layer behind the scrolling contents layer we avoid auto
|
| + // promoting in this case to avoid obscuring the outline.
|
| + // TODO(flackr): Outlines should be drawn on top of the scrolling contents layer so that
|
| + // they cannot be covered up by composited scrolling contents.
|
| + if (outlineOverlapsPaddingBox)
|
| + return false;
|
| +
|
| + // Solid color layers with an effective background clip of the padding box can be treated
|
| + // as local.
|
| + if (!layer->image() && !layer->next() && resolveColor(CSSPropertyBackgroundColor).alpha() > 0) {
|
| + EFillBox clip = layer->clip();
|
| + if (clip == PaddingFillBox)
|
| + continue;
|
| + // A border box can be treated as a padding box if the border is opaque or there is
|
| + // no border and we don't have custom scrollbars.
|
| + if (clip == BorderFillBox && !hasCustomScrollbars
|
| + && (style()->borderTopWidth() == 0 || !resolveColor(CSSPropertyBorderTopColor).hasAlpha())
|
| + && (style()->borderLeftWidth() == 0 || !resolveColor(CSSPropertyBorderLeftColor).hasAlpha())
|
| + && (style()->borderRightWidth() == 0 || !resolveColor(CSSPropertyBorderRightColor).hasAlpha())
|
| + && (style()->borderBottomWidth() == 0 || !resolveColor(CSSPropertyBorderBottomColor).hasAlpha())) {
|
| + continue;
|
| + }
|
| + // A content fill box can be treated as a padding fill box if there is no padding.
|
| + if (clip == ContentFillBox
|
| + && style()->paddingTop().isZero()
|
| + && style()->paddingLeft().isZero()
|
| + && style()->paddingRight().isZero()
|
| + && style()->paddingBottom().isZero()) {
|
| + continue;
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| LayoutBoxModelObject::~LayoutBoxModelObject()
|
| {
|
| // Our layer should have been destroyed and cleared by now
|
|
|