| 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());
|
|
|