@@ -18,6 +18,7 @@ import Ember from 'ember';
1818import { cached } from 'ember-cached-decorator-polyfill' ;
1919
2020let waiter = buildWaiter ( 'yapp-scroll-view:scrolling' ) ;
21+ let measurementWaiter = buildWaiter ( 'yapp-scroll-view:measurement' ) ;
2122
2223const FIELD_REGEXP = / i n p u t | t e x t a r e a | s e l e c t / i;
2324const MEASUREMENT_INTERVAL = 250 ;
@@ -114,6 +115,7 @@ class ScrollView extends Component {
114115 _isScrolling = false ;
115116 _touchStartTimeStamp = null ;
116117 _lastIsScrolling = false ;
118+ _measurementWaiterToken = null ;
117119
118120 @service ( 'scroll-position-memory' )
119121 memory ;
@@ -404,8 +406,8 @@ class ScrollView extends Component {
404406 }
405407 }
406408 let lastIsInViewport = true ;
409+ // eslint-disable-next-line no-constant-condition
407410 while ( true ) {
408- // eslint-disable-line no-constant-condition
409411 await timeout (
410412 lastIsInViewport
411413 ? MEASUREMENT_INTERVAL
@@ -419,29 +421,34 @@ class ScrollView extends Component {
419421 } ) ;
420422
421423 measureClientAndContent ( ) {
422- if ( ! this . scrollViewElement ) {
423- return ;
424- }
425- this . _lastMeasurement = + new Date ( ) ;
426- let { clientWidth, clientHeight, contentHeight } =
427- this . getCurrentClientAndContentSizes ( ) ;
428-
429- if (
430- ! this . hasClientOrContentSizeChanged (
424+ this . _beginMeasurementWaiter ( ) ;
425+ try {
426+ if ( ! this . scrollViewElement ) {
427+ return ;
428+ }
429+ this . _lastMeasurement = + new Date ( ) ;
430+ let { clientWidth, clientHeight, contentHeight } =
431+ this . getCurrentClientAndContentSizes ( ) ;
432+
433+ if (
434+ ! this . hasClientOrContentSizeChanged (
435+ clientWidth ,
436+ clientHeight ,
437+ contentHeight
438+ )
439+ ) {
440+ return ;
441+ }
442+ join (
443+ this ,
444+ this . applyNewMeasurements ,
431445 clientWidth ,
432446 clientHeight ,
433447 contentHeight
434- )
435- ) {
436- return ;
448+ ) ;
449+ } finally {
450+ this . _endMeasurementWaiter ( ) ;
437451 }
438- join (
439- this ,
440- this . applyNewMeasurements ,
441- clientWidth ,
442- clientHeight ,
443- contentHeight
444- ) ;
445452 }
446453
447454 getCurrentClientAndContentSizes ( ) {
@@ -612,6 +619,19 @@ class ScrollView extends Component {
612619 _isScrollingForWaiter ( ) {
613620 return ! this . _lastIsScrolling ;
614621 }
622+
623+ _beginMeasurementWaiter ( ) {
624+ if ( DEBUG && Ember . testing && ! this . _measurementWaiterToken ) {
625+ this . _measurementWaiterToken = measurementWaiter . beginAsync ( ) ;
626+ }
627+ }
628+
629+ _endMeasurementWaiter ( ) {
630+ if ( this . _measurementWaiterToken ) {
631+ measurementWaiter . endAsync ( this . _measurementWaiterToken ) ;
632+ this . _measurementWaiterToken = null ;
633+ }
634+ }
615635}
616636
617637export default ScrollView ;
0 commit comments