Skip to content

Commit df9ee15

Browse files
lukemeliacyril-sf
authored andcommitted
Add test waiters
1 parent ccc5bbd commit df9ee15

File tree

4 files changed

+86
-30
lines changed

4 files changed

+86
-30
lines changed

addon/components/collection-scroll-view/index.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import Component from '@glimmer/component';
22
import { reads } from 'macro-decorators';
33
import { cached, tracked } from '@glimmer/tracking';
44
import { action } from '@ember/object';
5-
import { next, schedule } from '@ember/runloop';
5+
import { next, schedule, run } from '@ember/runloop';
66
import { ref } from 'ember-ref-bucket';
7+
import { invokeResizeCallback } from 'yapp-scroll-view/utils/resize-observer-waiter';
78

89
/* A component which integrates a ScrollView with ember-collection */
910
export default class CollectionScrollView extends Component {
@@ -58,16 +59,24 @@ export default class CollectionScrollView extends Component {
5859

5960
@action
6061
updateHeaderDimensions(scrollViewApi, entry) {
61-
let isFirstMeasure = !this.headerDimensions;
62-
this.headerDimensions = {
63-
width: entry.contentRect.width,
64-
height: entry.contentRect.height,
65-
};
66-
67-
// If an initialScrollTop was set we need to apply it after the collections rows render
68-
if (isFirstMeasure && this.args.initialScrollTop) {
69-
next(scrollViewApi, scrollViewApi.scrollTo, this.args.initialScrollTop);
70-
}
62+
invokeResizeCallback(() => {
63+
run(() => {
64+
let isFirstMeasure = !this.headerDimensions;
65+
this.headerDimensions = {
66+
width: entry.contentRect.width,
67+
height: entry.contentRect.height,
68+
};
69+
70+
// If an initialScrollTop was set we need to apply it after the collections rows render
71+
if (isFirstMeasure && this.args.initialScrollTop) {
72+
next(
73+
scrollViewApi,
74+
scrollViewApi.scrollTo,
75+
this.args.initialScrollTop,
76+
);
77+
}
78+
});
79+
});
7180
}
7281

7382
@action

addon/components/scroll-view.js

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { isTesting } from '@embroider/macros';
1818
import { cached } from '@glimmer/tracking';
1919

2020
let waiter = buildWaiter('yapp-scroll-view:scrolling');
21+
let measurementWaiter = buildWaiter('yapp-scroll-view:measurement');
2122

2223
const FIELD_REGEXP = /input|textarea|select/i;
2324
const MEASUREMENT_INTERVAL = 250;
@@ -118,6 +119,7 @@ class ScrollView extends Component {
118119
_touchStartWasDecelerating = false;
119120
_touchStartWasDragging = false;
120121
_preventClickWhileDecelerating = false;
122+
_measurementWaiterToken = null;
121123

122124
@service('scroll-position-memory')
123125
memory;
@@ -481,29 +483,34 @@ class ScrollView extends Component {
481483
});
482484

483485
measureClientAndContent() {
484-
if (!this.scrollViewElement) {
485-
return;
486-
}
487-
this._lastMeasurement = +new Date();
488-
let { clientWidth, clientHeight, contentHeight } =
489-
this.getCurrentClientAndContentSizes();
490-
491-
if (
492-
!this.hasClientOrContentSizeChanged(
486+
this._beginMeasurementWaiter();
487+
try {
488+
if (!this.scrollViewElement) {
489+
return;
490+
}
491+
this._lastMeasurement = +new Date();
492+
let { clientWidth, clientHeight, contentHeight } =
493+
this.getCurrentClientAndContentSizes();
494+
495+
if (
496+
!this.hasClientOrContentSizeChanged(
497+
clientWidth,
498+
clientHeight,
499+
contentHeight,
500+
)
501+
) {
502+
return;
503+
}
504+
join(
505+
this,
506+
this.applyNewMeasurements,
493507
clientWidth,
494508
clientHeight,
495509
contentHeight,
496-
)
497-
) {
498-
return;
510+
);
511+
} finally {
512+
this._endMeasurementWaiter();
499513
}
500-
join(
501-
this,
502-
this.applyNewMeasurements,
503-
clientWidth,
504-
clientHeight,
505-
contentHeight,
506-
);
507514
}
508515

509516
getCurrentClientAndContentSizes() {
@@ -674,6 +681,19 @@ class ScrollView extends Component {
674681
_isScrollingForWaiter() {
675682
return !this._lastIsScrolling;
676683
}
684+
685+
_beginMeasurementWaiter() {
686+
if (!this._measurementWaiterToken) {
687+
this._measurementWaiterToken = measurementWaiter.beginAsync();
688+
}
689+
}
690+
691+
_endMeasurementWaiter() {
692+
if (this._measurementWaiterToken) {
693+
measurementWaiter.endAsync(this._measurementWaiterToken);
694+
this._measurementWaiterToken = null;
695+
}
696+
}
677697
}
678698

679699
export default ScrollView;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { buildWaiter } from '@ember/test-waiters';
2+
3+
const waiter = buildWaiter('yapp-scroll-view:resize-observer');
4+
5+
export function invokeResizeCallback(callback) {
6+
let token;
7+
8+
if (waiter && typeof waiter.beginAsync === 'function') {
9+
token = waiter.beginAsync();
10+
}
11+
12+
try {
13+
return callback();
14+
} finally {
15+
if (token) {
16+
waiter.endAsync(token);
17+
}
18+
}
19+
}
20+
21+
export function resizeObserverWaiterForTesting() {
22+
return waiter;
23+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export {
2+
invokeResizeCallback,
3+
resizeObserverWaiterForTesting,
4+
} from 'yapp-scroll-view/utils/resize-observer-waiter';

0 commit comments

Comments
 (0)