UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 6.8 kB
import*as Common from"../../core/common/common.js";import*as i18n from"../../core/i18n/i18n.js";import*as Platform from"../../core/platform/platform.js";import*as Root from"../../core/root/root.js";import*as SDK from"../../core/sdk/sdk.js";import*as TimelineModel from"../../models/timeline_model/timeline_model.js";import*as TraceEngine from"../../models/trace/trace.js";import{PerformanceModel}from"./PerformanceModel.js";const UIStrings={cpuProfileForATargetIsNot:"CPU profile for a target is not available.",tracingNotSupported:"Performance trace recording not supported for this type of target"},str_=i18n.i18n.registerUIStrings("panels/timeline/TimelineController.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export class TimelineController{primaryPageTarget;tracingManager;performanceModel;client;tracingModel;tracingCompleteCallback;profiling;cpuProfiles;constructor(e,t){this.primaryPageTarget=e,this.tracingManager=e.model(TraceEngine.TracingManager.TracingManager),this.performanceModel=new PerformanceModel,this.performanceModel.setMainTarget(e),this.client=t,this.tracingModel=new TraceEngine.Legacy.TracingModel,SDK.TargetManager.TargetManager.instance().observeModels(SDK.CPUProfilerModel.CPUProfilerModel,this)}async dispose(){this.tracingManager&&await this.tracingManager.reset(),SDK.TargetManager.TargetManager.instance().unobserveModels(SDK.CPUProfilerModel.CPUProfilerModel,this)}async startRecording(e){function t(e){return"disabled-by-default-"+e}const i=[Root.Runtime.experiments.isEnabled("timelineShowAllEvents")?"*":"-*",TimelineModel.TimelineModel.TimelineModelImpl.Category.Console,TimelineModel.TimelineModel.TimelineModelImpl.Category.UserTiming,"devtools.timeline",t("devtools.timeline"),t("devtools.timeline.frame"),t("devtools.timeline.stack"),t("v8.compile"),t("v8.cpu_profiler.hires"),TimelineModel.TimelineModel.TimelineModelImpl.Category.Loading,t("lighthouse"),"v8.execute","v8"];Root.Runtime.experiments.isEnabled("timelineV8RuntimeCallStats")&&e.enableJSSampling&&i.push(t("v8.runtime_stats_sampling")),e.enableJSSampling&&i.push(t("v8.cpu_profiler")),Root.Runtime.experiments.isEnabled("timelineInvalidationTracking")&&i.push(t("devtools.timeline.invalidationTracking")),e.capturePictures&&i.push(t("devtools.timeline.layers"),t("devtools.timeline.picture"),t("blink.graphics_context_annotations")),e.captureFilmStrip&&i.push(t("devtools.screenshot")),this.performanceModel.setRecordStartTime(Date.now());const r=await this.startRecordingWithCategories(i.join(","));return r.getError()&&(await this.waitForTracingToStop(!1),await SDK.TargetManager.TargetManager.instance().resumeAllTargets()),r}async stopRecording(){return this.tracingManager&&this.tracingManager.stop(),this.client.loadingStarted(),await this.waitForTracingToStop(!0),await this.allSourcesFinished(),this.performanceModel}getPerformanceModel(){return this.performanceModel}async waitForTracingToStop(e){const t=[];this.tracingManager&&e&&t.push(new Promise((e=>{this.tracingCompleteCallback=e}))),t.push(this.stopProfilingOnAllModels()),await Promise.all(t)}modelAdded(e){this.profiling&&e.startRecording()}modelRemoved(e){}addCpuProfile(e,t){t?(this.cpuProfiles||(this.cpuProfiles=new Map),this.cpuProfiles.set(e,t)):Common.Console.Console.instance().warn(i18nString(UIStrings.cpuProfileForATargetIsNot))}async stopProfilingOnAllModels(){const e=this.profiling?SDK.TargetManager.TargetManager.instance().models(SDK.CPUProfilerModel.CPUProfilerModel):[];this.profiling=!1;const t=[];for(const i of e){const e=i.target().id(),r=i.stopRecording().then(this.addCpuProfile.bind(this,e));t.push(r)}await Promise.all(t)}async startRecordingWithCategories(e){if(!this.tracingManager)throw new Error(UIStrings.tracingNotSupported);return await SDK.TargetManager.TargetManager.instance().suspendAllTargets("performance-timeline"),this.tracingManager.start(this,e,"")}traceEventsCollected(e){this.tracingModel.addEvents(e)}tracingComplete(){this.tracingCompleteCallback&&(this.tracingCompleteCallback(void 0),this.tracingCompleteCallback=null)}async allSourcesFinished(){this.client.processingStarted(),await this.finalizeTrace()}async finalizeTrace(){this.injectCpuProfileEvents(),await SDK.TargetManager.TargetManager.instance().resumeAllTargets(),this.tracingModel.tracingComplete(),await this.client.loadingComplete(this.tracingModel,null,!1),this.client.loadingCompleteForTest()}injectCpuProfileEvent(e,t,i){if(!i)return;const r={cat:TraceEngine.Legacy.DevToolsMetadataEventCategory,ph:"I",ts:1e3*this.tracingModel.maximumRecordTime(),pid:e,tid:t,name:TimelineModel.TimelineModel.RecordType.CpuProfile,args:{data:{cpuProfile:i}}};this.tracingModel.addEvents([r])}buildTargetToProcessIdMap(){const e=TimelineModel.TimelineModel.TimelineModelImpl.DevToolsMetadataEvent,t=this.tracingModel.devToolsMetadataEvents(),i=t.find((t=>t.name===e.TracingStartedInBrowser));if(!i)return null;const r=new Platform.MapUtilities.Multimap,a=new Map,o=i.args.data.frames;for(const e of o)a.set(e.frame,e.processId);for(const i of t){const t=i.args.data;switch(i.name){case e.FrameCommittedInBrowser:t.processId?a.set(t.frame,t.processId):r.set(t.processPseudoId,t.frame);break;case e.ProcessReadyInBrowser:for(const e of r.get(t.processPseudoId)||[])a.set(e,t.processId)}}const n=o.find((e=>!e.parent)).processId,s=this.tracingModel.getProcessById(n);if(s){const e=SDK.TargetManager.TargetManager.instance().primaryPageTarget();e&&a.set(e.id(),s.id())}return a}injectCpuProfileEvents(){if(!this.cpuProfiles)return;const e=TimelineModel.TimelineModel.TimelineModelImpl.DevToolsMetadataEvent,t=this.tracingModel.devToolsMetadataEvents(),i=this.buildTargetToProcessIdMap();if(i)for(const[e,t]of this.cpuProfiles){const r=i.get(e);if(!r)continue;const a=this.tracingModel.getProcessById(r),o=a&&a.threadByName(TimelineModel.TimelineModel.TimelineModelImpl.RendererMainThreadName);o&&this.injectCpuProfileEvent(r,o.id(),t)}else{const i=t.filter((t=>t.name===e.TracingStartedInPage)),r=i[i.length-1];if(r){const e=r.thread.process().id();if(this.tracingManager){const t=this.cpuProfiles.get(this.tracingManager.target().id());this.injectCpuProfileEvent(e,r.thread.id(),t)}}else{let e=0;for(const t of this.cpuProfiles){const i=SDK.TargetManager.TargetManager.instance().targetById(t[0]),r=i&&i.name();this.tracingModel.addEvents(TimelineModel.TimelineJSProfile.TimelineJSProfileProcessor.createFakeTraceFromCpuProfile(t[1],++e,1===e,r))}}}const r=t.filter((t=>t.name===e.TracingSessionIdForWorker));for(const e of r){const t=e.args.data.workerId,i=this.cpuProfiles.get(t);this.injectCpuProfileEvent(e.thread.process().id(),e.args.data.workerThreadId,i)}this.cpuProfiles=null}tracingBufferUsage(e){this.client.recordingProgress(e)}eventsRetrievalProgress(e){this.client.loadingProgress(e)}}