Skip to content

Commit a5d7ab1

Browse files
Dmitrii Litsmanmeta-codesync[bot]
authored andcommitted
Revert D102166537: Hoist PerformanceLogger primitives out of react-native
Differential Revision: D102166537 Original commit changeset: 241ca7e7fb48 Original Phabricator Diff: D102166537 fbshipit-source-id: fb0f106ec04200cb2bc13922c17926c35a3c3d9c
1 parent 6411611 commit a5d7ab1

16 files changed

Lines changed: 818 additions & 155 deletions

packages/react-native/Libraries/Core/InitializeCore.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,17 @@
2626

2727
'use strict';
2828

29+
const start = Date.now();
30+
2931
require('../../src/private/setup/setUpDefaultReactNativeEnvironment').default();
32+
33+
const GlobalPerformanceLogger =
34+
require('../Utilities/GlobalPerformanceLogger').default;
35+
// We could just call GlobalPerformanceLogger.markPoint at the top of the file,
36+
// but then we'd be excluding the time it took to require the logger.
37+
// Instead, we just use Date.now and backdate the timestamp.
38+
GlobalPerformanceLogger.markPoint(
39+
'initializeCore_start',
40+
GlobalPerformanceLogger.currentTimestamp() - (Date.now() - start),
41+
);
42+
GlobalPerformanceLogger.markPoint('initializeCore_end');

packages/react-native/Libraries/Core/setUpBatchedBridge.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ registerModule(
2727
);
2828
registerModule(
2929
'GlobalPerformanceLogger',
30-
() => require('../ReactNative/DeprecatedPerformanceLoggerStub').default,
30+
() => require('../Utilities/GlobalPerformanceLogger').default,
3131
);
3232

3333
if (__DEV__) {

packages/react-native/Libraries/Network/XMLHttpRequest.js

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
EventCallback,
1515
EventListener,
1616
} from '../../src/private/webapis/dom/events/EventTarget';
17+
import type {IPerformanceLogger} from '../Utilities/createPerformanceLogger';
1718

1819
import Event from '../../src/private/webapis/dom/events/Event';
1920
import {
@@ -26,6 +27,8 @@ import ProgressEvent from '../../src/private/webapis/xhr/events/ProgressEvent';
2627
import {type EventSubscription} from '../vendor/emitter/EventEmitter';
2728

2829
const BlobManager = require('../Blob/BlobManager').default;
30+
const GlobalPerformanceLogger =
31+
require('../Utilities/GlobalPerformanceLogger').default;
2932
const RCTNetworking = require('./RCTNetworking').default;
3033
const base64 = require('base64-js');
3134
const invariant = require('invariant');
@@ -55,17 +58,6 @@ type XHRInterceptor = interface {
5558
loadingFailed(id: number, error: string): void,
5659
};
5760

58-
/**
59-
* Minimal contract for the optional performance logger that callers may attach
60-
* via `setPerformanceLogger(...)`. Defined locally so this module stays
61-
* self-contained and does not depend on any specific logger implementation.
62-
* Any object satisfying these two methods structurally is accepted.
63-
*/
64-
type XHRPerformanceLogger = interface {
65-
startTimespan(key: string): void,
66-
stopTimespan(key: string): void,
67-
};
68-
6961
// The native blob module is optional so inject it here if available.
7062
if (BlobManager.isAvailable) {
7163
BlobManager.addNetworkingHandler();
@@ -175,7 +167,8 @@ class XMLHttpRequest extends EventTarget {
175167
_timedOut: boolean = false;
176168
_trackingName: ?string;
177169
_incrementalEvents: boolean = false;
178-
_performanceLogger: ?XHRPerformanceLogger = null;
170+
_startTime: ?number = null;
171+
_performanceLogger: IPerformanceLogger = GlobalPerformanceLogger;
179172

180173
static __setInterceptor_DO_NOT_USE(interceptor: ?XHRInterceptor) {
181174
XMLHttpRequest._interceptor = interceptor;
@@ -341,10 +334,8 @@ class XMLHttpRequest extends EventTarget {
341334
responseURL: ?string,
342335
): void {
343336
if (requestId === this._requestId) {
344-
const performanceLogger = this._performanceLogger;
345-
if (this._perfKey != null && performanceLogger != null) {
346-
performanceLogger.stopTimespan(this._perfKey);
347-
}
337+
this._perfKey != null &&
338+
this._performanceLogger.stopTimespan(this._perfKey);
348339
this.status = status;
349340
this.setResponseHeaders(responseHeaders);
350341
this.setReadyState(this.HEADERS_RECEIVED);
@@ -530,15 +521,9 @@ class XMLHttpRequest extends EventTarget {
530521
}
531522

532523
/**
533-
* Custom extension that lets callers attach a performance logger receiving
534-
* a `network_XMLHttpRequest_<friendlyName>` start/stop timespan around each
535-
* dispatched request. The logger only needs to implement
536-
* `startTimespan(key)` / `stopTimespan(key)` (see the `XHRPerformanceLogger`
537-
* interface above). When no logger is set the timespan is not emitted.
524+
* Custom extension for setting a custom performance logger
538525
*/
539-
setPerformanceLogger(
540-
performanceLogger: XHRPerformanceLogger,
541-
): XMLHttpRequest {
526+
setPerformanceLogger(performanceLogger: IPerformanceLogger): XMLHttpRequest {
542527
this._performanceLogger = performanceLogger;
543528
return this;
544529
}
@@ -613,11 +598,9 @@ class XMLHttpRequest extends EventTarget {
613598

614599
const doSend = () => {
615600
const friendlyName = this._trackingName ?? this._url;
616-
const performanceLogger = this._performanceLogger;
617-
if (performanceLogger != null) {
618-
this._perfKey = 'network_XMLHttpRequest_' + String(friendlyName);
619-
performanceLogger.startTimespan(this._perfKey);
620-
}
601+
this._perfKey = 'network_XMLHttpRequest_' + String(friendlyName);
602+
this._performanceLogger.startTimespan(this._perfKey);
603+
this._startTime = performance.now();
621604
invariant(
622605
this._method,
623606
'XMLHttpRequest method needs to be defined (%s).',

packages/react-native/Libraries/Network/__tests__/XMLHttpRequest-test.js

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@
1010

1111
'use strict';
1212

13+
const createPerformanceLogger =
14+
require('../../Utilities/createPerformanceLogger').default;
15+
const GlobalPerformanceLogger =
16+
require('../../Utilities/GlobalPerformanceLogger').default;
1317
const Platform = require('../../Utilities/Platform').default;
1418
const XMLHttpRequest = require('../XMLHttpRequest').default;
1519

1620
jest.unmock('../../Utilities/Platform');
21+
jest.mock('../../Utilities/GlobalPerformanceLogger');
1722
let requestId = 1;
1823
function setRequestId(id: number) {
1924
if (Platform.OS === 'ios') {
@@ -241,11 +246,30 @@ describe('XMLHttpRequest', function () {
241246
);
242247
});
243248

249+
it('should log to GlobalPerformanceLogger if a custom performance logger is not set', () => {
250+
xhr.open('GET', 'blabla');
251+
xhr.send();
252+
253+
expect(GlobalPerformanceLogger.startTimespan).toHaveBeenCalledWith(
254+
'network_XMLHttpRequest_blabla',
255+
);
256+
expect(GlobalPerformanceLogger.stopTimespan).not.toHaveBeenCalled();
257+
258+
setRequestId(8);
259+
xhr.__didReceiveResponse(requestId, 200, {
260+
'Content-Type': 'text/plain; charset=utf-8',
261+
'Content-Length': '32',
262+
});
263+
264+
expect(GlobalPerformanceLogger.stopTimespan).toHaveBeenCalledWith(
265+
'network_XMLHttpRequest_blabla',
266+
);
267+
});
268+
244269
it('should log to a custom performance logger if set', () => {
245-
const performanceLogger = {
246-
startTimespan: jest.fn(),
247-
stopTimespan: jest.fn(),
248-
};
270+
const performanceLogger = createPerformanceLogger();
271+
jest.spyOn(performanceLogger, 'startTimespan');
272+
jest.spyOn(performanceLogger, 'stopTimespan');
249273

250274
xhr.setPerformanceLogger(performanceLogger);
251275

@@ -255,6 +279,7 @@ describe('XMLHttpRequest', function () {
255279
expect(performanceLogger.startTimespan).toHaveBeenCalledWith(
256280
'network_XMLHttpRequest_blabla',
257281
);
282+
expect(GlobalPerformanceLogger.startTimespan).not.toHaveBeenCalled();
258283
expect(performanceLogger.stopTimespan).not.toHaveBeenCalled();
259284

260285
setRequestId(9);
@@ -266,6 +291,7 @@ describe('XMLHttpRequest', function () {
266291
expect(performanceLogger.stopTimespan).toHaveBeenCalledWith(
267292
'network_XMLHttpRequest_blabla',
268293
);
294+
expect(GlobalPerformanceLogger.stopTimespan).not.toHaveBeenCalled();
269295
});
270296

271297
it('should sort and lowercase response headers', function () {

packages/react-native/Libraries/ReactNative/AppRegistry.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
*/
99

1010
import type * as React from 'react';
11+
import type {IPerformanceLogger} from '../Utilities/IPerformanceLogger';
1112
import type {ViewStyle} from '../StyleSheet/StyleSheetTypes';
12-
import type {IPerformanceLogger} from './IPerformanceLogger';
1313

1414
type Task = (taskData: any) => Promise<void>;
1515
type TaskProvider = () => Task;

packages/react-native/Libraries/ReactNative/AppRegistry.flow.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
import type {ViewStyleProp} from '../StyleSheet/StyleSheet';
1212
import type {RootTag} from '../Types/RootTagTypes';
13+
import type {IPerformanceLogger} from '../Utilities/createPerformanceLogger';
1314
import type {DisplayModeType} from './DisplayMode';
14-
import type {IPerformanceLogger} from './IPerformanceLogger.flow';
1515

1616
type HeadlessTask = (taskData: any) => Promise<void>;
1717
export type TaskProvider = () => HeadlessTask;

packages/react-native/Libraries/ReactNative/AppRegistryImpl.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import type {
2222
WrapperComponentProvider,
2323
} from './AppRegistry.flow';
2424

25+
import createPerformanceLogger from '../Utilities/createPerformanceLogger';
2526
import SceneTracker from '../Utilities/SceneTracker';
26-
import DeprecatedPerformanceLoggerStub from './DeprecatedPerformanceLoggerStub';
2727
import {coerceDisplayMode} from './DisplayMode';
2828
import HeadlessJsTaskError from './HeadlessJsTaskError';
2929
import invariant from 'invariant';
@@ -81,19 +81,20 @@ export function registerComponent(
8181
componentProvider: ComponentProvider,
8282
section?: boolean,
8383
): string {
84+
const scopedPerformanceLogger = createPerformanceLogger();
8485
runnables[appKey] = (appParameters, displayMode) => {
8586
const renderApplication = require('./renderApplication').default;
8687
renderApplication(
8788
componentProviderInstrumentationHook(
8889
componentProvider,
89-
DeprecatedPerformanceLoggerStub,
90+
scopedPerformanceLogger,
9091
),
9192
appParameters.initialProps,
9293
appParameters.rootTag,
9394
wrapperComponentProvider && wrapperComponentProvider(appParameters),
9495
rootViewStyleProvider && rootViewStyleProvider(appParameters),
9596
true, // fabric - deprecated, always true
96-
undefined, // formerly scopedPerformanceLogger; reserved positional slot
97+
scopedPerformanceLogger,
9798
appKey === 'LogBox', // is logbox
9899
appKey,
99100
displayMode,

packages/react-native/Libraries/ReactNative/DeprecatedPerformanceLoggerStub.js

Lines changed: 0 additions & 83 deletions
This file was deleted.

packages/react-native/Libraries/ReactNative/renderApplication.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
*/
1010

1111
import type {ViewStyleProp} from '../StyleSheet/StyleSheet';
12+
import type {IPerformanceLogger} from '../Utilities/createPerformanceLogger';
1213

14+
import GlobalPerformanceLogger from '../Utilities/GlobalPerformanceLogger';
15+
import PerformanceLoggerContext from '../Utilities/PerformanceLoggerContext';
1316
import AppContainer from './AppContainer';
1417
import DisplayMode, {type DisplayModeType} from './DisplayMode';
1518
import getCachedComponentWithDebugName from './getCachedComponentWithDebugName';
@@ -36,26 +39,27 @@ export default function renderApplication<Props extends Object>(
3639
// Keep this parameter for backwards compatibility only. It is always treated as
3740
// true internally.
3841
fabric?: true | void,
39-
// Reserved positional slot (formerly `scopedPerformanceLogger`). Preserved so
40-
// existing callers that supply this argument continue to type-check; the
41-
// value is ignored.
42-
_unused?: void,
42+
scopedPerformanceLogger?: IPerformanceLogger,
4343
isLogBox?: boolean,
4444
debugName?: string,
4545
displayMode?: ?DisplayModeType,
4646
useOffscreen?: boolean,
4747
) {
4848
invariant(rootTag, 'Expect to have a valid rootTag, instead got ', rootTag);
4949

50+
const performanceLogger = scopedPerformanceLogger ?? GlobalPerformanceLogger;
51+
5052
let renderable: React.MixedElement = (
51-
<AppContainer
52-
rootTag={rootTag}
53-
WrapperComponent={WrapperComponent}
54-
rootViewStyle={rootViewStyle}
55-
initialProps={initialProps ?? Object.freeze({})}
56-
internal_excludeLogBox={isLogBox}>
57-
<RootComponent {...initialProps} rootTag={rootTag} />
58-
</AppContainer>
53+
<PerformanceLoggerContext.Provider value={performanceLogger}>
54+
<AppContainer
55+
rootTag={rootTag}
56+
WrapperComponent={WrapperComponent}
57+
rootViewStyle={rootViewStyle}
58+
initialProps={initialProps ?? Object.freeze({})}
59+
internal_excludeLogBox={isLogBox}>
60+
<RootComponent {...initialProps} rootTag={rootTag} />
61+
</AppContainer>
62+
</PerformanceLoggerContext.Provider>
5963
);
6064

6165
if (__DEV__ && debugName) {
@@ -71,8 +75,8 @@ export default function renderApplication<Props extends Object>(
7175

7276
if (useOffscreen && displayMode != null) {
7377
// $FlowFixMe[incompatible-type]
78+
// $FlowFixMe[prop-missing]
7479
// $FlowFixMe[missing-export]
75-
// $FlowFixMe[prop-missing] `unstable_Activity` is not yet in the React types.
7680
const Activity: ActivityType = React.unstable_Activity;
7781

7882
renderable = (
@@ -83,8 +87,16 @@ export default function renderApplication<Props extends Object>(
8387
);
8488
}
8589

90+
performanceLogger.startTimespan('renderApplication_React_render');
91+
performanceLogger.setExtra('usedReactConcurrentRoot', '1');
92+
performanceLogger.setExtra('usedReactFabric', '1');
93+
performanceLogger.setExtra(
94+
'usedReactProfiler',
95+
Renderer.isProfilingRenderer(),
96+
);
8697
Renderer.renderElement({
8798
element: renderable,
8899
rootTag,
89100
});
101+
performanceLogger.stopTimespan('renderApplication_React_render');
90102
}

0 commit comments

Comments
 (0)