| Index: third_party/WebKit/Source/core/paint/ViewPaintInvalidator.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/ViewPaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/ViewPaintInvalidator.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1527c8d002efbf2456323a86a9ff4955677e30b3
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/paint/ViewPaintInvalidator.cpp
|
| @@ -0,0 +1,51 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "core/paint/ViewPaintInvalidator.h"
|
| +
|
| +#include "core/layout/LayoutView.h"
|
| +#include "core/paint/BoxPaintInvalidator.h"
|
| +#include "platform/geometry/LayoutSize.h"
|
| +
|
| +namespace blink {
|
| +
|
| +PaintInvalidationReason ViewPaintInvalidator::invalidatePaintIfNeeded() {
|
| + invalidateBackgroundIfNeeded();
|
| + return BoxPaintInvalidator(m_view, m_context).invalidatePaintIfNeeded();
|
| +}
|
| +
|
| +void ViewPaintInvalidator::invalidateBackgroundIfNeeded() {
|
| + // Fixed attachment background is handled in LayoutView::layout().
|
| + // TODO(wangxianzhu): Combine code for fixed-attachment background when we
|
| + // enable rootLayerScrolling permanently.
|
| + if (m_view.styleRef().hasEntirelyFixedBackground())
|
| + return;
|
| +
|
| + // LayoutView's non-fixed-attachment background is positioned in the
|
| + // document element.
|
| + // See https://drafts.csswg.org/css-backgrounds-3/#root-background.
|
| + Element* documentElement = m_view.document().documentElement();
|
| + if (!documentElement)
|
| + return;
|
| + const LayoutObject* backgroundObject = documentElement->layoutObject();
|
| + if (!backgroundObject || !backgroundObject->isBox())
|
| + return;
|
| +
|
| + const LayoutBox& backgroundBox = toLayoutBox(*backgroundObject);
|
| + LayoutSize oldSize = BoxPaintInvalidator::previousBorderBoxSize(
|
| + backgroundBox, backgroundBox.visualRect().size());
|
| + LayoutSize newSize = backgroundBox.size();
|
| + const auto& backgroundLayers = m_view.styleRef().backgroundLayers();
|
| + if ((oldSize.width() != newSize.width() &&
|
| + LayoutBox::mustInvalidateFillLayersPaintOnWidthChange(
|
| + backgroundLayers)) ||
|
| + (oldSize.height() != newSize.height() &&
|
| + LayoutBox::mustInvalidateFillLayersPaintOnHeightChange(
|
| + backgroundLayers))) {
|
| + m_view.getMutableForPainting().setShouldDoFullPaintInvalidation(
|
| + PaintInvalidationViewBackground);
|
| + }
|
| +}
|
| +
|
| +} // namespace blink
|
|
|