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..90ebf66353c 100644 --- a/packages/react-dom/src/client/ReactDOMClient.js +++ b/packages/react-dom/src/client/ReactDOMClient.js @@ -54,7 +54,14 @@ 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 && + // 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. 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..305aa5a8591 100644 --- a/packages/react-dom/src/client/ReactDOMClientFB.js +++ b/packages/react-dom/src/client/ReactDOMClientFB.js @@ -150,7 +150,14 @@ Internals.Events /* Events */ = [ const foundDevTools = injectIntoDevTools(); if (__DEV__) { - if (!foundDevTools && canUseDOM && window.top === window.self) { + if ( + !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. 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' {