diff --git a/src/service/viewport-impl.js b/src/service/viewport-impl.js index d637035786c9..c7ade4230ae8 100644 --- a/src/service/viewport-impl.js +++ b/src/service/viewport-impl.js @@ -205,6 +205,11 @@ export class Viewport { this.visible_ = visible; if (visible) { this.binding_.connect(); + if (this.size_) { + // If the size has already been intialized, check it again in case + // the size has changed between `disconnect` and `connect`. + this.resize_(); + } } else { this.binding_.disconnect(); } diff --git a/test/functional/test-viewport.js b/test/functional/test-viewport.js index c296c8023c65..5943bcbae52d 100644 --- a/test/functional/test-viewport.js +++ b/test/functional/test-viewport.js @@ -158,6 +158,7 @@ describe('Viewport', () => { // Hasn't been called at first. expect(binding.connect).to.not.be.called; expect(binding.disconnect).to.not.be.called; + expect(viewport.size_).to.be.null; // When becomes visible - it gets called. viewer.isVisible = () => true; @@ -177,6 +178,35 @@ describe('Viewport', () => { expect(binding.disconnect).to.be.calledOnce; }); + it('should resize only after size has been initialed', () => { + binding.connect = sandbox.spy(); + binding.disconnect = sandbox.spy(); + viewer.isVisible = () => true; + let onVisibilityHandler; + viewer.onVisibilityChanged = handler => onVisibilityHandler = handler; + viewport = new Viewport(ampdoc, binding, viewer); + + // Size has not be initialized yet. + expect(binding.connect).to.be.calledOnce; + expect(binding.disconnect).to.not.be.called; + expect(viewport.size_).to.be.null; + + // Disconnect: ignore resizing. + viewer.isVisible = () => false; + onVisibilityHandler(); + expect(binding.connect).to.be.calledOnce; + expect(binding.disconnect).to.be.calledOnce; + expect(viewport.size_).to.be.null; + + // Size has been initialized. + viewport.size_ = {width: 0, height: 0}; + viewer.isVisible = () => true; + onVisibilityHandler(); + expect(binding.connect).to.be.calledTwice; + expect(binding.disconnect).to.be.calledOnce; + expect(viewport.size_).to.deep.equal(viewportSize); + }); + it('should pass through size and scroll', () => { expect(viewport.getPaddingTop()).to.equal(19); expect(updatedPaddingTop).to.equal(19);