@@ -53,6 +53,28 @@ const supportedEventMapping = {
53
53
onHoldselect : 'holdselect' ,
54
54
} ;
55
55
56
+ let uid = 0 ;
57
+
58
+ function getNodeId ( node ) {
59
+ if ( node ) {
60
+ if ( node . _uid == null ) {
61
+ /**
62
+ * `console.info` is a weird workaround that prevents nodes
63
+ * from the aggressive GC in tvOS 12.
64
+ *
65
+ * This fixes:
66
+ * - ITMLKit (9): EXC_BAD_ACCESS
67
+ * - ITMLKit (8): signal SIGABRT
68
+ */
69
+ console . info ( 'Preventing node from GC' , node ) ;
70
+ uid += 1 ;
71
+ node . _uid = uid ;
72
+ }
73
+ return node . _uid ;
74
+ }
75
+ return null ;
76
+ }
77
+
56
78
function isTextNode ( node ) {
57
79
return node && node . nodeType === TEXT_NODE ;
58
80
}
@@ -348,13 +370,13 @@ const TVMLRenderer = ReactFiberReconciler({
348
370
if ( isTextNode ( target ) && isTextNode ( child ) ) {
349
371
if ( ! target . _handledTextNodes ) {
350
372
target . _handledTextNodes = [ {
351
- node : target ,
373
+ id : getNodeId ( target ) ,
352
374
value : target . nodeValue ,
353
375
} ] ;
354
376
}
355
377
356
378
target . _handledTextNodes . push ( {
357
- node : child ,
379
+ id : getNodeId ( child ) ,
358
380
value : child . nodeValue ,
359
381
} ) ;
360
382
@@ -446,7 +468,8 @@ const TVMLRenderer = ReactFiberReconciler({
446
468
447
469
if ( target ) {
448
470
const nodes = target . _handledTextNodes ;
449
- const reference = nodes . find ( ( { node } ) => node === textInstance ) ;
471
+ const nodeId = getNodeId ( textInstance ) ;
472
+ const reference = nodes . find ( ( { id } ) => id === nodeId ) ;
450
473
451
474
reference . value = newText ;
452
475
updateNodeValue ( target ) ;
@@ -465,13 +488,13 @@ const TVMLRenderer = ReactFiberReconciler({
465
488
if ( isTextNode ( target ) && isTextNode ( child ) ) {
466
489
if ( ! target . _handledTextNodes ) {
467
490
target . _handledTextNodes = [ {
468
- node : target ,
491
+ id : getNodeId ( target ) ,
469
492
value : target . nodeValue ,
470
493
} ] ;
471
494
}
472
495
473
496
target . _handledTextNodes . push ( {
474
- node : child ,
497
+ id : getNodeId ( child ) ,
475
498
value : child . nodeValue ,
476
499
} ) ;
477
500
@@ -499,13 +522,13 @@ const TVMLRenderer = ReactFiberReconciler({
499
522
if ( isTextNode ( beforeChild ) && isTextNode ( child ) ) {
500
523
if ( ! beforeChild . _handledTextNodes ) {
501
524
beforeChild . _handledTextNodes = [ {
502
- node : beforeChild ,
525
+ id : getNodeId ( beforeChild ) ,
503
526
value : beforeChild . nodeValue ,
504
527
} ] ;
505
528
}
506
529
507
530
beforeChild . _handledTextNodes . unshift ( {
508
- node : child ,
531
+ id : getNodeId ( child ) ,
509
532
value : child . nodeValue ,
510
533
} ) ;
511
534
@@ -535,14 +558,16 @@ const TVMLRenderer = ReactFiberReconciler({
535
558
if ( child . _targetTextNode ) {
536
559
const target = child . _targetTextNode ;
537
560
const nodes = target . _handledTextNodes ;
538
- const referenceIndex = nodes . findIndex ( ( { node } ) => node === child ) ;
561
+ const nodeId = getNodeId ( child ) ;
562
+ const referenceIndex = nodes . findIndex ( ( { id } ) => id === nodeId ) ;
539
563
540
564
nodes . splice ( referenceIndex , 1 ) ;
541
565
delete child . _targetTextNode ;
542
566
updateNodeValue ( target ) ;
543
567
} else if ( child . _handledTextNodes && child . _handledTextNodes . length ) {
544
568
const nodes = child . _handledTextNodes ;
545
- const reference = nodes . find ( ( { node } ) => node === child ) ;
569
+ const nodeId = getNodeId ( child ) ;
570
+ const reference = nodes . find ( ( { id } ) => id === nodeId ) ;
546
571
547
572
reference . value = '' ;
548
573
updateNodeValue ( child ) ;
0 commit comments