From 16415888cb1c01dafdd0d2a85b8b21decafaa9ee Mon Sep 17 00:00:00 2001 From: Ruslan Lesiutin Date: Fri, 12 May 2023 14:32:47 +0100 Subject: [PATCH] fix[devtools]: fixed duplicated backend activation with multiple renderers --- .../react-devtools-extensions/src/backend.js | 1 + .../src/backendManager.js | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/react-devtools-extensions/src/backend.js b/packages/react-devtools-extensions/src/backend.js index b79e1916518e..c7947da96310 100644 --- a/packages/react-devtools-extensions/src/backend.js +++ b/packages/react-devtools-extensions/src/backend.js @@ -29,5 +29,6 @@ function setup(hook: ?DevToolsHook) { initBackend, setupNativeStyleEditor, }); + hook.emit('devtools-backend-installed', COMPACT_VERSION_NAME); } diff --git a/packages/react-devtools-extensions/src/backendManager.js b/packages/react-devtools-extensions/src/backendManager.js index 13b3eedde787..a77ca2f9601c 100644 --- a/packages/react-devtools-extensions/src/backendManager.js +++ b/packages/react-devtools-extensions/src/backendManager.js @@ -58,7 +58,7 @@ function setup(hook: ?DevToolsHook) { // register renderers that have already injected themselves. hook.renderers.forEach(renderer => { - registerRenderer(renderer); + registerRenderer(renderer, hook); }); // Activate and remove from required all present backends, registered within the hook @@ -71,7 +71,7 @@ function setup(hook: ?DevToolsHook) { // register renderers that inject themselves later. hook.sub('renderer', ({renderer}) => { - registerRenderer(renderer); + registerRenderer(renderer, hook); updateRequiredBackends(); }); @@ -84,12 +84,16 @@ function setup(hook: ?DevToolsHook) { const requiredBackends = new Set(); -function registerRenderer(renderer: ReactRenderer) { +function registerRenderer(renderer: ReactRenderer, hook: DevToolsHook) { let version = renderer.reconcilerVersion || renderer.version; if (!hasAssignedBackend(version)) { version = COMPACT_VERSION_NAME; } - requiredBackends.add(version); + + // Check if required backend is already activated, no need to require again + if (!hook.backends.has(version)) { + requiredBackends.add(version); + } } function activateBackend(version: string, hook: DevToolsHook) { @@ -97,6 +101,7 @@ function activateBackend(version: string, hook: DevToolsHook) { if (!backend) { throw new Error(`Could not find backend for version "${version}"`); } + const {Agent, Bridge, initBackend, setupNativeStyleEditor} = backend; const bridge = new Bridge({ listen(fn) { @@ -157,6 +162,10 @@ function activateBackend(version: string, hook: DevToolsHook) { // tell the service worker which versions of backends are needed for the current page function updateRequiredBackends() { + if (requiredBackends.size === 0) { + return; + } + window.postMessage( { source: 'react-devtools-backend-manager',