Skip to content

Commit 538c309

Browse files
authored
track when all startup resources are loaded (#205)
1 parent 8b84a77 commit 538c309

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

front_end/core/host/RNPerfMetrics.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,16 @@ class RNPerfMetrics {
186186
});
187187
}
188188

189+
developerResourcesStartupLoadingFinishedEvent(numResources: number, timeSinceLaunch: DOMHighResTimeStamp): void {
190+
this.sendEvent({
191+
eventName: 'DeveloperResources.StartupLoadingFinished',
192+
params: {
193+
numResources,
194+
timeSinceLaunch,
195+
},
196+
});
197+
}
198+
189199
fuseboxSetClientMetadataStarted(): void {
190200
this.sendEvent({eventName: 'FuseboxSetClientMetadataStarted'});
191201
}
@@ -435,6 +445,14 @@ export type DeveloperResourceLoadingFinishedEvent = Readonly<{
435445
}>,
436446
}>;
437447

448+
export type DeveloperResourcesStartupLoadingFinishedEvent = Readonly<{
449+
eventName: 'DeveloperResources.StartupLoadingFinished',
450+
params: Readonly<{
451+
numResources: number,
452+
timeSinceLaunch: DOMHighResTimeStamp,
453+
}>,
454+
}>;
455+
438456
export type FuseboxSetClientMetadataStartedEvent = Readonly<{
439457
eventName: 'FuseboxSetClientMetadataStarted',
440458
}>;
@@ -523,10 +541,10 @@ export type ManualBreakpointSetSucceeded = Readonly<{
523541

524542
export type ReactNativeChromeDevToolsEvent =
525543
EntrypointLoadingStartedEvent|EntrypointLoadingFinishedEvent|DebuggerReadyEvent|BrowserVisibilityChangeEvent|
526-
BrowserErrorEvent|RemoteDebuggingTerminatedEvent|DeveloperResourceLoadingStartedEvent|
527-
DeveloperResourceLoadingFinishedEvent|FuseboxSetClientMetadataStartedEvent|FuseboxSetClientMetadataFinishedEvent|
528-
MemoryPanelActionStartedEvent|MemoryPanelActionFinishedEvent|PanelShownEvent|PanelClosedEvent|
529-
StackTraceSymbolicationSucceeded|StackTraceSymbolicationFailed|StackTraceFrameUrlResolutionSucceeded|
544+
BrowserErrorEvent|RemoteDebuggingTerminatedEvent|DeveloperResourcesStartupLoadingFinishedEvent|
545+
DeveloperResourceLoadingStartedEvent|DeveloperResourceLoadingFinishedEvent|FuseboxSetClientMetadataStartedEvent|
546+
FuseboxSetClientMetadataFinishedEvent|MemoryPanelActionStartedEvent|MemoryPanelActionFinishedEvent|PanelShownEvent|
547+
PanelClosedEvent|StackTraceSymbolicationSucceeded|StackTraceSymbolicationFailed|StackTraceFrameUrlResolutionSucceeded|
530548
StackTraceFrameUrlResolutionFailed|ManualBreakpointSetSucceeded|StackTraceFrameClicked;
531549

532550
export type DecoratedReactNativeChromeDevToolsEvent = CommonEventFields&ReactNativeChromeDevToolsEvent;

front_end/core/sdk/PageResourceLoader.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {
2020
import type {Target} from './Target.js';
2121
import {TargetManager} from './TargetManager.js';
2222

23+
const RNDT_STARTUP_RESOURCES_LOADED_COOLDOWN = 3000;
24+
2325
const UIStrings = {
2426
/**
2527
*@description Error message for canceled source map loads
@@ -82,6 +84,8 @@ interface LoadQueueEntry {
8284
*/
8385
export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<EventTypes> {
8486
#currentlyLoading = 0;
87+
#rndtStartupResourcesLoadedReported = false;
88+
#rndtStartupResourcesLoadedTimeout: number|undefined = undefined;
8589
#currentlyLoadingPerTarget = new Map<Protocol.Target.TargetID|'main', number>();
8690
readonly #maxConcurrentLoads: number;
8791
#pageResources = new Map<string, PageResource>();
@@ -261,6 +265,23 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
261265
await this.acquireLoadSlot(initiator.target);
262266
const resultPromise = this.dispatchLoad(url, initiator);
263267
const result = await resultPromise;
268+
269+
if (!this.#rndtStartupResourcesLoadedReported) {
270+
// If, after initial load, no new resources are scheduled for
271+
// RNDT_STARTUP_RESOURCES_LOADED_COOLDOWN,
272+
// we consider all startup resources to be loaded + settled.
273+
window.clearTimeout(this.#rndtStartupResourcesLoadedTimeout);
274+
this.#rndtStartupResourcesLoadedTimeout = window.setTimeout(() => {
275+
if (!this.#rndtStartupResourcesLoadedReported && this.#currentlyLoading === 0) {
276+
Host.rnPerfMetrics.developerResourcesStartupLoadingFinishedEvent(
277+
this.getNumberOfResources().resources /* numResources */,
278+
performance.now() - RNDT_STARTUP_RESOURCES_LOADED_COOLDOWN /* timeSinceLaunch */,
279+
);
280+
this.#rndtStartupResourcesLoadedReported = true;
281+
}
282+
}, RNDT_STARTUP_RESOURCES_LOADED_COOLDOWN);
283+
}
284+
264285
pageResource.errorMessage = result.errorDescription.message;
265286
pageResource.success = result.success;
266287
if (result.success) {
@@ -354,6 +375,7 @@ export class PageResourceLoader extends Common.ObjectWrapper.ObjectWrapper<Event
354375
}
355376
Host.rnPerfMetrics.developerResourceLoadingFinished(
356377
parsedURL, Host.UserMetrics.DeveloperResourceLoaded.FALLBACK_AFTER_FAILURE, result);
378+
357379
return result;
358380
}
359381

0 commit comments

Comments
 (0)