@@ -5,19 +5,35 @@ import Component from '@glimmer/component';
5
5
import identity from 'ember-collection/utils/identity' ;
6
6
import { tracked } from '@glimmer/tracking' ;
7
7
import { reads } from 'macro-decorators' ;
8
+ import { schedule } from '@ember/runloop' ;
9
+
10
+ function isElementInViewport ( el ) {
11
+ var rect = el . getBoundingClientRect ( ) ;
12
+ return (
13
+ rect . top >= 0 &&
14
+ rect . left >= 0 &&
15
+ rect . bottom <= ( window . innerHeight || document . documentElement . clientHeight ) &&
16
+ rect . right <= ( window . innerWidth || document . documentElement . clientWidth )
17
+ ) ;
18
+ }
19
+
20
+ let scrollViewCollectionItemsCellCounter = 0 ;
8
21
9
22
class Cell {
10
23
@tracked hidden ;
11
24
@tracked item ;
12
25
@tracked index ;
13
26
@tracked style ;
27
+ @tracked containerId ;
28
+ needsReflow = false ;
14
29
15
30
constructor ( key , item , index , style ) {
16
31
this . key = key ;
17
32
this . hidden = false ;
18
33
this . item = item ;
19
34
this . index = index ;
20
35
this . style = style ;
36
+ this . containerId = scrollViewCollectionItemsCellCounter ++ ;
21
37
}
22
38
}
23
39
@@ -43,13 +59,6 @@ export default class CollectionScrollViewCollectionItems extends Component {
43
59
return clientSize ? clientSize . height : estimatedSize . height ;
44
60
}
45
61
46
- safeRerender ( ) {
47
- if ( this . isDestroyed || this . isDestroying ) {
48
- return ;
49
- }
50
- this . rerender ( ) ;
51
- }
52
-
53
62
get contentSize ( ) {
54
63
this . _contentSize =
55
64
this . _contentSize ||
@@ -101,18 +110,18 @@ export default class CollectionScrollViewCollectionItems extends Component {
101
110
index -= bufferBefore ;
102
111
count += bufferBefore ;
103
112
count = Math . min ( count + this . buffer , items . length - index ) ;
104
- let i , style , itemIndex , itemKey , cell ;
105
113
106
114
let newItems = [ ] ;
107
115
108
- for ( i = 0 ; i < count ; i ++ ) {
109
- itemIndex = index + i ;
110
- itemKey = identity ( items [ itemIndex ] ) ;
116
+ for ( let i = 0 ; i < count ; i ++ ) {
117
+ let cell ;
118
+ let itemIndex = index + i ;
119
+ let itemKey = identity ( items [ itemIndex ] ) ;
111
120
if ( priorMap ) {
112
121
cell = priorMap [ itemKey ] ;
113
122
}
114
123
if ( cell ) {
115
- style = cellLayout . formatItemStyle (
124
+ let style = cellLayout . formatItemStyle (
116
125
itemIndex ,
117
126
clientWidth ,
118
127
clientHeight
@@ -127,14 +136,14 @@ export default class CollectionScrollViewCollectionItems extends Component {
127
136
}
128
137
}
129
138
130
- for ( i = 0 ; i < cells . length ; i ++ ) {
131
- cell = cells [ i ] ;
139
+ for ( let i = 0 ; i < cells . length ; i ++ ) {
140
+ const cell = cells [ i ] ;
132
141
if ( ! cellMap [ cell . key ] ) {
133
142
if ( newItems . length ) {
134
- itemIndex = newItems . pop ( ) ;
143
+ let itemIndex = newItems . pop ( ) ;
135
144
let item = items [ itemIndex ] ;
136
- itemKey = identity ( item ) ;
137
- style = cellLayout . formatItemStyle (
145
+ let itemKey = identity ( item ) ;
146
+ let style = cellLayout . formatItemStyle (
138
147
itemIndex ,
139
148
clientWidth ,
140
149
clientHeight
@@ -145,24 +154,47 @@ export default class CollectionScrollViewCollectionItems extends Component {
145
154
cell . item = item ;
146
155
cell . hidden = false ;
147
156
cellMap [ itemKey ] = cell ;
157
+ if ( window . SCROLL_VIEW_FORCE_REFLOW ) {
158
+ cell . needsReflow = true ;
159
+ }
148
160
} else {
149
161
cell . hidden = true ;
150
162
cell . style = 'height: 0; display: none;' ;
151
163
}
152
164
}
153
165
}
154
166
155
- for ( i = 0 ; i < newItems . length ; i ++ ) {
156
- itemIndex = newItems [ i ] ;
167
+ for ( let i = 0 ; i < newItems . length ; i ++ ) {
168
+ let itemIndex = newItems [ i ] ;
157
169
let item = items [ itemIndex ] ;
158
- itemKey = identity ( item ) ;
159
- style = cellLayout . formatItemStyle ( itemIndex , clientWidth , clientHeight ) ;
160
- cell = new Cell ( itemKey , item , itemIndex , style ) ;
170
+ let itemKey = identity ( item ) ;
171
+ let style = cellLayout . formatItemStyle ( itemIndex , clientWidth , clientHeight ) ;
172
+ const cell = new Cell ( itemKey , item , itemIndex , style ) ;
161
173
cellMap [ itemKey ] = cell ;
162
174
cells . pushObject ( cell ) ;
163
175
}
164
176
this . cellMap = cellMap ;
165
177
this . contentSize = cellLayout . contentSize ( clientWidth , clientHeight ) ;
178
+
179
+ // Workaround for bug in Android System WebView 130. Cells that are updated when outside
180
+ // viewport aren't rerendered. When they are scrolled into view, access offsetHeight to
181
+ // force a reflow.
182
+ if ( window . SCROLL_VIEW_FORCE_REFLOW ) {
183
+ for ( let i = 0 ; i < cells . length ; i ++ ) {
184
+ const cell = cells [ i ] ;
185
+ if ( cell . needsReflow ) {
186
+ let element = document . querySelector ( `[data-collection-scroll-view-cell-container-id="${ cell . containerId } "]` ) ;
187
+ if ( element && isElementInViewport ( element ) ) {
188
+ let display = element . style . display ;
189
+ element . style . display = 'none' ;
190
+ element . offsetHeight ;
191
+ element . style . display = display ;
192
+ cell . needsReflow = false ;
193
+ }
194
+ }
195
+ }
196
+ }
197
+
166
198
return cells ;
167
199
}
168
200
}
0 commit comments