Commit dd50d572 authored by Emilio Cobos Álvarez's avatar Emilio Cobos Álvarez
Browse files

Bug 1586909 - Process anchor suppressions even when ignoring adjustments. r=dholbert, a=lizzard

Otherwise we may keep the scroll anchor around and we may try to anchor to it
later even though we should've really suppressed it completely.

Maybe we should just call InvalidateAnchor() unconditionally from that code
path, even if there are no suppressions pending...

Differential Revision: https://phabricator.services.mozilla.com/D48456



Signed-off-by: default avatarEmilio Cobos Álvarez <emilio@crisal.io>
parent 12fec3e4
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -310,13 +310,16 @@ void ScrollAnchorContainer::ApplyAdjustments() {
  if (!mAnchorNode || mAnchorNodeIsDirty ||
      mScrollFrame->HasPendingScrollRestoration() ||
      mScrollFrame->IsProcessingAsyncScroll()) {
    mSuppressAnchorAdjustment = false;
    ANCHOR_LOG(
        "Ignoring post-reflow (anchor=%p, dirty=%d, pendingRestoration=%d, "
        "asyncScroll=%d container=%p).\n",
        mAnchorNode, mAnchorNodeIsDirty,
        mScrollFrame->HasPendingScrollRestoration(),
        mScrollFrame->IsProcessingAsyncScroll(), this);
    if (mSuppressAnchorAdjustment) {
      mSuppressAnchorAdjustment = false;
      InvalidateAnchor();
    }
    return;
  }

+59 −0
Original line number Diff line number Diff line
<!doctype html>
<meta charset="utf-8">
<link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring-1/">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1586909">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="author" title="Mozilla" href="https://mozilla.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
  #scroller {
    overflow: scroll;
    height: 500px;
    height: 500px;
  }
  #before {
    height: 200px;
  }
  #anchor {
    position: relative;
    width: 200px;
    height: 200px;
    margin-bottom: 500px;
    background-color: blue;
    top: 0px;
  }
</style>
<div id="scroller">
  <div id="before">
  </div>
  <div id="anchor">
  </div>
</div>
<script>
async_test(t => {
  let scroller = document.querySelector('#scroller');
  let before = document.querySelector('#before');
  let anchor = document.querySelector('#anchor');

  scroller.onscroll = t.step_func(function() {
    // Adjust the 'top' of #anchor, which should trigger a suppression
    anchor.style.top = '10px';

    // Expand #before and make sure we don't apply an adjustment
    before.style.height = '300px';

    assert_equals(scroller.scrollTop, 200);

    t.step_timeout(t.step_func_done(function() {
      // Expand #before again and make sure we don't keep #anchor as
      // an anchor from the last time.
      before.style.height = '600px';
      assert_equals(scroller.scrollTop, 200);
    }), 0);
  });

  // Scroll down to select #anchor as a scroll anchor
  scroller.scrollTop = 200;
}, 'Positioned ancestors with dynamic changes to offsets trigger scroll suppressions.');
</script>