@@ -447,6 +447,7 @@ export function injectIntoGlobalHook(globalObject: any): void {
447
447
globalObject . __REACT_DEVTOOLS_GLOBAL_HOOK__ = hook = {
448
448
renderers : new Map ( ) ,
449
449
supportsFiber : true ,
450
+ isDisabled : false ,
450
451
inject ( injected ) {
451
452
return nextID ++ ;
452
453
} ,
@@ -465,107 +466,117 @@ export function injectIntoGlobalHook(globalObject: any): void {
465
466
} ;
466
467
}
467
468
468
- // Here, we just want to get a reference to scheduleRefresh.
469
- const oldInject = hook . inject ;
470
- hook . inject = function ( injected ) {
471
- const id = oldInject . apply ( this , arguments ) ;
472
- if (
473
- typeof injected . scheduleRefresh === 'function' &&
474
- typeof injected . setRefreshHandler === 'function'
475
- ) {
476
- // This version supports React Refresh.
477
- helpersByRendererID . set ( id , ( ( injected : any ) : RendererHelpers ) ) ;
478
- }
479
- return id ;
480
- } ;
469
+ if ( hook . isDisabled ) {
470
+ // This isn't a real property on the hook, but it can be set to opt out
471
+ // of DevTools integration and associated warnings and logs.
472
+ // https://github.com/facebook/react/issues/20117
473
+ console . error (
474
+ 'The installed version of React DevTools is disabled. ' +
475
+ 'https://reactjs.org/link/react-devtools' ,
476
+ ) ;
477
+ } else {
478
+ // Here, we just want to get a reference to scheduleRefresh.
479
+ const oldInject = hook . inject ;
480
+ hook . inject = function ( injected ) {
481
+ const id = oldInject . apply ( this , arguments ) ;
482
+ if (
483
+ typeof injected . scheduleRefresh === 'function' &&
484
+ typeof injected . setRefreshHandler === 'function'
485
+ ) {
486
+ // This version supports React Refresh.
487
+ helpersByRendererID . set ( id , ( ( injected : any ) : RendererHelpers ) ) ;
488
+ }
489
+ return id ;
490
+ } ;
481
491
482
- // Do the same for any already injected roots.
483
- // This is useful if ReactDOM has already been initialized.
484
- // https://github.com/facebook/react/issues/17626
485
- hook . renderers . forEach ( ( injected , id ) => {
486
- if (
487
- typeof injected . scheduleRefresh === 'function' &&
488
- typeof injected . setRefreshHandler === 'function'
489
- ) {
490
- // This version supports React Refresh.
491
- helpersByRendererID . set ( id , ( ( injected : any ) : RendererHelpers ) ) ;
492
- }
493
- } ) ;
492
+ // Do the same for any already injected roots.
493
+ // This is useful if ReactDOM has already been initialized.
494
+ // https://github.com/facebook/react/issues/17626
495
+ hook . renderers . forEach ( ( injected , id ) => {
496
+ if (
497
+ typeof injected . scheduleRefresh === 'function' &&
498
+ typeof injected . setRefreshHandler === 'function'
499
+ ) {
500
+ // This version supports React Refresh.
501
+ helpersByRendererID . set ( id , ( ( injected : any ) : RendererHelpers ) ) ;
502
+ }
503
+ } ) ;
494
504
495
- // We also want to track currently mounted roots.
496
- const oldOnCommitFiberRoot = hook . onCommitFiberRoot ;
497
- const oldOnScheduleFiberRoot = hook . onScheduleFiberRoot || ( ( ) => { } ) ;
498
- hook . onScheduleFiberRoot = function (
499
- id : number ,
500
- root : FiberRoot ,
501
- children : ReactNodeList ,
502
- ) {
503
- if ( ! isPerformingRefresh ) {
504
- // If it was intentionally scheduled, don't attempt to restore.
505
- // This includes intentionally scheduled unmounts.
506
- failedRoots . delete ( root ) ;
507
- if ( rootElements !== null ) {
508
- rootElements . set ( root , children ) ;
505
+ // We also want to track currently mounted roots.
506
+ const oldOnCommitFiberRoot = hook . onCommitFiberRoot ;
507
+ const oldOnScheduleFiberRoot = hook . onScheduleFiberRoot || ( ( ) => { } ) ;
508
+ hook . onScheduleFiberRoot = function (
509
+ id : number ,
510
+ root : FiberRoot ,
511
+ children : ReactNodeList ,
512
+ ) {
513
+ if ( ! isPerformingRefresh ) {
514
+ // If it was intentionally scheduled, don't attempt to restore.
515
+ // This includes intentionally scheduled unmounts.
516
+ failedRoots . delete ( root ) ;
517
+ if ( rootElements !== null ) {
518
+ rootElements . set ( root , children ) ;
519
+ }
509
520
}
510
- }
511
- return oldOnScheduleFiberRoot . apply ( this , arguments ) ;
512
- } ;
513
- hook . onCommitFiberRoot = function (
514
- id : number ,
515
- root : FiberRoot ,
516
- maybePriorityLevel : mixed ,
517
- didError : boolean ,
518
- ) {
519
- const helpers = helpersByRendererID . get ( id ) ;
520
- if ( helpers !== undefined ) {
521
- helpersByRoot . set ( root , helpers ) ;
522
-
523
- const current = root . current ;
524
- const alternate = current . alternate ;
525
-
526
- // We need to determine whether this root has just (un)mounted.
527
- // This logic is copy-pasted from similar logic in the DevTools backend.
528
- // If this breaks with some refactoring, you'll want to update DevTools too.
529
-
530
- if ( alternate !== null ) {
531
- const wasMounted =
532
- alternate . memoizedState != null &&
533
- alternate . memoizedState . element != null ;
534
- const isMounted =
535
- current . memoizedState != null &&
536
- current . memoizedState . element != null ;
537
-
538
- if ( ! wasMounted && isMounted ) {
521
+ return oldOnScheduleFiberRoot . apply ( this , arguments ) ;
522
+ } ;
523
+ hook . onCommitFiberRoot = function (
524
+ id : number ,
525
+ root : FiberRoot ,
526
+ maybePriorityLevel : mixed ,
527
+ didError : boolean ,
528
+ ) {
529
+ const helpers = helpersByRendererID . get ( id ) ;
530
+ if ( helpers !== undefined ) {
531
+ helpersByRoot . set ( root , helpers ) ;
532
+
533
+ const current = root . current ;
534
+ const alternate = current . alternate ;
535
+
536
+ // We need to determine whether this root has just (un)mounted.
537
+ // This logic is copy-pasted from similar logic in the DevTools backend.
538
+ // If this breaks with some refactoring, you'll want to update DevTools too.
539
+
540
+ if ( alternate !== null ) {
541
+ const wasMounted =
542
+ alternate . memoizedState != null &&
543
+ alternate . memoizedState . element != null ;
544
+ const isMounted =
545
+ current . memoizedState != null &&
546
+ current . memoizedState . element != null ;
547
+
548
+ if ( ! wasMounted && isMounted ) {
549
+ // Mount a new root.
550
+ mountedRoots . add ( root ) ;
551
+ failedRoots . delete ( root ) ;
552
+ } else if ( wasMounted && isMounted ) {
553
+ // Update an existing root.
554
+ // This doesn't affect our mounted root Set.
555
+ } else if ( wasMounted && ! isMounted ) {
556
+ // Unmount an existing root.
557
+ mountedRoots . delete ( root ) ;
558
+ if ( didError ) {
559
+ // We'll remount it on future edits.
560
+ failedRoots . add ( root ) ;
561
+ } else {
562
+ helpersByRoot . delete ( root ) ;
563
+ }
564
+ } else if ( ! wasMounted && ! isMounted ) {
565
+ if ( didError ) {
566
+ // We'll remount it on future edits.
567
+ failedRoots . add ( root ) ;
568
+ }
569
+ }
570
+ } else {
539
571
// Mount a new root.
540
572
mountedRoots . add ( root ) ;
541
- failedRoots . delete ( root ) ;
542
- } else if ( wasMounted && isMounted ) {
543
- // Update an existing root.
544
- // This doesn't affect our mounted root Set.
545
- } else if ( wasMounted && ! isMounted ) {
546
- // Unmount an existing root.
547
- mountedRoots . delete ( root ) ;
548
- if ( didError ) {
549
- // We'll remount it on future edits.
550
- failedRoots . add ( root ) ;
551
- } else {
552
- helpersByRoot . delete ( root ) ;
553
- }
554
- } else if ( ! wasMounted && ! isMounted ) {
555
- if ( didError ) {
556
- // We'll remount it on future edits.
557
- failedRoots . add ( root ) ;
558
- }
559
573
}
560
- } else {
561
- // Mount a new root.
562
- mountedRoots . add ( root ) ;
563
574
}
564
- }
565
575
566
- // Always call the decorated DevTools hook.
567
- return oldOnCommitFiberRoot . apply ( this , arguments ) ;
568
- } ;
576
+ // Always call the decorated DevTools hook.
577
+ return oldOnCommitFiberRoot . apply ( this , arguments ) ;
578
+ } ;
579
+ }
569
580
} else {
570
581
throw new Error (
571
582
'Unexpected call to React Refresh in a production environment.' ,
0 commit comments