From 653dda32baa494968308691e98f41d2dd16df746 Mon Sep 17 00:00:00 2001 From: Kevin Kimball Date: Mon, 3 Feb 2020 15:49:23 -0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9BForce=20scrollTop=20to=20be=20remea?= =?UTF-8?q?sured=20on=20shadow=20doc=20visibility=20change=20(#26588)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Force scrolltop to be remeasured on shadow doc visibility change * Add comment to fix --- src/service/viewport/viewport-impl.js | 5 +++++ test/unit/test-viewport.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/service/viewport/viewport-impl.js b/src/service/viewport/viewport-impl.js index d1e5fd0a49f0..b2a1f20e3493 100644 --- a/src/service/viewport/viewport-impl.js +++ b/src/service/viewport/viewport-impl.js @@ -228,6 +228,11 @@ export class ViewportImpl { // the size has changed between `disconnect` and `connect`. this.resize_(); } + if (this.scrollTop_) { + // Remeasure scrollTop when resource becomes visible to fix #11983 + this./*OK*/ scrollTop_ = null; + this.getScrollTop(); + } } else { this.binding_.disconnect(); } diff --git a/test/unit/test-viewport.js b/test/unit/test-viewport.js index 5f4dc418118b..da56cdb72a11 100644 --- a/test/unit/test-viewport.js +++ b/test/unit/test-viewport.js @@ -395,6 +395,27 @@ describes.fakeWin('Viewport', {}, env => { expect(binding.disconnect).to.be.calledOnce; }); + it('should update scroll position when visibility changes', () => { + binding = new ViewportBindingDef(); + binding.getScrollTop = (() => { + const generator = (function*() { + yield 25; + return 100; + })(); + return () => generator.next().value; + })(); + viewport = new ViewportImpl(ampdoc, binding, viewer); + + // Force scrollTop to be measured + viewport.getScrollTop(); + expect(viewport./*OK*/ scrollTop_).to.equal(25); + // Toggle visibility state + changeVisibilityState('prerender'); + changeVisibilityState('visible'); + // Expect scrollTop to be remeasured + expect(viewport./*OK*/ scrollTop_).to.equal(100); + }); + it('should resize only after size has been initialed', () => { onVisibilityHandlers.length = 0; changeVisibilityState('visible');