* @param {number|boolean} viewport derived from renderOutsideViewport. * @return {!Promise} resolves when underlying element is built and within the * viewport range given.
(viewport)
| 689 | * viewport range given. |
| 690 | */ |
| 691 | whenWithinViewport(viewport) { |
| 692 | // TODO(#30620): remove this method once IntersectionObserver{root:doc} is |
| 693 | // polyfilled. |
| 694 | devAssert(viewport !== false); |
| 695 | // Resolve is already laid out or viewport is true. |
| 696 | if (!this.isLayoutPending() || viewport === true) { |
| 697 | return Promise.resolve(); |
| 698 | } |
| 699 | // See if pre-existing promise. |
| 700 | const viewportNum = dev().assertNumber(viewport); |
| 701 | const key = String(viewportNum); |
| 702 | if (this.withViewportDeferreds_ && this.withViewportDeferreds_[key]) { |
| 703 | return this.withViewportDeferreds_[key].promise; |
| 704 | } |
| 705 | // See if already within viewport multiplier. |
| 706 | if (this.isWithinViewportRatio(viewportNum)) { |
| 707 | return Promise.resolve(); |
| 708 | } |
| 709 | // return promise that will trigger when within viewport multiple. |
| 710 | this.withViewportDeferreds_ = this.withViewportDeferreds_ || {}; |
| 711 | this.withViewportDeferreds_[key] = new Deferred(); |
| 712 | return this.withViewportDeferreds_[key].promise; |
| 713 | } |
| 714 | |
| 715 | /** @private resolves promises populated via whenWithinViewport. */ |
| 716 | resolveDeferredsWhenWithinViewports_() { |
no test coverage detected