mirror of
https://github.com/facebook/react.git
synced 2026-02-24 12:43:00 +00:00
Stacked on https://github.com/facebook/react/pull/31131. See last commit. This is a clean-up and a pre-requisite for next changes: 1. `ReloadAndProfileConfig` is now split into boolean value and settings object. This is mainly because I will add one more setting soon, and also because settings might be persisted for a longer time than the flag which signals if the Backend was reloaded for profiling. Ideally, this settings should probably be moved to the global Hook object, same as we did for console patching. 2. Host is now responsible for reseting the cached values, Backend will execute provided `onReloadAndProfileFlagsReset` callback.
72 lines
2.2 KiB
JavaScript
72 lines
2.2 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
import type {
|
|
ReactRenderer,
|
|
RendererInterface,
|
|
DevToolsHook,
|
|
RendererID,
|
|
ProfilingSettings,
|
|
} from 'react-devtools-shared/src/backend/types';
|
|
|
|
import {attach as attachFlight} from 'react-devtools-shared/src/backend/flight/renderer';
|
|
import {attach as attachFiber} from 'react-devtools-shared/src/backend/fiber/renderer';
|
|
import {attach as attachLegacy} from 'react-devtools-shared/src/backend/legacy/renderer';
|
|
import {hasAssignedBackend} from 'react-devtools-shared/src/backend/utils';
|
|
|
|
// this is the backend that is compatible with all older React versions
|
|
function isMatchingRender(version: string): boolean {
|
|
return !hasAssignedBackend(version);
|
|
}
|
|
|
|
export default function attachRenderer(
|
|
hook: DevToolsHook,
|
|
id: RendererID,
|
|
renderer: ReactRenderer,
|
|
global: Object,
|
|
shouldStartProfilingNow: boolean,
|
|
profilingSettings: ProfilingSettings,
|
|
): RendererInterface | void {
|
|
// only attach if the renderer is compatible with the current version of the backend
|
|
if (!isMatchingRender(renderer.reconcilerVersion || renderer.version)) {
|
|
return;
|
|
}
|
|
let rendererInterface = hook.rendererInterfaces.get(id);
|
|
|
|
// Inject any not-yet-injected renderers (if we didn't reload-and-profile)
|
|
if (rendererInterface == null) {
|
|
if (typeof renderer.getCurrentComponentInfo === 'function') {
|
|
// react-flight/client
|
|
rendererInterface = attachFlight(hook, id, renderer, global);
|
|
} else if (
|
|
// v16-19
|
|
typeof renderer.findFiberByHostInstance === 'function' ||
|
|
// v16.8+
|
|
renderer.currentDispatcherRef != null
|
|
) {
|
|
// react-reconciler v16+
|
|
rendererInterface = attachFiber(
|
|
hook,
|
|
id,
|
|
renderer,
|
|
global,
|
|
shouldStartProfilingNow,
|
|
profilingSettings,
|
|
);
|
|
} else if (renderer.ComponentTree) {
|
|
// react-dom v15
|
|
rendererInterface = attachLegacy(hook, id, renderer, global);
|
|
} else {
|
|
// Older react-dom or other unsupported renderer version
|
|
}
|
|
}
|
|
|
|
return rendererInterface;
|
|
}
|