@paulirish/trace_engine 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/analyze-trace.mjs +7 -4
- package/core/platform/DevToolsPath.d.ts +32 -0
- package/core/platform/DevToolsPath.js +4 -0
- package/core/platform/DevToolsPath.js.map +7 -0
- package/core/platform/MimeType.js +104 -0
- package/core/platform/MimeType.js.map +7 -0
- package/core/platform/Timing.js +10 -0
- package/core/platform/Timing.js.map +7 -0
- package/core/platform/UIString.d.ts +6 -0
- package/core/platform/UIString.js +2 -0
- package/core/platform/UIString.js.map +7 -0
- package/core/platform/UserVisibleError.d.ts +12 -0
- package/core/platform/UserVisibleError.js +14 -0
- package/core/platform/UserVisibleError.js.map +7 -0
- package/core/platform/array-utilities.d.ts +28 -0
- package/core/platform/array-utilities.js +163 -0
- package/core/platform/array-utilities.js.map +7 -0
- package/core/platform/brand.js +1 -0
- package/core/platform/brand.js.map +7 -0
- package/core/platform/bundle-tsconfig.json +1 -0
- package/core/platform/date-utilities.d.ts +2 -0
- package/core/platform/date-utilities.js +10 -0
- package/core/platform/date-utilities.js.map +7 -0
- package/core/platform/dcheck-tsconfig.json +8 -0
- package/core/platform/dcheck.d.ts +4 -0
- package/core/platform/dcheck.js +5 -0
- package/core/platform/devtools_entrypoint-bundle-tsconfig-tsconfig.json +40 -0
- package/core/platform/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/core/platform/dom-utilities.d.ts +6 -0
- package/core/platform/dom-utilities.js +98 -0
- package/core/platform/dom-utilities.js.map +7 -0
- package/core/platform/keyboard-utilities.d.ts +15 -0
- package/core/platform/keyboard-utilities.js +31 -0
- package/core/platform/keyboard-utilities.js.map +7 -0
- package/core/platform/map-utilities.d.ts +14 -0
- package/core/platform/map-utilities.js +70 -0
- package/core/platform/map-utilities.js.map +7 -0
- package/core/platform/number-utilities.d.ts +15 -0
- package/core/platform/number-utilities.js +71 -0
- package/core/platform/number-utilities.js.map +7 -0
- package/core/platform/platform-tsconfig.json +59 -0
- package/core/platform/platform.d.ts +15 -0
- package/core/platform/platform.js +37 -0
- package/core/platform/platform.js.compressed +0 -0
- package/core/platform/platform.js.hash +1 -0
- package/core/platform/platform.js.map +7 -0
- package/core/platform/platform.prebundle.d.ts +15 -0
- package/core/platform/platform.prebundle.js +50 -0
- package/core/platform/platform.prebundle.js.map +1 -0
- package/core/platform/platform.prebundle.ts +64 -0
- package/core/platform/promise-utilities.js +10 -0
- package/core/platform/promise-utilities.js.map +7 -0
- package/core/platform/set-utilities.d.ts +2 -0
- package/core/platform/set-utilities.js +20 -0
- package/core/platform/set-utilities.js.map +7 -0
- package/core/platform/string-utilities.d.ts +40 -0
- package/core/platform/string-utilities.js +439 -0
- package/core/platform/string-utilities.js.map +7 -0
- package/core/platform/typescript-utilities.d.ts +56 -0
- package/core/platform/typescript-utilities.js +13 -0
- package/core/platform/typescript-utilities.js.map +7 -0
- package/generated/protocol.d.ts +16189 -0
- package/generated/protocol.js +2230 -0
- package/models/cpu_profile/CPUProfileDataModel.js +375 -0
- package/models/cpu_profile/CPUProfileDataModel.js.map +7 -0
- package/models/cpu_profile/ProfileTreeModel.js +90 -0
- package/models/cpu_profile/ProfileTreeModel.js.map +7 -0
- package/models/cpu_profile/bundle-tsconfig.json +1 -0
- package/models/cpu_profile/cpu_profile-tsconfig.json +51 -0
- package/models/cpu_profile/cpu_profile.js +7 -0
- package/models/cpu_profile/cpu_profile.js.map +7 -0
- package/models/cpu_profile/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/EntriesFilter.js +182 -0
- package/models/trace/EntriesFilter.js.map +7 -0
- package/models/trace/LegacyTracingModel.d.ts +1 -0
- package/models/trace/LegacyTracingModel.js +1 -0
- package/models/trace/LegacyTracingModel.js.map +7 -0
- package/models/trace/ModelImpl.js +116 -0
- package/models/trace/ModelImpl.js.map +7 -0
- package/models/trace/Processor.js +179 -0
- package/models/trace/Processor.js.map +7 -0
- package/models/trace/SDKServices.js +104 -0
- package/models/trace/SDKServices.js.map +7 -0
- package/models/trace/TraceProcessor.js +133 -0
- package/models/trace/TraceProcessor.js.map +7 -0
- package/models/trace/TracingManager.d.ts +1 -0
- package/models/trace/TracingManager.js +1 -0
- package/models/trace/TracingManager.js.map +7 -0
- package/models/trace/TreeManipulator.js +85 -0
- package/models/trace/TreeManipulator.js.map +7 -0
- package/models/trace/bundle-tsconfig.json +1 -0
- package/models/trace/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/devtools_entrypoint-legacy-typescript-tsconfig.json +43 -0
- package/models/trace/extras/FetchNodes.js +104 -0
- package/models/trace/extras/FetchNodes.js.map +7 -0
- package/models/trace/extras/FilmStrip.js +37 -0
- package/models/trace/extras/FilmStrip.js.map +7 -0
- package/models/trace/extras/MainThreadActivity.js +61 -0
- package/models/trace/extras/MainThreadActivity.js.map +7 -0
- package/models/trace/extras/Metadata.js +28 -0
- package/models/trace/extras/Metadata.js.map +7 -0
- package/models/trace/extras/bundle-tsconfig.json +1 -0
- package/models/trace/extras/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/extras/extras-tsconfig.json +59 -0
- package/models/trace/extras/extras.d.ts +1 -0
- package/models/trace/extras/extras.js +1 -0
- package/models/trace/extras/extras.js.map +7 -0
- package/models/trace/frames/TimelineFrameModel.js +392 -0
- package/models/trace/frames/TimelineFrameModel.js.map +7 -0
- package/models/trace/frames/bundle-tsconfig.json +1 -0
- package/models/trace/frames/devtools_entrypoint-bundle-typescript-tsconfig.json +43 -0
- package/models/trace/frames/frames-tsconfig.json +58 -0
- package/models/trace/frames/frames.js +5 -0
- package/models/trace/frames/frames.js.map +7 -0
- package/models/trace/handlers/AnimationHandler.js +30 -0
- package/models/trace/handlers/AnimationHandler.js.map +7 -0
- package/models/trace/handlers/AuctionWorkletsHandler.js +106 -0
- package/models/trace/handlers/AuctionWorkletsHandler.js.map +7 -0
- package/models/trace/handlers/FramesHandler.js +388 -0
- package/models/trace/handlers/FramesHandler.js.map +7 -0
- package/models/trace/handlers/GPUHandler.js +50 -0
- package/models/trace/handlers/GPUHandler.js.map +7 -0
- package/models/trace/handlers/InitiatorsHandler.js +133 -0
- package/models/trace/handlers/InitiatorsHandler.js.map +7 -0
- package/models/trace/handlers/InvalidationsHandler.js +98 -0
- package/models/trace/handlers/InvalidationsHandler.js.map +7 -0
- package/models/trace/handlers/LargestImagePaintHandler.js +18 -0
- package/models/trace/handlers/LargestImagePaintHandler.js.map +7 -0
- package/models/trace/handlers/LargestTextPaintHandler.js +18 -0
- package/models/trace/handlers/LargestTextPaintHandler.js.map +7 -0
- package/models/trace/handlers/LayerTreeHandler.js +90 -0
- package/models/trace/handlers/LayerTreeHandler.js.map +7 -0
- package/models/trace/handlers/LayoutShiftsHandler.js +270 -0
- package/models/trace/handlers/LayoutShiftsHandler.js.map +7 -0
- package/models/trace/handlers/MemoryHandler.js +17 -0
- package/models/trace/handlers/MemoryHandler.js.map +7 -0
- package/models/trace/handlers/MetaHandler.js +250 -0
- package/models/trace/handlers/MetaHandler.js.map +7 -0
- package/models/trace/handlers/Migration.js +27 -0
- package/models/trace/handlers/Migration.js.map +7 -0
- package/models/trace/handlers/ModelHandlers.js +22 -0
- package/models/trace/handlers/ModelHandlers.js.map +7 -0
- package/models/trace/handlers/NetworkRequestsHandler.js +237 -0
- package/models/trace/handlers/NetworkRequestsHandler.js.map +7 -0
- package/models/trace/handlers/PageLoadMetricsHandler.js +334 -0
- package/models/trace/handlers/PageLoadMetricsHandler.js.map +7 -0
- package/models/trace/handlers/RendererHandler.js +221 -0
- package/models/trace/handlers/RendererHandler.js.map +7 -0
- package/models/trace/handlers/SamplesHandler.js +178 -0
- package/models/trace/handlers/SamplesHandler.js.map +7 -0
- package/models/trace/handlers/ScreenshotsHandler.js +57 -0
- package/models/trace/handlers/ScreenshotsHandler.js.map +7 -0
- package/models/trace/handlers/Threads.js +77 -0
- package/models/trace/handlers/Threads.js.map +7 -0
- package/models/trace/handlers/UberFramesHandler.js +293 -0
- package/models/trace/handlers/UberFramesHandler.js.map +7 -0
- package/models/trace/handlers/UserInteractionsHandler.js +168 -0
- package/models/trace/handlers/UserInteractionsHandler.js.map +7 -0
- package/models/trace/handlers/UserTimingsHandler.js +97 -0
- package/models/trace/handlers/UserTimingsHandler.js.map +7 -0
- package/models/trace/handlers/WarningsHandler.js +87 -0
- package/models/trace/handlers/WarningsHandler.js.map +7 -0
- package/models/trace/handlers/WorkersHandler.js +50 -0
- package/models/trace/handlers/WorkersHandler.js.map +7 -0
- package/models/trace/handlers/bundle-tsconfig.json +1 -0
- package/models/trace/handlers/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/handlers/handlers-tsconfig.json +79 -0
- package/models/trace/handlers/handlers.js +4 -0
- package/models/trace/handlers/handlers.js.map +7 -0
- package/models/trace/handlers/types.js +18 -0
- package/models/trace/handlers/types.js.map +7 -0
- package/models/trace/helpers/SamplesIntegrator.js +220 -0
- package/models/trace/helpers/SamplesIntegrator.js.map +7 -0
- package/models/trace/helpers/Timing.js +141 -0
- package/models/trace/helpers/Timing.js.map +7 -0
- package/models/trace/helpers/Trace.js +196 -0
- package/models/trace/helpers/Trace.js.map +7 -0
- package/models/trace/helpers/TreeHelpers.js +119 -0
- package/models/trace/helpers/TreeHelpers.js.map +7 -0
- package/models/trace/helpers/bundle-tsconfig.json +1 -0
- package/models/trace/helpers/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/helpers/helpers-tsconfig.json +59 -0
- package/models/trace/helpers/helpers.js +5 -0
- package/models/trace/helpers/helpers.js.map +7 -0
- package/models/trace/legacy-tsconfig.json +1 -0
- package/models/trace/root-causes/LayoutShift.js +370 -0
- package/models/trace/root-causes/LayoutShift.js.map +7 -0
- package/models/trace/root-causes/RootCauses.js +8 -0
- package/models/trace/root-causes/RootCauses.js.map +7 -0
- package/models/trace/root-causes/bundle-tsconfig.json +1 -0
- package/models/trace/root-causes/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/root-causes/root-causes-tsconfig.json +57 -0
- package/models/trace/root-causes/root-causes.js +2 -0
- package/models/trace/root-causes/root-causes.js.map +7 -0
- package/models/trace/sdk_services/DOMNodeLookup.js +41 -0
- package/models/trace/sdk_services/DOMNodeLookup.js.map +7 -0
- package/models/trace/sdk_services/LayoutShifts.js +68 -0
- package/models/trace/sdk_services/LayoutShifts.js.map +7 -0
- package/models/trace/sdk_services/bundle-tsconfig.json +1 -0
- package/models/trace/sdk_services/devtools_entrypoint-bundle-typescript-tsconfig.json +41 -0
- package/models/trace/sdk_services/sdk_services-tsconfig.json +57 -0
- package/models/trace/sdk_services/sdk_services.js +7 -0
- package/models/trace/sdk_services/sdk_services.js.map +7 -0
- package/models/trace/trace-legacy.js +16 -0
- package/models/trace/trace-legacy.js.map +7 -0
- package/models/trace/trace-tsconfig.json +69 -0
- package/models/trace/trace.js +23 -0
- package/models/trace/trace.js.map +7 -0
- package/models/trace/types/Configuration.js +18 -0
- package/models/trace/types/Configuration.js.map +7 -0
- package/models/trace/types/File.js +6 -0
- package/models/trace/types/File.js.map +7 -0
- package/models/trace/types/Timing.js +17 -0
- package/models/trace/types/Timing.js.map +7 -0
- package/models/trace/types/TraceEvents.js +595 -0
- package/models/trace/types/TraceEvents.js.map +7 -0
- package/models/trace/types/bundle-tsconfig.json +1 -0
- package/models/trace/types/devtools_entrypoint-bundle-typescript-tsconfig.json +44 -0
- package/models/trace/types/types-tsconfig.json +47 -0
- package/models/trace/types/types.js +5 -0
- package/models/trace/types/types.js.map +7 -0
- package/models/trace/worker/Processor.js +143 -0
- package/models/trace/worker/Processor.js.map +7 -0
- package/models/trace/worker/Types.js +1 -0
- package/models/trace/worker/Types.js.map +7 -0
- package/models/trace/worker/bundle-tsconfig.json +1 -0
- package/models/trace/worker/devtools_entrypoint-bundle-typescript-tsconfig.json +41 -0
- package/models/trace/worker/devtools_entrypoint-worker_entrypoint-typescript-tsconfig.json +41 -0
- package/models/trace/worker/processor-tsconfig.json +45 -0
- package/models/trace/worker/worker.js +7 -0
- package/models/trace/worker/worker.js.map +7 -0
- package/models/trace/worker/worker_entrypoint-tsconfig.json +1 -0
- package/models/trace/worker/worker_entrypoint.js +36 -0
- package/models/trace/worker/worker_entrypoint.js.map +7 -0
- package/package.json +2 -2
- package/trace.mjs +15 -8
- package/trace.mjs.map +3 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"checkJs": true,
|
|
5
|
+
"composite": true,
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"inlineSources": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"esnext",
|
|
12
|
+
"dom",
|
|
13
|
+
"dom.iterable"
|
|
14
|
+
],
|
|
15
|
+
"module": "esnext",
|
|
16
|
+
"noEmitOnError": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"noImplicitOverride": true,
|
|
19
|
+
"noImplicitReturns": true,
|
|
20
|
+
"noUnusedLocals": false,
|
|
21
|
+
"outDir": ".",
|
|
22
|
+
"rootDir": "../../../../../../front_end/models/trace",
|
|
23
|
+
"skipLibCheck": true,
|
|
24
|
+
"sourceMap": true,
|
|
25
|
+
"strict": true,
|
|
26
|
+
"target": "esnext",
|
|
27
|
+
"tsBuildInfoFile": "devtools_entrypoint-bundle-typescript-tsconfig.json.tsbuildinfo",
|
|
28
|
+
"typeRoots": [],
|
|
29
|
+
"useUnknownInCatchVariables": false
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"../../../../../../front_end/models/trace/trace.ts",
|
|
33
|
+
"../../../../../../front_end/legacy/legacy-defs.d.ts",
|
|
34
|
+
"../../../../../../front_end/global_typings/global_defs.d.ts",
|
|
35
|
+
"../../../../../../front_end/global_typings/request_idle_callback.d.ts",
|
|
36
|
+
"../../../../../../node_modules/@types/filesystem/index.d.ts",
|
|
37
|
+
"../../../../../../node_modules/@webgpu/types/dist/index.d.ts"
|
|
38
|
+
],
|
|
39
|
+
"references": [
|
|
40
|
+
{
|
|
41
|
+
"path": "./trace-tsconfig.json"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"checkJs": true,
|
|
5
|
+
"composite": true,
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"inlineSources": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"esnext",
|
|
12
|
+
"dom",
|
|
13
|
+
"dom.iterable"
|
|
14
|
+
],
|
|
15
|
+
"module": "esnext",
|
|
16
|
+
"noEmitOnError": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"noImplicitOverride": true,
|
|
19
|
+
"noImplicitReturns": true,
|
|
20
|
+
"noUnusedLocals": false,
|
|
21
|
+
"outDir": ".",
|
|
22
|
+
"rootDir": "../../../../../../front_end/models/trace",
|
|
23
|
+
"skipLibCheck": true,
|
|
24
|
+
"sourceMap": true,
|
|
25
|
+
"strict": true,
|
|
26
|
+
"target": "esnext",
|
|
27
|
+
"tsBuildInfoFile": "devtools_entrypoint-legacy-typescript-tsconfig.json.tsbuildinfo",
|
|
28
|
+
"typeRoots": [],
|
|
29
|
+
"useUnknownInCatchVariables": false
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"../../../../../../front_end/models/trace/trace-legacy.ts",
|
|
33
|
+
"../../../../../../front_end/legacy/legacy-defs.d.ts",
|
|
34
|
+
"../../../../../../front_end/global_typings/global_defs.d.ts",
|
|
35
|
+
"../../../../../../front_end/global_typings/request_idle_callback.d.ts",
|
|
36
|
+
"../../../../../../node_modules/@types/filesystem/index.d.ts"
|
|
37
|
+
],
|
|
38
|
+
"references": [
|
|
39
|
+
{
|
|
40
|
+
"path": "./bundle-tsconfig.json"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as SDK from "../../../core/sdk/sdk.js";
|
|
2
|
+
const domLookUpSingleNodeCache = /* @__PURE__ */ new Map();
|
|
3
|
+
const domLookUpBatchNodesCache = /* @__PURE__ */ new Map();
|
|
4
|
+
export function _TEST_clearCache() {
|
|
5
|
+
domLookUpSingleNodeCache.clear();
|
|
6
|
+
domLookUpBatchNodesCache.clear();
|
|
7
|
+
layoutShiftSourcesCache.clear();
|
|
8
|
+
normalizedLayoutShiftNodesCache.clear();
|
|
9
|
+
}
|
|
10
|
+
export async function domNodeForBackendNodeID(modelData, nodeId) {
|
|
11
|
+
const fromCache = domLookUpSingleNodeCache.get(modelData)?.get(nodeId);
|
|
12
|
+
if (fromCache !== void 0) {
|
|
13
|
+
return fromCache;
|
|
14
|
+
}
|
|
15
|
+
const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();
|
|
16
|
+
const domModel = target?.model(SDK.DOMModel.DOMModel);
|
|
17
|
+
if (!domModel) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const domNodesMap = await domModel.pushNodesByBackendIdsToFrontend(/* @__PURE__ */ new Set([nodeId]));
|
|
21
|
+
const result = domNodesMap?.get(nodeId) || null;
|
|
22
|
+
const cacheForModel = domLookUpSingleNodeCache.get(modelData) || /* @__PURE__ */ new Map();
|
|
23
|
+
cacheForModel.set(nodeId, result);
|
|
24
|
+
domLookUpSingleNodeCache.set(modelData, cacheForModel);
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
export async function domNodesForMultipleBackendNodeIds(modelData, nodeIds) {
|
|
28
|
+
const fromCache = domLookUpBatchNodesCache.get(modelData)?.get(nodeIds);
|
|
29
|
+
if (fromCache) {
|
|
30
|
+
return fromCache;
|
|
31
|
+
}
|
|
32
|
+
const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();
|
|
33
|
+
const domModel = target?.model(SDK.DOMModel.DOMModel);
|
|
34
|
+
if (!domModel) {
|
|
35
|
+
return /* @__PURE__ */ new Map();
|
|
36
|
+
}
|
|
37
|
+
const domNodesMap = await domModel.pushNodesByBackendIdsToFrontend(nodeIds) || /* @__PURE__ */ new Map();
|
|
38
|
+
const cacheForModel = domLookUpBatchNodesCache.get(modelData) || /* @__PURE__ */ new Map();
|
|
39
|
+
cacheForModel.set(nodeIds, domNodesMap);
|
|
40
|
+
domLookUpBatchNodesCache.set(modelData, cacheForModel);
|
|
41
|
+
return domNodesMap;
|
|
42
|
+
}
|
|
43
|
+
const layoutShiftSourcesCache = /* @__PURE__ */ new Map();
|
|
44
|
+
const normalizedLayoutShiftNodesCache = /* @__PURE__ */ new Map();
|
|
45
|
+
export async function sourcesForLayoutShift(modelData, event) {
|
|
46
|
+
const fromCache = layoutShiftSourcesCache.get(modelData)?.get(event);
|
|
47
|
+
if (fromCache) {
|
|
48
|
+
return fromCache;
|
|
49
|
+
}
|
|
50
|
+
const impactedNodes = event.args.data?.impacted_nodes;
|
|
51
|
+
if (!impactedNodes) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const sources = [];
|
|
55
|
+
await Promise.all(impactedNodes.map(async (node) => {
|
|
56
|
+
const domNode = await domNodeForBackendNodeID(modelData, node.node_id);
|
|
57
|
+
if (domNode) {
|
|
58
|
+
sources.push({
|
|
59
|
+
previousRect: new DOMRect(node.old_rect[0], node.old_rect[1], node.old_rect[2], node.old_rect[3]),
|
|
60
|
+
currentRect: new DOMRect(node.new_rect[0], node.new_rect[1], node.new_rect[2], node.new_rect[3]),
|
|
61
|
+
node: domNode
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}));
|
|
65
|
+
const cacheForModel = layoutShiftSourcesCache.get(modelData) || /* @__PURE__ */ new Map();
|
|
66
|
+
cacheForModel.set(event, sources);
|
|
67
|
+
layoutShiftSourcesCache.set(modelData, cacheForModel);
|
|
68
|
+
return sources;
|
|
69
|
+
}
|
|
70
|
+
export async function normalizedImpactedNodesForLayoutShift(modelData, event) {
|
|
71
|
+
const fromCache = normalizedLayoutShiftNodesCache.get(modelData)?.get(event);
|
|
72
|
+
if (fromCache) {
|
|
73
|
+
return fromCache;
|
|
74
|
+
}
|
|
75
|
+
const impactedNodes = event.args?.data?.impacted_nodes;
|
|
76
|
+
if (!impactedNodes) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
let viewportScale = null;
|
|
80
|
+
const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();
|
|
81
|
+
const evaluateResult = await target?.runtimeAgent().invoke_evaluate({ expression: "window.devicePixelRatio" });
|
|
82
|
+
if (evaluateResult?.result.type === "number") {
|
|
83
|
+
viewportScale = evaluateResult?.result.value ?? null;
|
|
84
|
+
}
|
|
85
|
+
if (!viewportScale) {
|
|
86
|
+
return impactedNodes;
|
|
87
|
+
}
|
|
88
|
+
const normalizedNodes = [];
|
|
89
|
+
for (const impactedNode of impactedNodes) {
|
|
90
|
+
const newNode = { ...impactedNode };
|
|
91
|
+
for (let i = 0; i < impactedNode.old_rect.length; i++) {
|
|
92
|
+
newNode.old_rect[i] /= viewportScale;
|
|
93
|
+
}
|
|
94
|
+
for (let i = 0; i < impactedNode.new_rect.length; i++) {
|
|
95
|
+
newNode.new_rect[i] /= viewportScale;
|
|
96
|
+
}
|
|
97
|
+
normalizedNodes.push(newNode);
|
|
98
|
+
}
|
|
99
|
+
const cacheForModel = normalizedLayoutShiftNodesCache.get(modelData) || /* @__PURE__ */ new Map();
|
|
100
|
+
cacheForModel.set(event, normalizedNodes);
|
|
101
|
+
normalizedLayoutShiftNodesCache.set(modelData, cacheForModel);
|
|
102
|
+
return normalizedNodes;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=FetchNodes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../front_end/models/trace/extras/FetchNodes.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport type * as Protocol from '../../../generated/protocol.js';\nimport * as SDK from '../../../core/sdk/sdk.js';\nimport type * as Handlers from '../handlers/handlers.js';\nimport type * as Types from '../types/types.js';\n\nconst domLookUpSingleNodeCache =\n new Map<Handlers.Types.TraceParseData, Map<Protocol.DOM.BackendNodeId, SDK.DOMModel.DOMNode|null>>();\nconst domLookUpBatchNodesCache = new Map<\n Handlers.Types.TraceParseData,\n Map<Set<Protocol.DOM.BackendNodeId>, Map<Protocol.DOM.BackendNodeId, SDK.DOMModel.DOMNode|null>>>();\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport function _TEST_clearCache(): void {\n domLookUpSingleNodeCache.clear();\n domLookUpBatchNodesCache.clear();\n layoutShiftSourcesCache.clear();\n normalizedLayoutShiftNodesCache.clear();\n}\n\n/**\n * Looks up the DOM Node on the page for the given BackendNodeId. Uses the\n * provided TraceParseData as the cache and will cache the result after the\n * first lookup.\n */\nexport async function domNodeForBackendNodeID(\n modelData: Handlers.Types.TraceParseData, nodeId: Protocol.DOM.BackendNodeId): Promise<SDK.DOMModel.DOMNode|null> {\n const fromCache = domLookUpSingleNodeCache.get(modelData)?.get(nodeId);\n if (fromCache !== undefined) {\n return fromCache;\n }\n\n const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();\n const domModel = target?.model(SDK.DOMModel.DOMModel);\n if (!domModel) {\n return null;\n }\n\n const domNodesMap = await domModel.pushNodesByBackendIdsToFrontend(new Set([nodeId]));\n const result = domNodesMap?.get(nodeId) || null;\n\n const cacheForModel =\n domLookUpSingleNodeCache.get(modelData) || new Map<Protocol.DOM.BackendNodeId, SDK.DOMModel.DOMNode|null>();\n cacheForModel.set(nodeId, result);\n domLookUpSingleNodeCache.set(modelData, cacheForModel);\n\n return result;\n}\n\n/**\n * Takes a set of Protocol.DOM.BackendNodeId ids and will return a map of NodeId=>DOMNode.\n * Results are cached based on 1) the provided TraceParseData and 2) the provided set of IDs.\n */\nexport async function domNodesForMultipleBackendNodeIds(\n modelData: Handlers.Types.TraceParseData,\n nodeIds: Set<Protocol.DOM.BackendNodeId>): Promise<Map<Protocol.DOM.BackendNodeId, SDK.DOMModel.DOMNode|null>> {\n const fromCache = domLookUpBatchNodesCache.get(modelData)?.get(nodeIds);\n if (fromCache) {\n return fromCache;\n }\n const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();\n const domModel = target?.model(SDK.DOMModel.DOMModel);\n if (!domModel) {\n return new Map();\n }\n\n const domNodesMap = await domModel.pushNodesByBackendIdsToFrontend(nodeIds) || new Map();\n\n const cacheForModel = domLookUpBatchNodesCache.get(modelData) ||\n new Map<Set<Protocol.DOM.BackendNodeId>, Map<Protocol.DOM.BackendNodeId, SDK.DOMModel.DOMNode|null>>();\n cacheForModel.set(nodeIds, domNodesMap);\n domLookUpBatchNodesCache.set(modelData, cacheForModel);\n\n return domNodesMap;\n}\n\nconst layoutShiftSourcesCache = new Map<\n Handlers.Types.TraceParseData, Map<Types.TraceEvents.TraceEventLayoutShift, readonly LayoutShiftSource[]>>();\n\nconst normalizedLayoutShiftNodesCache = new Map<\n Handlers.Types.TraceParseData,\n Map<Types.TraceEvents.TraceEventLayoutShift, readonly Types.TraceEvents.TraceImpactedNode[]>>();\n\nexport interface LayoutShiftSource {\n previousRect: DOMRect;\n currentRect: DOMRect;\n node: SDK.DOMModel.DOMNode;\n}\n\n/**\n * Calculates and returns a list of sources for a LayoutShift.\n * Here, a source is considered as a node that moved and contributed to the\n * given LayoutShift existing and the score it was given. Each source returned\n * contains a reference to the DOM Node, and its dimensions (as a DOMRect), both\n * before and now, so we can see how this node changed and how that impacted the\n * layout shift.\n *\n * This data is cached based on the provided model data and the given layout\n * shift, so it is is safe to call multiple times with the same input.\n */\nexport async function sourcesForLayoutShift(\n modelData: Handlers.Types.TraceParseData,\n event: Types.TraceEvents.TraceEventLayoutShift): Promise<readonly LayoutShiftSource[]> {\n const fromCache = layoutShiftSourcesCache.get(modelData)?.get(event);\n if (fromCache) {\n return fromCache;\n }\n const impactedNodes = event.args.data?.impacted_nodes;\n if (!impactedNodes) {\n return [];\n }\n const sources: LayoutShiftSource[] = [];\n await Promise.all(impactedNodes.map(async node => {\n const domNode = await domNodeForBackendNodeID(modelData, node.node_id);\n if (domNode) {\n sources.push({\n previousRect: new DOMRect(node.old_rect[0], node.old_rect[1], node.old_rect[2], node.old_rect[3]),\n currentRect: new DOMRect(node.new_rect[0], node.new_rect[1], node.new_rect[2], node.new_rect[3]),\n node: domNode,\n });\n }\n }));\n const cacheForModel =\n layoutShiftSourcesCache.get(modelData) || new Map<Types.TraceEvents.TraceEventLayoutShift, LayoutShiftSource[]>();\n cacheForModel.set(event, sources);\n layoutShiftSourcesCache.set(modelData, cacheForModel);\n return sources;\n}\n\n/**\n * Takes a LayoutShift and normalizes its node dimensions based on the device\n * pixel ratio (DPR) of the user's display.\n * This is required because the Layout Instability API is not based on CSS\n * pixels, but physical pixels. Therefore we need to map these to normalized CSS\n * pixels if we can. For example, if the user is on a device with a DPR of 2,\n * the values of the node dimensions reported by the Instability API need to be\n * divided by 2 to be accurate.\n * This function is safe to call multiple times as results are cached based on\n * the provided model data.\n * See https://crbug.com/1300309 for details.\n */\nexport async function normalizedImpactedNodesForLayoutShift(\n modelData: Handlers.Types.TraceParseData,\n event: Types.TraceEvents.TraceEventLayoutShift): Promise<readonly Types.TraceEvents.TraceImpactedNode[]> {\n const fromCache = normalizedLayoutShiftNodesCache.get(modelData)?.get(event);\n if (fromCache) {\n return fromCache;\n }\n const impactedNodes = event.args?.data?.impacted_nodes;\n if (!impactedNodes) {\n return [];\n }\n\n let viewportScale: number|null = null;\n const target = SDK.TargetManager.TargetManager.instance().primaryPageTarget();\n // Get the CSS-to-physical pixel ratio of the device the inspected\n // target is running at.\n const evaluateResult = await target?.runtimeAgent().invoke_evaluate({expression: 'window.devicePixelRatio'});\n if (evaluateResult?.result.type === 'number') {\n viewportScale = evaluateResult?.result.value as number ?? null;\n }\n\n if (!viewportScale) {\n // Bail and return the nodes as is.\n return impactedNodes;\n }\n\n const normalizedNodes: Types.TraceEvents.TraceImpactedNode[] = [];\n for (const impactedNode of impactedNodes) {\n const newNode = {...impactedNode};\n for (let i = 0; i < impactedNode.old_rect.length; i++) {\n newNode.old_rect[i] /= viewportScale;\n }\n for (let i = 0; i < impactedNode.new_rect.length; i++) {\n newNode.new_rect[i] /= viewportScale;\n }\n normalizedNodes.push(newNode);\n }\n\n const cacheForModel = normalizedLayoutShiftNodesCache.get(modelData) ||\n new Map<Types.TraceEvents.TraceEventLayoutShift, readonly Types.TraceEvents.TraceImpactedNode[]>();\n cacheForModel.set(event, normalizedNodes);\n normalizedLayoutShiftNodesCache.set(modelData, cacheForModel);\n\n return normalizedNodes;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as Platform from "../../../core/platform/platform.js";
|
|
2
|
+
const filmStripCache = /* @__PURE__ */ new Map();
|
|
3
|
+
export function fromTraceData(traceData, customZeroTime) {
|
|
4
|
+
const frames = [];
|
|
5
|
+
const zeroTime = typeof customZeroTime !== "undefined" ? customZeroTime : traceData.Meta.traceBounds.min;
|
|
6
|
+
const spanTime = traceData.Meta.traceBounds.range;
|
|
7
|
+
const fromCache = filmStripCache.get(traceData)?.get(zeroTime);
|
|
8
|
+
if (fromCache) {
|
|
9
|
+
return fromCache;
|
|
10
|
+
}
|
|
11
|
+
for (const screenshotEvent of traceData.Screenshots) {
|
|
12
|
+
if (screenshotEvent.ts < zeroTime) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const frame = {
|
|
16
|
+
index: frames.length,
|
|
17
|
+
screenshotEvent
|
|
18
|
+
};
|
|
19
|
+
frames.push(frame);
|
|
20
|
+
}
|
|
21
|
+
const result = {
|
|
22
|
+
zeroTime,
|
|
23
|
+
spanTime,
|
|
24
|
+
frames: Array.from(frames)
|
|
25
|
+
};
|
|
26
|
+
const cachedForData = Platform.MapUtilities.getWithDefault(filmStripCache, traceData, () => /* @__PURE__ */ new Map());
|
|
27
|
+
cachedForData.set(zeroTime, result);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
export function frameClosestToTimestamp(filmStrip, searchTimestamp) {
|
|
31
|
+
const closestFrameIndexBeforeTimestamp = Platform.ArrayUtilities.nearestIndexFromEnd(filmStrip.frames, (frame) => frame.screenshotEvent.ts < searchTimestamp);
|
|
32
|
+
if (closestFrameIndexBeforeTimestamp === null) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return filmStrip.frames[closestFrameIndexBeforeTimestamp];
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=FilmStrip.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../front_end/models/trace/extras/FilmStrip.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n//\nimport * as Platform from '../../../core/platform/platform.js';\nimport type * as Handlers from '../handlers/handlers.js';\nimport type * as Types from '../types/types.js';\n\nexport interface Data {\n zeroTime: Types.Timing.MicroSeconds;\n spanTime: Types.Timing.MicroSeconds;\n frames: readonly Frame[];\n}\n\nexport interface Frame {\n screenshotEvent: Types.TraceEvents.SyntheticScreenshot;\n index: number;\n}\n\nexport type HandlersWithFilmStrip = Handlers.Types.HandlersWithMeta<{\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Screenshots: typeof Handlers.ModelHandlers.Screenshots,\n}>;\n\nexport type HandlerDataWithScreenshots = Handlers.Types.EnabledHandlerDataWithMeta<{\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Screenshots: typeof Handlers.ModelHandlers.Screenshots,\n}>;\n\n// Cache film strips based on:\n// 1. The trace parsed data object\n// 2. The start time.\nconst filmStripCache = new Map<HandlerDataWithScreenshots, Map<Types.Timing.MicroSeconds, Data>>();\n\nexport function fromTraceData(traceData: HandlerDataWithScreenshots, customZeroTime?: Types.Timing.MicroSeconds): Data {\n const frames: Frame[] = [];\n\n const zeroTime = typeof customZeroTime !== 'undefined' ? customZeroTime : traceData.Meta.traceBounds.min;\n const spanTime = traceData.Meta.traceBounds.range;\n const fromCache = filmStripCache.get(traceData)?.get(zeroTime);\n if (fromCache) {\n return fromCache;\n }\n\n for (const screenshotEvent of traceData.Screenshots) {\n if (screenshotEvent.ts < zeroTime) {\n continue;\n }\n const frame: Frame = {\n index: frames.length,\n screenshotEvent: screenshotEvent,\n };\n frames.push(frame);\n }\n\n const result: Data = {\n zeroTime,\n spanTime,\n frames: Array.from(frames),\n };\n\n const cachedForData =\n Platform.MapUtilities.getWithDefault(filmStripCache, traceData, () => new Map<Types.Timing.MicroSeconds, Data>());\n cachedForData.set(zeroTime, result);\n\n return result;\n}\n\nexport function frameClosestToTimestamp(filmStrip: Data, searchTimestamp: Types.Timing.MicroSeconds): Frame|null {\n const closestFrameIndexBeforeTimestamp = Platform.ArrayUtilities.nearestIndexFromEnd(\n filmStrip.frames, frame => frame.screenshotEvent.ts < searchTimestamp);\n if (closestFrameIndexBeforeTimestamp === null) {\n return null;\n }\n return filmStrip.frames[closestFrameIndexBeforeTimestamp];\n}\n"],
|
|
5
|
+
"mappings": "AAIA;AA4BA,MAAM,iBAAiB,oBAAI;AAEpB,8BAAuB,WAAuC,gBAAkD;AACrH,QAAM,SAAkB;AAExB,QAAM,WAAW,OAAO,mBAAmB,cAAc,iBAAiB,UAAU,KAAK,YAAY;AACrG,QAAM,WAAW,UAAU,KAAK,YAAY;AAC5C,QAAM,YAAY,eAAe,IAAI,YAAY,IAAI;AACrD,MAAI,WAAW;AACb,WAAO;AAAA;AAGT,aAAW,mBAAmB,UAAU,aAAa;AACnD,QAAI,gBAAgB,KAAK,UAAU;AACjC;AAAA;AAEF,UAAM,QAAe;AAAA,MACnB,OAAO,OAAO;AAAA,MACd;AAAA;AAEF,WAAO,KAAK;AAAA;AAGd,QAAM,SAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,QAAQ,MAAM,KAAK;AAAA;AAGrB,QAAM,gBACF,SAAS,aAAa,eAAe,gBAAgB,WAAW,MAAM,oBAAI;AAC9E,gBAAc,IAAI,UAAU;AAE5B,SAAO;AAAA;AAGF,wCAAiC,WAAiB,iBAAwD;AAC/G,QAAM,mCAAmC,SAAS,eAAe,oBAC7D,UAAU,QAAQ,WAAS,MAAM,gBAAgB,KAAK;AAC1D,MAAI,qCAAqC,MAAM;AAC7C,WAAO;AAAA;AAET,SAAO,UAAU,OAAO;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as Helpers from "../helpers/helpers.js";
|
|
2
|
+
import * as Types from "../types/types.js";
|
|
3
|
+
const IDLE_FUNCTION_CALL_NAMES = /* @__PURE__ */ new Set([
|
|
4
|
+
"(program)",
|
|
5
|
+
"(idle)",
|
|
6
|
+
"(root)"
|
|
7
|
+
]);
|
|
8
|
+
export function calculateWindow(traceBounds, mainThreadEntries) {
|
|
9
|
+
if (!mainThreadEntries.length) {
|
|
10
|
+
return traceBounds;
|
|
11
|
+
}
|
|
12
|
+
const entriesWithIdleRemoved = mainThreadEntries.filter((entry) => {
|
|
13
|
+
if (Types.TraceEvents.isProfileCall(entry) && (IDLE_FUNCTION_CALL_NAMES.has(entry.callFrame.functionName) || !entry.callFrame.functionName)) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
});
|
|
18
|
+
if (entriesWithIdleRemoved.length === 0) {
|
|
19
|
+
return traceBounds;
|
|
20
|
+
}
|
|
21
|
+
function findLowUtilizationRegion(startIndex, stopIndex) {
|
|
22
|
+
const threshold = 0.1;
|
|
23
|
+
let cutIndex = startIndex;
|
|
24
|
+
const entryAtCut = entriesWithIdleRemoved[cutIndex];
|
|
25
|
+
const timings = Helpers.Timing.eventTimingsMicroSeconds(entryAtCut);
|
|
26
|
+
let cutTime = (timings.startTime + timings.endTime) / 2;
|
|
27
|
+
let usedTime = 0;
|
|
28
|
+
const step = Math.sign(stopIndex - startIndex);
|
|
29
|
+
for (let i = startIndex; i !== stopIndex; i += step) {
|
|
30
|
+
const task = entriesWithIdleRemoved[i];
|
|
31
|
+
const taskTimings = Helpers.Timing.eventTimingsMicroSeconds(task);
|
|
32
|
+
const taskTime = (taskTimings.startTime + taskTimings.endTime) / 2;
|
|
33
|
+
const interval = Math.abs(cutTime - taskTime);
|
|
34
|
+
if (usedTime < threshold * interval) {
|
|
35
|
+
cutIndex = i;
|
|
36
|
+
cutTime = taskTime;
|
|
37
|
+
usedTime = 0;
|
|
38
|
+
}
|
|
39
|
+
usedTime += taskTimings.duration;
|
|
40
|
+
}
|
|
41
|
+
return cutIndex;
|
|
42
|
+
}
|
|
43
|
+
const rightIndex = findLowUtilizationRegion(entriesWithIdleRemoved.length - 1, 0);
|
|
44
|
+
const leftIndex = findLowUtilizationRegion(0, rightIndex);
|
|
45
|
+
const leftTimings = Helpers.Timing.eventTimingsMicroSeconds(entriesWithIdleRemoved[leftIndex]);
|
|
46
|
+
const rightTimings = Helpers.Timing.eventTimingsMicroSeconds(entriesWithIdleRemoved[rightIndex]);
|
|
47
|
+
let leftTime = leftTimings.startTime;
|
|
48
|
+
let rightTime = rightTimings.endTime;
|
|
49
|
+
const zoomedInSpan = rightTime - leftTime;
|
|
50
|
+
if (zoomedInSpan < traceBounds.range * 0.1) {
|
|
51
|
+
return traceBounds;
|
|
52
|
+
}
|
|
53
|
+
leftTime = Types.Timing.MicroSeconds(Math.max(leftTime - 0.05 * zoomedInSpan, traceBounds.min));
|
|
54
|
+
rightTime = Types.Timing.MicroSeconds(Math.min(rightTime + 0.05 * zoomedInSpan, traceBounds.max));
|
|
55
|
+
return {
|
|
56
|
+
min: leftTime,
|
|
57
|
+
max: rightTime,
|
|
58
|
+
range: Types.Timing.MicroSeconds(rightTime - leftTime)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=MainThreadActivity.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../front_end/models/trace/extras/MainThreadActivity.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nconst IDLE_FUNCTION_CALL_NAMES = new Set([\n '(program)',\n '(idle)',\n '(root)',\n]);\n\nexport function calculateWindow(\n traceBounds: Types.Timing.TraceWindowMicroSeconds,\n mainThreadEntries: readonly Types.TraceEvents.SyntheticTraceEntry[]): Types.Timing.TraceWindowMicroSeconds {\n if (!mainThreadEntries.length) {\n return traceBounds;\n }\n const entriesWithIdleRemoved = mainThreadEntries.filter(entry => {\n if (Types.TraceEvents.isProfileCall(entry) &&\n (IDLE_FUNCTION_CALL_NAMES.has(entry.callFrame.functionName) || !entry.callFrame.functionName)) {\n return false;\n }\n return true;\n });\n\n if (entriesWithIdleRemoved.length === 0) {\n return traceBounds;\n }\n /**\n * Calculates regions of low utilization and returns the index of the event\n * that is the first event that should be included.\n **/\n function findLowUtilizationRegion(startIndex: number, stopIndex: number): number {\n const threshold = 0.1;\n\n let cutIndex = startIndex;\n const entryAtCut = entriesWithIdleRemoved[cutIndex];\n const timings = Helpers.Timing.eventTimingsMicroSeconds(entryAtCut);\n let cutTime = (timings.startTime + timings.endTime) / 2;\n let usedTime = 0;\n const step = Math.sign(stopIndex - startIndex);\n for (let i = startIndex; i !== stopIndex; i += step) {\n const task = entriesWithIdleRemoved[i];\n const taskTimings = Helpers.Timing.eventTimingsMicroSeconds(task);\n const taskTime = (taskTimings.startTime + taskTimings.endTime) / 2;\n const interval = Math.abs(cutTime - taskTime);\n if (usedTime < threshold * interval) {\n cutIndex = i;\n cutTime = taskTime;\n usedTime = 0;\n }\n usedTime += taskTimings.duration;\n }\n return cutIndex;\n }\n const rightIndex = findLowUtilizationRegion(entriesWithIdleRemoved.length - 1, 0);\n const leftIndex = findLowUtilizationRegion(0, rightIndex);\n const leftTimings = Helpers.Timing.eventTimingsMicroSeconds(entriesWithIdleRemoved[leftIndex]);\n const rightTimings = Helpers.Timing.eventTimingsMicroSeconds(entriesWithIdleRemoved[rightIndex]);\n\n let leftTime = leftTimings.startTime;\n let rightTime = rightTimings.endTime;\n const zoomedInSpan = rightTime - leftTime;\n\n if (zoomedInSpan < traceBounds.range * 0.1) {\n // If the area we have chosen to zoom into is less than 10% of the entire\n // span, we bail and show the entire trace. It would not be so useful to\n // the user to zoom in on such a small area; we assume they have\n // purposefully recorded a trace that contains empty periods of time.\n return traceBounds;\n }\n\n // Adjust the left time down by 5%, and the right time up by 5%, so that\n // we give the range we want to zoom a bit of breathing space. At the\n // same time, ensure that we do not stray beyond the bounds of the\n // min/max time of the entire trace.\n leftTime = Types.Timing.MicroSeconds(Math.max(leftTime - 0.05 * zoomedInSpan, traceBounds.min));\n rightTime = Types.Timing.MicroSeconds(Math.min(rightTime + 0.05 * zoomedInSpan, traceBounds.max));\n\n return {\n min: leftTime,\n max: rightTime,\n range: Types.Timing.MicroSeconds(rightTime - leftTime),\n };\n}\n"],
|
|
5
|
+
"mappings": "AAGA;AACA;AAEA,MAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA;AAGK,gCACH,aACA,mBAA2G;AAC7G,MAAI,CAAC,kBAAkB,QAAQ;AAC7B,WAAO;AAAA;AAET,QAAM,yBAAyB,kBAAkB,OAAO,WAAS;AAC/D,QAAI,MAAM,YAAY,cAAc,UAC/B,0BAAyB,IAAI,MAAM,UAAU,iBAAiB,CAAC,MAAM,UAAU,eAAe;AACjG,aAAO;AAAA;AAET,WAAO;AAAA;AAGT,MAAI,uBAAuB,WAAW,GAAG;AACvC,WAAO;AAAA;AAMT,oCAAkC,YAAoB,WAA2B;AAC/E,UAAM,YAAY;AAElB,QAAI,WAAW;AACf,UAAM,aAAa,uBAAuB;AAC1C,UAAM,UAAU,QAAQ,OAAO,yBAAyB;AACxD,QAAI,UAAW,SAAQ,YAAY,QAAQ,WAAW;AACtD,QAAI,WAAW;AACf,UAAM,OAAO,KAAK,KAAK,YAAY;AACnC,aAAS,IAAI,YAAY,MAAM,WAAW,KAAK,MAAM;AACnD,YAAM,OAAO,uBAAuB;AACpC,YAAM,cAAc,QAAQ,OAAO,yBAAyB;AAC5D,YAAM,WAAY,aAAY,YAAY,YAAY,WAAW;AACjE,YAAM,WAAW,KAAK,IAAI,UAAU;AACpC,UAAI,WAAW,YAAY,UAAU;AACnC,mBAAW;AACX,kBAAU;AACV,mBAAW;AAAA;AAEb,kBAAY,YAAY;AAAA;AAE1B,WAAO;AAAA;AAET,QAAM,aAAa,yBAAyB,uBAAuB,SAAS,GAAG;AAC/E,QAAM,YAAY,yBAAyB,GAAG;AAC9C,QAAM,cAAc,QAAQ,OAAO,yBAAyB,uBAAuB;AACnF,QAAM,eAAe,QAAQ,OAAO,yBAAyB,uBAAuB;AAEpF,MAAI,WAAW,YAAY;AAC3B,MAAI,YAAY,aAAa;AAC7B,QAAM,eAAe,YAAY;AAEjC,MAAI,eAAe,YAAY,QAAQ,KAAK;AAK1C,WAAO;AAAA;AAOT,aAAW,MAAM,OAAO,aAAa,KAAK,IAAI,WAAW,OAAO,cAAc,YAAY;AAC1F,cAAY,MAAM,OAAO,aAAa,KAAK,IAAI,YAAY,OAAO,cAAc,YAAY;AAE5F,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO,MAAM,OAAO,aAAa,YAAY;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as SDK from "../../../core/sdk/sdk.js";
|
|
2
|
+
export async function forNewRecording(recordStartTime) {
|
|
3
|
+
try {
|
|
4
|
+
let getConcurrencyOrTimeout = function() {
|
|
5
|
+
return Promise.race([
|
|
6
|
+
SDK.CPUThrottlingManager.CPUThrottlingManager.instance().getHardwareConcurrency(),
|
|
7
|
+
new Promise((resolve) => {
|
|
8
|
+
setTimeout(() => resolve(void 0), 1e3);
|
|
9
|
+
})
|
|
10
|
+
]);
|
|
11
|
+
};
|
|
12
|
+
const cpuThrottlingManager = SDK.CPUThrottlingManager.CPUThrottlingManager.instance();
|
|
13
|
+
const hardwareConcurrency = cpuThrottlingManager.hasPrimaryPageTargetSet() ? await getConcurrencyOrTimeout() : void 0;
|
|
14
|
+
const cpuThrottling = SDK.CPUThrottlingManager.CPUThrottlingManager.instance().cpuThrottlingRate();
|
|
15
|
+
const networkConditions = SDK.NetworkManager.MultitargetNetworkManager.instance().networkConditions();
|
|
16
|
+
const networkTitle = typeof networkConditions.title === "function" ? networkConditions.title() : networkConditions.title;
|
|
17
|
+
return {
|
|
18
|
+
source: "DevTools",
|
|
19
|
+
startTime: recordStartTime ? new Date(recordStartTime).toJSON() : void 0,
|
|
20
|
+
cpuThrottling,
|
|
21
|
+
networkThrottling: networkTitle,
|
|
22
|
+
hardwareConcurrency
|
|
23
|
+
};
|
|
24
|
+
} catch {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=Metadata.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../front_end/models/trace/extras/Metadata.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as SDK from '../../../core/sdk/sdk.js';\nimport type * as Types from '../types/types.js';\n\nexport async function forNewRecording(recordStartTime?: number): Promise<Types.File.MetaData> {\n try {\n const cpuThrottlingManager = SDK.CPUThrottlingManager.CPUThrottlingManager.instance();\n\n // If the CPU Throttling manager has yet to have its primary page target\n // set, it will block on the call to get the current hardware concurrency\n // until it does. At this point where the user has recorded a trace, that\n // target should have been set. So if it doesn't have it set, we instead\n // just bail and don't store the hardware concurrency (this is only\n // metadata, not mission critical information).\n // We also race this call against a 1s timeout, because sometimes this call\n // can hang (unsure exactly why) and we do not want to block parsing for\n // too long as a result.\n function getConcurrencyOrTimeout(): Promise<number|undefined> {\n return Promise.race([\n SDK.CPUThrottlingManager.CPUThrottlingManager.instance().getHardwareConcurrency(),\n new Promise<undefined>(resolve => {\n setTimeout(() => resolve(undefined), 1_000);\n }),\n ]);\n }\n\n const hardwareConcurrency =\n cpuThrottlingManager.hasPrimaryPageTargetSet() ? await getConcurrencyOrTimeout() : undefined;\n const cpuThrottling = SDK.CPUThrottlingManager.CPUThrottlingManager.instance().cpuThrottlingRate();\n const networkConditions = SDK.NetworkManager.MultitargetNetworkManager.instance().networkConditions();\n const networkTitle =\n typeof networkConditions.title === 'function' ? networkConditions.title() : networkConditions.title;\n\n return {\n source: 'DevTools',\n startTime: recordStartTime ? new Date(recordStartTime).toJSON() : undefined, // ISO-8601 timestamp\n cpuThrottling,\n networkThrottling: networkTitle,\n hardwareConcurrency,\n };\n } catch {\n // If anything went wrong, it does not really matter. The impact is that we\n // will not save the metadata when we save the trace to disk, but that is\n // not really important, so just return empty object and move on\n return {};\n }\n}\n"],
|
|
5
|
+
"mappings": "AAIA;AAGA,sCAAsC,iBAAwD;AAC5F,MAAI;AAYF,QAAS,0BAAT,WAA8D;AAC5D,aAAO,QAAQ,KAAK;AAAA,QAClB,IAAI,qBAAqB,qBAAqB,WAAW;AAAA,QACzD,IAAI,QAAmB,aAAW;AAChC,qBAAW,MAAM,QAAQ,SAAY;AAAA;AAAA;AAAA;AAf3C,UAAM,uBAAuB,IAAI,qBAAqB,qBAAqB;AAoB3E,UAAM,sBACF,qBAAqB,4BAA4B,MAAM,4BAA4B;AACvF,UAAM,gBAAgB,IAAI,qBAAqB,qBAAqB,WAAW;AAC/E,UAAM,oBAAoB,IAAI,eAAe,0BAA0B,WAAW;AAClF,UAAM,eACF,OAAO,kBAAkB,UAAU,aAAa,kBAAkB,UAAU,kBAAkB;AAElG,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,kBAAkB,IAAI,KAAK,iBAAiB,WAAW;AAAA,MAClE;AAAA,MACA,mBAAmB;AAAA,MACnB;AAAA;AAAA,UAEF;AAIA,WAAO;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"compilerOptions":{"composite":true,"outDir":".","baseUrl":".","rootDir":"../../../../../../../front_end/models/trace/extras"},"files":["../../../../../../../front_end/models/trace/extras/extras.ts"],"references":[{"path":"./extras-tsconfig.json"}]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"checkJs": true,
|
|
5
|
+
"composite": true,
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"inlineSources": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"esnext",
|
|
12
|
+
"dom",
|
|
13
|
+
"dom.iterable"
|
|
14
|
+
],
|
|
15
|
+
"module": "esnext",
|
|
16
|
+
"noEmitOnError": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"noImplicitOverride": true,
|
|
19
|
+
"noImplicitReturns": true,
|
|
20
|
+
"noUnusedLocals": false,
|
|
21
|
+
"outDir": ".",
|
|
22
|
+
"rootDir": "../../../../../../../front_end/models/trace/extras",
|
|
23
|
+
"skipLibCheck": true,
|
|
24
|
+
"sourceMap": true,
|
|
25
|
+
"strict": true,
|
|
26
|
+
"target": "esnext",
|
|
27
|
+
"tsBuildInfoFile": "devtools_entrypoint-bundle-typescript-tsconfig.json.tsbuildinfo",
|
|
28
|
+
"typeRoots": [],
|
|
29
|
+
"useUnknownInCatchVariables": false
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"../../../../../../../front_end/models/trace/extras/extras.ts",
|
|
33
|
+
"../../../../../../../front_end/legacy/legacy-defs.d.ts",
|
|
34
|
+
"../../../../../../../front_end/global_typings/global_defs.d.ts",
|
|
35
|
+
"../../../../../../../front_end/global_typings/request_idle_callback.d.ts",
|
|
36
|
+
"../../../../../../../node_modules/@types/filesystem/index.d.ts",
|
|
37
|
+
"../../../../../../../node_modules/@webgpu/types/dist/index.d.ts"
|
|
38
|
+
],
|
|
39
|
+
"references": [
|
|
40
|
+
{
|
|
41
|
+
"path": "./extras-tsconfig.json"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"allowJs": true,
|
|
4
|
+
"checkJs": true,
|
|
5
|
+
"composite": true,
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"forceConsistentCasingInFileNames": true,
|
|
9
|
+
"inlineSources": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"esnext",
|
|
12
|
+
"dom",
|
|
13
|
+
"dom.iterable"
|
|
14
|
+
],
|
|
15
|
+
"module": "esnext",
|
|
16
|
+
"noEmitOnError": true,
|
|
17
|
+
"noFallthroughCasesInSwitch": true,
|
|
18
|
+
"noImplicitOverride": true,
|
|
19
|
+
"noImplicitReturns": true,
|
|
20
|
+
"noUnusedLocals": false,
|
|
21
|
+
"outDir": ".",
|
|
22
|
+
"rootDir": "../../../../../../../front_end/models/trace/extras",
|
|
23
|
+
"skipLibCheck": true,
|
|
24
|
+
"sourceMap": true,
|
|
25
|
+
"strict": true,
|
|
26
|
+
"target": "esnext",
|
|
27
|
+
"tsBuildInfoFile": "extras-tsconfig.json.tsbuildinfo",
|
|
28
|
+
"typeRoots": [],
|
|
29
|
+
"useUnknownInCatchVariables": false
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"../../../../../../../front_end/models/trace/extras/FetchNodes.ts",
|
|
33
|
+
"../../../../../../../front_end/models/trace/extras/FilmStrip.ts",
|
|
34
|
+
"../../../../../../../front_end/models/trace/extras/MainThreadActivity.ts",
|
|
35
|
+
"../../../../../../../front_end/models/trace/extras/Metadata.ts",
|
|
36
|
+
"../../../../../../../front_end/legacy/legacy-defs.d.ts",
|
|
37
|
+
"../../../../../../../front_end/global_typings/global_defs.d.ts",
|
|
38
|
+
"../../../../../../../front_end/global_typings/request_idle_callback.d.ts",
|
|
39
|
+
"../../../../../../../node_modules/@types/filesystem/index.d.ts",
|
|
40
|
+
"../../../../../../../node_modules/@webgpu/types/dist/index.d.ts"
|
|
41
|
+
],
|
|
42
|
+
"references": [
|
|
43
|
+
{
|
|
44
|
+
"path": "../../../core/platform/bundle-tsconfig.json"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"path": "../../../core/sdk/bundle-tsconfig.json"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"path": "../../../generated/protocol-tsconfig.json"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"path": "../handlers/bundle-tsconfig.json"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"path": "../types/bundle-tsconfig.json"
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../front_end/models/trace/extras/extras.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright 2023 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nexport * as FetchNodes from './FetchNodes.js';\nexport * as FilmStrip from './FilmStrip.js';\nexport * as MainThreadActivity from './MainThreadActivity.js';\nexport * as Metadata from './Metadata.js';\n"],
|
|
5
|
+
"mappings": "AAIA;AACA;AACA;AACA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|