From c3dbe4214e0ae6da73339776266141d5b6ce16ed Mon Sep 17 00:00:00 2001 From: Shubham More Date: Wed, 3 Dec 2025 16:43:43 +0000 Subject: [PATCH 1/3] Add __REACT_DEVTOOLS_HIDE_CONSOLE__ to suppress DevTools download message (#24283) Add a global variable that allows suppressing the "Download the React DevTools" console message in environments where the Chrome extension cannot function, such as remote debugging environments and CEP-like contexts. --- .../react-dom/src/__tests__/ReactDOM-test.js | 20 +++++++++++++++++++ .../react-dom/src/client/ReactDOMClient.js | 7 ++++++- .../react-dom/src/client/ReactDOMClientFB.js | 7 ++++++- scripts/flow/environment.js | 2 ++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/react-dom/src/__tests__/ReactDOM-test.js b/packages/react-dom/src/__tests__/ReactDOM-test.js index ff829654454..dc70b16138a 100644 --- a/packages/react-dom/src/__tests__/ReactDOM-test.js +++ b/packages/react-dom/src/__tests__/ReactDOM-test.js @@ -477,6 +477,26 @@ describe('ReactDOM', () => { } }); + it('should suppress DevTools console message when __REACT_DEVTOOLS_HIDE_CONSOLE__ is set', () => { + try { + global.__REACT_DEVTOOLS_HIDE_CONSOLE__ = true; + jest.resetModules(); + + const infoSpy = jest.spyOn(console, 'info').mockImplementation(() => {}); + + require('react-dom/client'); + + const devToolsMessage = infoSpy.mock.calls.find(call => + call[0]?.includes?.('Download the React DevTools'), + ); + expect(devToolsMessage).toBeUndefined(); + + infoSpy.mockRestore(); + } finally { + delete global.__REACT_DEVTOOLS_HIDE_CONSOLE__; + } + }); + it('should not crash calling findDOMNode inside a function component', async () => { class Component extends React.Component { render() { diff --git a/packages/react-dom/src/client/ReactDOMClient.js b/packages/react-dom/src/client/ReactDOMClient.js index 9a9f3157b82..2740ea64fe9 100644 --- a/packages/react-dom/src/client/ReactDOMClient.js +++ b/packages/react-dom/src/client/ReactDOMClient.js @@ -54,7 +54,12 @@ export {ReactVersion as version, createRoot, hydrateRoot}; const foundDevTools = injectIntoDevTools(); if (__DEV__) { - if (!foundDevTools && canUseDOM && window.top === window.self) { + if ( + !foundDevTools && + canUseDOM && + window.top === window.self && + typeof __REACT_DEVTOOLS_HIDE_CONSOLE__ === 'undefined' + ) { // If we're in Chrome or Firefox, provide a download link if not installed. if ( (navigator.userAgent.indexOf('Chrome') > -1 && diff --git a/packages/react-dom/src/client/ReactDOMClientFB.js b/packages/react-dom/src/client/ReactDOMClientFB.js index 872a4550aa3..d5243d6e445 100644 --- a/packages/react-dom/src/client/ReactDOMClientFB.js +++ b/packages/react-dom/src/client/ReactDOMClientFB.js @@ -150,7 +150,12 @@ Internals.Events /* Events */ = [ const foundDevTools = injectIntoDevTools(); if (__DEV__) { - if (!foundDevTools && canUseDOM && window.top === window.self) { + if ( + !foundDevTools && + canUseDOM && + window.top === window.self && + typeof __REACT_DEVTOOLS_HIDE_CONSOLE__ === 'undefined' + ) { // If we're in Chrome or Firefox, provide a download link if not installed. if ( (navigator.userAgent.indexOf('Chrome') > -1 && diff --git a/scripts/flow/environment.js b/scripts/flow/environment.js index 180ee3838de..5fd781443f6 100644 --- a/scripts/flow/environment.js +++ b/scripts/flow/environment.js @@ -17,6 +17,8 @@ declare const __REACT_DEVTOOLS_GLOBAL_HOOK__: any; /*?{ inject: ?((stuff: Object) => void) };*/ +declare const __REACT_DEVTOOLS_HIDE_CONSOLE__: void | true; + declare const reportError: (error: mixed) => void; declare module 'create-react-class' { From 839a15e954b2dcd9f445b525fd60b49bd840b0ea Mon Sep 17 00:00:00 2001 From: Shubham More Date: Wed, 3 Dec 2025 22:23:03 +0530 Subject: [PATCH 2/3] Update packages/react-dom/src/client/ReactDOMClient.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/react-dom/src/client/ReactDOMClient.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-dom/src/client/ReactDOMClient.js b/packages/react-dom/src/client/ReactDOMClient.js index 2740ea64fe9..90ebf66353c 100644 --- a/packages/react-dom/src/client/ReactDOMClient.js +++ b/packages/react-dom/src/client/ReactDOMClient.js @@ -58,6 +58,8 @@ if (__DEV__) { !foundDevTools && canUseDOM && window.top === window.self && + // Allow suppressing this message via __REACT_DEVTOOLS_HIDE_CONSOLE__ in + // environments like CEP or nwjs where the DevTools extension cannot be installed. typeof __REACT_DEVTOOLS_HIDE_CONSOLE__ === 'undefined' ) { // If we're in Chrome or Firefox, provide a download link if not installed. From b997d07649693778e89d506c1670a90949d55722 Mon Sep 17 00:00:00 2001 From: Shubham More Date: Wed, 3 Dec 2025 22:23:26 +0530 Subject: [PATCH 3/3] Update packages/react-dom/src/client/ReactDOMClientFB.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/react-dom/src/client/ReactDOMClientFB.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/react-dom/src/client/ReactDOMClientFB.js b/packages/react-dom/src/client/ReactDOMClientFB.js index d5243d6e445..305aa5a8591 100644 --- a/packages/react-dom/src/client/ReactDOMClientFB.js +++ b/packages/react-dom/src/client/ReactDOMClientFB.js @@ -154,6 +154,8 @@ if (__DEV__) { !foundDevTools && canUseDOM && window.top === window.self && + // Allow suppressing this message via __REACT_DEVTOOLS_HIDE_CONSOLE__ in + // environments like CEP or nwjs where the DevTools extension cannot be installed. typeof __REACT_DEVTOOLS_HIDE_CONSOLE__ === 'undefined' ) { // If we're in Chrome or Firefox, provide a download link if not installed.