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

Unified Diff: third_party/WebKit/Source/core/dom/Element.cpp

Issue 2825343003: Clean compositing inputs for location APIs for sticky-affected elements. (Closed)
Patch Set: Address reviewer comments Created 3 years, 8 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/dom/Element.cpp
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp
index 3f31f0a9877d3845d5260312a9899c18ed08faaf..97c267ae2eb0575038c397b8177b0268cb7cc36a 100644
--- a/third_party/WebKit/Source/core/dom/Element.cpp
+++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -431,7 +431,7 @@ AtomicString Element::LowercaseIfNecessary(const AtomicString& name) const {
}
void Element::scrollIntoView(bool align_to_top) {
- GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheetsForNode(this);
+ EnsureLifecycleValidForLocationAPIs();
if (!GetLayoutObject())
return;
@@ -456,7 +456,7 @@ void Element::scrollIntoView(bool align_to_top) {
}
void Element::scrollIntoViewIfNeeded(bool center_if_needed) {
- GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheetsForNode(this);
+ EnsureLifecycleValidForLocationAPIs();
if (!GetLayoutObject())
return;
@@ -643,7 +643,7 @@ void Element::CallApplyScroll(ScrollState& scroll_state) {
}
int Element::OffsetLeft() {
- GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheetsForNode(this);
+ EnsureLifecycleValidForLocationAPIs();
if (LayoutBoxModelObject* layout_object = GetLayoutBoxModelObject())
return AdjustLayoutUnitForAbsoluteZoom(
LayoutUnit(
@@ -654,7 +654,7 @@ int Element::OffsetLeft() {
}
int Element::OffsetTop() {
- GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheetsForNode(this);
+ EnsureLifecycleValidForLocationAPIs();
if (LayoutBoxModelObject* layout_object = GetLayoutBoxModelObject())
return AdjustLayoutUnitForAbsoluteZoom(
LayoutUnit(layout_object->PixelSnappedOffsetTop(OffsetParent())),
@@ -1132,7 +1132,7 @@ IntRect Element::VisibleBoundsInVisualViewport() const {
}
void Element::ClientQuads(Vector<FloatQuad>& quads) {
- GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheetsForNode(this);
+ EnsureLifecycleValidForLocationAPIs();
LayoutObject* element_layout_object = GetLayoutObject();
if (!element_layout_object)
@@ -4328,6 +4328,28 @@ void Element::LogUpdateAttributeIfIsolatedWorldAndInDocument(
activity_logger->LogEvent("blinkSetAttribute", argv.size(), argv.data());
}
+void Element::EnsureLifecycleValidForLocationAPIs() {
+ if (!InActiveDocument())
+ return;
+
+ GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets();
+
+ // The location of elements that are position: sticky is not known until
+ // compositing inputs are cleaned. Therefore, for any elements that are either
+ // sticky or are in a sticky sub-tree (e.g. are affected by a sticky element),
+ // we need to also clean compositing inputs.
+ FrameView* view = GetDocument().View();
+ if (UNLIKELY(view && GetLayoutObject() &&
+ GetLayoutObject()->Style()->IsInStickySubtree())) {
+ if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
+ // In SPv2, compositing inputs are cleaned as part of PrePaint.
+ view->UpdateAllLifecyclePhasesExceptPaint();
+ } else {
+ view->UpdateLifecycleToCompositingInputsClean();
+ }
+ }
+}
+
DEFINE_TRACE(Element) {
if (HasRareData())
visitor->Trace(GetElementRareData());

Powered by Google App Engine
This is Rietveld 408576698