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

Unified Diff: third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp

Issue 2699463004: Fix gradient background invalidation when HTML size changes (Closed)
Patch Set: - Created 3 years, 10 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/paint/BoxPaintInvalidator.cpp
diff --git a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
index 9e797d492e1dd2ef7483f973342a2050e26a5fb3..dbcdf4100ccce2776afa6a181f4e0b9d00df214b 100644
--- a/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxPaintInvalidator.cpp
@@ -312,13 +312,19 @@ PaintInvalidationReason BoxPaintInvalidator::invalidatePaintIfNeeded() {
bool BoxPaintInvalidator::needsToSavePreviousBoxGeometries() {
LayoutSize paintInvalidationSize = m_context.newVisualRect.size();
- // Don't save old box Geometries if the paint rect is empty because we'll
- // full invalidate once the paint rect becomes non-empty.
- if (paintInvalidationSize.isEmpty())
- return false;
- if (m_box.paintedOutputOfObjectHasNoEffectRegardlessOfSize())
- return false;
+ // The shortcuts doesn't apply to HTML element. ViewPaintInvalidator needs to
+ // know its previous border box size even if it has visibility:hidden (causing
+ // empty paintInvalidationSize) or has no painted output.
+ if (!m_box.node() || !m_box.node()->isHTMLElement()) {
+ // Don't save old box geometries if the paint rect is empty because we'll
+ // fully invalidate once the paint rect becomes non-empty.
+ if (paintInvalidationSize.isEmpty())
+ return false;
+
+ if (m_box.paintedOutputOfObjectHasNoEffectRegardlessOfSize())
+ return false;
+ }
const ComputedStyle& style = m_box.styleRef();
@@ -360,15 +366,26 @@ void BoxPaintInvalidator::savePreviousBoxGeometriesIfNeeded() {
m_box.getMutableForPainting().setHasPreviousBoxGeometries(true);
}
-LayoutSize BoxPaintInvalidator::previousBorderBoxSize() {
- DCHECK(m_box.hasPreviousBoxGeometries() ==
- previousBoxGeometriesMap().contains(&m_box));
- if (m_box.hasPreviousBoxGeometries())
- return previousBoxGeometriesMap().get(&m_box).borderBoxSize;
+static LayoutSize previousBorderBoxSizeInternal(const LayoutBox& box,
+ const LayoutSize& defaultSize) {
+ DCHECK(box.hasPreviousBoxGeometries() ==
+ previousBoxGeometriesMap().contains(&box));
+ if (box.hasPreviousBoxGeometries())
+ return previousBoxGeometriesMap().get(&box).borderBoxSize;
+ return defaultSize;
+}
- // We didn't save the old border box size because it was the same as the size
- // of oldVisualRect.
- return m_context.oldVisualRect.size();
+// This is used by ViewPaintInvalidator to get the previous border box size
+// of the HTML element, before the HTML element is paint invalidated.
+LayoutSize BoxPaintInvalidator::previousBorderBoxSize(const LayoutBox& box) {
chrishtr 2017/02/16 23:11:25 It's weird that there are two methods with the sam
Xianzhu 2017/02/16 23:39:35 Done.
+ return previousBorderBoxSizeInternal(box, box.visualRect().size());
+}
+
+// This is used during paint invalidation of the m_box. PaintInvalidator has
+// already updated m_box.visualRect() to the current value, so we need to use
+// context.oldVisualRect as the default value.
+LayoutSize BoxPaintInvalidator::previousBorderBoxSize() {
+ return previousBorderBoxSizeInternal(m_box, m_context.oldVisualRect.size());
}
LayoutRect BoxPaintInvalidator::previousContentBoxRect() {

Powered by Google App Engine
This is Rietveld 408576698