@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 23.1 kB
JavaScript
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 Bindings from"../../models/bindings/bindings.js";import*as TimelineModel from"../../models/timeline_model/timeline_model.js";import*as TraceEngine from"../../models/trace/trace.js";import*as PerfUI from"../../ui/legacy/components/perf_ui/perf_ui.js";import*as UI from"../../ui/legacy/legacy.js";import*as ThemeSupport from"../../ui/legacy/theme_support/theme_support.js";import{CompatibilityTracksAppender}from"./CompatibilityTracksAppender.js";import timelineFlamechartPopoverStyles from"./timelineFlamechartPopover.css.js";import{FlameChartStyle,Selection}from"./TimelineFlameChartView.js";import{TimelineSelection}from"./TimelineSelection.js";import{TimelineUIUtils}from"./TimelineUIUtils.js";const UIStrings={onIgnoreList:"On ignore list",mainS:"Main — {PH1}",main:"Main",frameS:"Frame — {PH1}",subframe:"Subframe",raster:"Raster",rasterizerThreadS:"Rasterizer Thread {PH1}",thread:"Thread",frames:"Frames",sSelfS:"{PH1} (self {PH2})",idleFrame:"Idle Frame",droppedFrame:"Dropped Frame",partiallyPresentedFrame:"Partially Presented Frame",frame:"Frame"},str_=i18n.i18n.registerUIStrings("panels/timeline/TimelineFlameChartDataProvider.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_),LONG_MAIN_THREAD_TASK_THRESHOLD=TraceEngine.Types.Timing.MilliSeconds(50);export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectWrapper{droppedFramePatternCanvas;partialFramePatternCanvas;timelineDataInternal;currentLevel;legacyPerformanceModel;compatibilityTracksAppender;legacyTimelineModel;traceEngineData;#e=0;minimumBoundaryInternal;timeSpan;headerLevel1;headerLevel2;staticHeader;framesHeader;screenshotsHeader;flowEventIndexById;entryData;entryTypeByLevel;screenshotImageCache;entryIndexToTitle;asyncColorByCategory;lastInitiatorEntry;entryParent;lastSelection;colorForEvent;#t=new WeakMap;#n=new WeakMap;#i;constructor(){super(),this.reset(),this.#i=`${PerfUI.Font.DEFAULT_FONT_SIZE} ${PerfUI.Font.getFontFamilyForCanvas()}`,this.droppedFramePatternCanvas=document.createElement("canvas"),this.partialFramePatternCanvas=document.createElement("canvas"),this.preparePatternCanvas(),this.timelineDataInternal=null,this.currentLevel=0,this.legacyPerformanceModel=null,this.legacyTimelineModel=null,this.compatibilityTracksAppender=null,this.traceEngineData=null,this.minimumBoundaryInternal=0,this.timeSpan=0,this.headerLevel1=this.buildGroupStyle({shareHeaderLine:!1}),this.headerLevel2=this.buildGroupStyle({padding:2,nestingLevel:1,collapsible:!1}),this.staticHeader=this.buildGroupStyle({collapsible:!1}),this.framesHeader=this.buildGroupStyle({useFirstLineForOverview:!0}),this.screenshotsHeader=this.buildGroupStyle({useFirstLineForOverview:!0,nestingLevel:1,collapsible:!1,itemsHeight:150}),ThemeSupport.ThemeSupport.instance().addEventListener(ThemeSupport.ThemeChangeEvent.eventName,(()=>{const e=[this.headerLevel1,this.headerLevel2,this.staticHeader,this.framesHeader,this.screenshotsHeader];for(const t of e)t.color=ThemeSupport.ThemeSupport.instance().getComputedValue("--color-text-primary"),t.backgroundColor=ThemeSupport.ThemeSupport.instance().getComputedValue("--color-background")})),this.flowEventIndexById=new Map}buildGroupStyle(e){const t={padding:4,height:17,collapsible:!0,color:ThemeSupport.ThemeSupport.instance().getComputedValue("--color-text-primary"),backgroundColor:ThemeSupport.ThemeSupport.instance().getComputedValue("--color-background"),nestingLevel:0,shareHeaderLine:!0};return Object.assign(t,e)}setModel(e,t){this.reset(),this.legacyPerformanceModel=e,this.legacyTimelineModel=e&&e.timelineModel(),this.traceEngineData=t,this.legacyTimelineModel?(this.minimumBoundaryInternal=this.legacyTimelineModel.minimumRecordTime(),this.timeSpan=this.legacyTimelineModel.isEmpty()?1e3:this.legacyTimelineModel.maximumRecordTime()-this.minimumBoundaryInternal):this.traceEngineData&&this.setTimingBoundsData(this.traceEngineData)}setTimingBoundsData(e){const{traceBounds:t}=e.Meta,n=TraceEngine.Helpers.Timing.microSecondsToMilliseconds(t.min),i=TraceEngine.Helpers.Timing.microSecondsToMilliseconds(t.max);this.minimumBoundaryInternal=n,this.timeSpan=n===i?1e3:i-this.minimumBoundaryInternal}compatibilityTracksAppenderInstance(e=!1){if(!this.compatibilityTracksAppender||e){if(!this.traceEngineData||!this.legacyTimelineModel)throw new Error("Attempted to instantiate a CompatibilityTracksAppender without having set the trace parse data first.");this.timelineDataInternal=this.#r(),this.compatibilityTracksAppender=new CompatibilityTracksAppender(this.timelineDataInternal,this.traceEngineData,this.entryData,this.entryTypeByLevel,this.legacyTimelineModel)}return this.compatibilityTracksAppender}#r(){return this.timelineDataInternal||(this.timelineDataInternal=PerfUI.FlameChart.FlameChartTimelineData.createEmpty()),this.timelineDataInternal}buildFromTrackAppenders(e){if(!this.compatibilityTracksAppender)return;const t=this.compatibilityTracksAppender.allVisibleTrackAppenders();for(const n of t){const t=e?.has(n.appenderName);this.currentLevel=n.appendTrackAtLevel(this.currentLevel,t)}}groupTrack(e){return e.track||null}groupTreeEvents(e){const t=this.compatibilityTracksAppender?.groupEventsForTreeView(e);return t||e.track?.eventsForTreeView()||null}mainFrameNavigationStartEvents(){return this.traceEngineData?this.traceEngineData.Meta.mainFrameNavigations:[]}entryTitle(e){const t=EntryType,n=this.entryType(e);if(n===t.Event){const t=this.entryData[e];return"T"===t.phase||"p"===t.phase?t.name+":"+t.args.step:this.#t.get(t)?i18nString(UIStrings.onIgnoreList):TimelineUIUtils.eventTitle(t)}if(n===t.Screenshot)return"";if(n===t.TrackAppender){const t=this.timelineDataInternal.entryLevels[e],n=this.entryData[e];return this.compatibilityTracksAppender?.titleForEvent(n,t)||null}let i=this.entryIndexToTitle[e];return i||(i=`Unexpected entryIndex ${e}`,console.error(i)),i}textColor(e){const t=this.entryData[e];return t&&this.#t.get(t)?"#888":FlameChartStyle.textColor}entryFont(e){return this.#i}reset(){this.currentLevel=0,this.timelineDataInternal=null,this.entryData=[],this.entryParent=[],this.entryTypeByLevel=[],this.entryIndexToTitle=[],this.asyncColorByCategory=new Map,this.screenshotImageCache=new Map,this.compatibilityTracksAppender=null,this.#t=new WeakMap,this.#n=new WeakMap}maxStackDepth(){return this.currentLevel}timelineData(){return this.timelineDataInternal&&0!==this.timelineDataInternal.entryLevels.length?this.timelineDataInternal:(this.timelineDataInternal=PerfUI.FlameChart.FlameChartTimelineData.createEmpty(),this.legacyTimelineModel?(this.flowEventIndexById.clear(),this.currentLevel=0,this.traceEngineData&&(this.compatibilityTracksAppender=this.compatibilityTracksAppenderInstance()),this.legacyTimelineModel.isGenericTrace()?this.processGenericTrace():this.processInspectorTrace(),this.timelineDataInternal):this.timelineDataInternal)}processGenericTrace(){const e=this.buildGroupStyle({shareHeaderLine:!1}),t=this.buildGroupStyle({padding:2,nestingLevel:1,shareHeaderLine:!1}),n=EntryType.Event,i=new Platform.MapUtilities.Multimap;if(this.legacyTimelineModel){for(const e of this.legacyTimelineModel.tracks())null!==e.thread?i.set(e.thread.process(),e):console.error("Failed to process track");for(const r of i.keysArray()){if(i.size>1){const t=`${r.name()} ${r.id()}`;this.appendHeader(t,e,!1)}for(const e of i.get(r)){const i=this.appendSyncEvents(e,e.events,e.name,t,n,!0);!this.timelineDataInternal||this.timelineDataInternal.selectedGroup&&e.name!==TimelineModel.TimelineModel.TimelineModelImpl.BrowserMainThreadName||(this.timelineDataInternal.selectedGroup=i)}}}}processInspectorTrace(){this.appendFrames();const e=e=>{if(void 0!==e.appenderName)switch(e.appenderName){case"Animations":return 0;case"Timings":return 1;case"Interactions":return 2;case"LayoutShifts":return 3;case"GPU":return 8;case"Thread":return 4;default:return-1}switch(e.type){case TimelineModel.TimelineModel.TrackType.MainThread:return e.forMainFrame?5:6;case TimelineModel.TimelineModel.TrackType.Worker:return 7;case TimelineModel.TimelineModel.TrackType.Raster:return 9;case TimelineModel.TimelineModel.TrackType.Other:return 10;default:return-1}};if(!this.legacyTimelineModel)return;const t=this.compatibilityTracksAppender?this.compatibilityTracksAppender.allVisibleTrackAppenders():[],n=[...this.legacyTimelineModel.tracks(),...t].slice();n.sort(((t,n)=>e(t)-e(n)));for(const e of n)"type"in e?this.appendLegacyTrackData(e):this.traceEngineData&&(this.currentLevel=e.appendTrackAtLevel(this.currentLevel));this.timelineDataInternal&&this.timelineDataInternal.selectedGroup&&(this.timelineDataInternal.selectedGroup.expanded=!0),this.flowEventIndexById.clear()}#a(e,t){if(!this.timelineDataInternal)return;const n=this.timelineDataInternal.entryDecorations[e]||[];n.push(t),this.timelineDataInternal.entryDecorations[e]=n}appendLegacyTrackData(e,t){this.#r();const n=EntryType.Event;switch(e.type){case TimelineModel.TimelineModel.TrackType.MainThread:if(e.forMainFrame){const i=this.appendSyncEvents(e,e.events,e.url?i18nString(UIStrings.mainS,{PH1:e.url}):i18nString(UIStrings.main),this.headerLevel1,n,!0,t);i&&this.timelineDataInternal&&(this.timelineDataInternal.selectedGroup=i)}else this.appendSyncEvents(e,e.events,e.url?i18nString(UIStrings.frameS,{PH1:e.url}):i18nString(UIStrings.subframe),this.headerLevel1,n,!0,t);break;case TimelineModel.TimelineModel.TrackType.Worker:this.appendSyncEvents(e,e.events,e.name,this.headerLevel1,n,!0,t);break;case TimelineModel.TimelineModel.TrackType.Raster:this.#e||this.appendHeader(i18nString(UIStrings.raster),this.headerLevel1,!1,t),++this.#e,this.appendSyncEvents(e,e.events,i18nString(UIStrings.rasterizerThreadS,{PH1:this.#e}),this.headerLevel2,n,!0,t);break;case TimelineModel.TimelineModel.TrackType.Other:this.appendSyncEvents(e,e.events,e.name||i18nString(UIStrings.thread),this.headerLevel1,n,!0,t),this.appendAsyncEventsGroup(e,e.name,e.asyncEvents,this.headerLevel1,n,!0,t)}}minimumBoundary(){return this.minimumBoundaryInternal}totalTime(){return this.timeSpan}isEntryRegularEvent(e){return"name"in e}search(e,t,n){const i=[];this.timelineData();for(let r=0;r<this.entryData.length;++r){const a=this.entryData[r];if(!this.isEntryRegularEvent(a))continue;let s;if(a instanceof TraceEngine.Legacy.Event)s=a;else{if(!this.compatibilityTracksAppender){console.error("compatibilityTracksAppender was unexpectedly not set.");continue}s=this.compatibilityTracksAppender.getLegacyEvent(a)}s&&(s.startTime>t||(s.endTime||s.startTime)<e||n.accept(s)&&i.push(r))}return i.sort(((e,t)=>{let n=this.entryData[e],i=this.entryData[t];return this.isEntryRegularEvent(n)&&this.isEntryRegularEvent(i)?(n=n instanceof TraceEngine.Legacy.Event?n:this.compatibilityTracksAppender?.getLegacyEvent(n)||null,i=i instanceof TraceEngine.Legacy.Event?i:this.compatibilityTracksAppender?.getLegacyEvent(i)||null,n&&i?TraceEngine.Legacy.Event.compareStartTime(n,i):0):0})),i}appendSyncEvents(e,t,n,i,r,a,s){if(!t.length)return null;if(!this.legacyPerformanceModel||!this.legacyTimelineModel)return null;const l=[],o=Root.Runtime.experiments.isEnabled("ignoreListJSFramesOnTimeline");let c=0,m=null;e&&e.type===TimelineModel.TimelineModel.TrackType.MainThread&&(m=this.appendHeader(n,i,a,s),m.track=e);for(let h=0;h<t.length;++h){const p=t[h],{duration:d}=TraceEngine.Legacy.timesForEventInMilliseconds(p);if(this.legacyPerformanceModel){const t=this.legacyPerformanceModel.timelineModel().isInteractiveTimeEvent(p),n=this.legacyPerformanceModel.timelineModel().isLayoutShiftEvent(p),i=t||n;if(e&&e.type===TimelineModel.TimelineModel.TrackType.MainThread&&i)continue}if(!TraceEngine.Types.TraceEvents.isFlowPhase(p.phase)){if(!p.endTime&&"I"!==p.phase)continue;if(TraceEngine.Types.TraceEvents.isAsyncPhase(p.phase))continue;if(!this.legacyPerformanceModel.isVisible(p))continue}for(;l.length&&l[l.length-1].endTime<=p.startTime;)l.pop();if(this.#t.set(p,!1),o&&this.isIgnoreListedEvent(p)){const e=l[l.length-1];if(e&&this.#t.get(e))continue;this.#t.set(p,!0)}!m&&n&&(m=this.appendHeader(n,i,a,s),a&&(m.track=e));const T=this.currentLevel+l.length,y=this.appendEvent(p,T);l.length&&(this.entryParent[y]=l[l.length-1]);Boolean(e?.forMainFrame&&e?.type===TimelineModel.TimelineModel.TrackType.MainThread)&&p.name===TimelineModel.TimelineModel.RecordType.Task&&d>LONG_MAIN_THREAD_TASK_THRESHOLD&&this.#a(y,{type:"CANDY",startAtTime:TraceEngine.Helpers.Timing.millisecondsToMicroseconds(LONG_MAIN_THREAD_TASK_THRESHOLD)}),r===EntryType.Event&&TimelineModel.TimelineModel.EventOnTimelineData.forEvent(p).warning&&this.#a(y,{type:"WARNING_TRIANGLE"}),c=Math.max(c,l.length+1),p.endTime&&l.push(p)}return this.entryTypeByLevel.length=this.currentLevel+c,this.entryTypeByLevel.fill(r,this.currentLevel),this.currentLevel+=c,m}isIgnoreListedEvent(e){if(!TimelineModel.TimelineModel.TimelineModelImpl.isJsFrameEvent(e))return!1;const t=e.args.data.url;return t&&this.isIgnoreListedURL(t)}isIgnoreListedURL(e){return Bindings.IgnoreListManager.IgnoreListManager.instance().isUserIgnoreListedURL(e)}appendAsyncEventsGroup(e,t,n,i,r,a,s){if(!n.length)return null;const l=[];let o=null;for(let r=0;r<n.length;++r){const c=n[r];if(!this.legacyPerformanceModel||!this.legacyPerformanceModel.isVisible(c))continue;!o&&t&&(o=this.appendHeader(t,i,a,s),a&&(o.track=e));const m=c.startTime;let h;for(h=0;h<l.length&&l[h]>m;++h);this.appendAsyncEvent(c,this.currentLevel+h),l[h]=c.endTime}return this.entryTypeByLevel.length=this.currentLevel+l.length,this.entryTypeByLevel.fill(r,this.currentLevel),this.currentLevel+=l.length,o}getEntryTypeForLevel(e){return this.entryTypeByLevel[e]}appendFrames(){if(!(this.legacyPerformanceModel&&this.timelineDataInternal&&this.legacyTimelineModel&&this.traceEngineData))return;const e=TraceEngine.Extras.FilmStrip.fromTraceData(this.traceEngineData),t=e.frames.length>0;this.framesHeader.collapsible=t;const n="frames"===Root.Runtime.Runtime.queryParam("flamechart-force-expand");this.appendHeader(i18nString(UIStrings.frames),this.framesHeader,!1,n),this.entryTypeByLevel[this.currentLevel]=EntryType.Frame;for(const e of this.legacyPerformanceModel.frames())this.appendFrame(e);++this.currentLevel,t&&this.#s(e)}#s(e){if(!this.timelineDataInternal||!this.legacyTimelineModel)return;let t;this.appendHeader("",this.screenshotsHeader,!1),this.entryTypeByLevel[this.currentLevel]=EntryType.Screenshot;for(const n of e.frames){const e=TraceEngine.Helpers.Timing.microSecondsToMilliseconds(n.screenshotEvent.ts);this.entryData.push(n.screenshotEvent),this.timelineDataInternal.entryLevels.push(this.currentLevel),this.timelineDataInternal.entryStartTimes.push(e),t&&this.timelineDataInternal.entryTotalTimes.push(e-t),t=e}e.frames.length&&void 0!==t&&this.timelineDataInternal.entryTotalTimes.push(this.legacyTimelineModel.maximumRecordTime()-t),++this.currentLevel}entryType(e){return this.entryTypeByLevel[this.timelineDataInternal.entryLevels[e]]}prepareHighlightedEntryInfo(e){let t,n,i="",r="timeline-info-time";const a=this.entryType(e);if(a===EntryType.TrackAppender){if(!this.compatibilityTracksAppender)return null;const n=this.entryData[e],r=this.timelineDataInternal.entryLevels[e],a=this.compatibilityTracksAppender.highlightedEntryInfo(n,r);t=a.title,i=a.formattedTime}else if(a===EntryType.Event){const r=this.entryData[e],a=r.duration,s=r.selfTime,l=1e-6;if("number"==typeof a&&(i=Math.abs(a-s)>l&&s>l?i18nString(UIStrings.sSelfS,{PH1:i18n.TimeUtilities.millisToString(a,!0),PH2:i18n.TimeUtilities.millisToString(s,!0)}):i18n.TimeUtilities.millisToString(a,!0)),t=this.entryTitle(e),n=TimelineUIUtils.buildEventWarningElement(r),this.legacyTimelineModel&&this.legacyTimelineModel.isParseHTMLEvent(r)){const e=r.args.beginData.startLine,n=r.args.endData&&r.args.endData.endLine;t+=` - ${Bindings.ResourceUtils.displayNameForURL(r.args.beginData.url)} [${-1!==n||n===e?`${e}...${n}`:e}]`}}else{if(a!==EntryType.Frame)return null;{const n=this.entryData[e];i=i18n.TimeUtilities.preciseMillisToString(n.duration,1),n.idle?t=i18nString(UIStrings.idleFrame):n.dropped?(t=n.isPartial?i18nString(UIStrings.partiallyPresentedFrame):i18nString(UIStrings.droppedFrame),r="timeline-info-warning"):t=i18nString(UIStrings.frame)}}const s=document.createElement("div"),l=UI.Utils.createShadowRootWithCoreStyles(s,{cssFile:[timelineFlamechartPopoverStyles],delegatesFocus:void 0}).createChild("div","timeline-flamechart-popover");return l.createChild("span",r).textContent=i,l.createChild("span","timeline-info-title").textContent=t,n&&(n.classList.add("timeline-info-warning"),l.appendChild(n)),s}entryColor(e){if(!this.legacyPerformanceModel||!this.legacyTimelineModel)return"";const t=EntryType,n=this.entryType(e);if(n===t.Event){const t=this.entryData[e];if(this.legacyTimelineModel.isGenericTrace())return this.genericTraceEventColor(t);if(this.legacyPerformanceModel.timelineModel().isMarkerEvent(t))return TimelineUIUtils.markerStyleForEvent(t).color;if(!TraceEngine.Types.TraceEvents.isAsyncPhase(t.phase)&&this.colorForEvent)return this.colorForEvent(t);const n=TimelineUIUtils.eventStyle(t).category;return function(e,t,n){let i=e.get(t);if(i)return i;const r=Common.Color.parse(n(t));if(!r)throw new Error("Could not parse color from entry");return i=r.setAlpha(.7).asString("rgba")||"",e.set(t,i),i}(this.asyncColorByCategory,n,(()=>n.color))}if(n===t.Frame)return"white";if(n===t.TrackAppender){const t=this.timelineDataInternal.entryLevels[e],n=this.entryData[e];return this.compatibilityTracksAppender?.colorForEvent(n,t)||""}return""}genericTraceEventColor(e){const t=e.categoriesString||e.name;return t?`hsl(${Platform.StringUtilities.hashCode(t)%300+30}, 40%, 70%)`:"#ccc"}preparePatternCanvas(){const e=17;this.droppedFramePatternCanvas.width=e,this.droppedFramePatternCanvas.height=e,this.partialFramePatternCanvas.width=e,this.partialFramePatternCanvas.height=e;const t=this.droppedFramePatternCanvas.getContext("2d");if(t){t.translate(8.5,8.5),t.rotate(.25*Math.PI),t.translate(-8.5,-8.5),t.fillStyle="rgb(255, 255, 255)";for(let e=-17;e<34;e+=3)t.fillRect(e,-17,1,51)}const n=this.partialFramePatternCanvas.getContext("2d");n&&(n.strokeStyle="rgb(255, 255, 255)",n.lineWidth=2,n.beginPath(),n.moveTo(17,0),n.lineTo(10,7),n.moveTo(8,9),n.lineTo(2,15),n.stroke())}drawFrame(e,t,n,i,r,a,s){const l=this.entryData[e];if(i+=1,a-=2,l.idle)t.fillStyle="white";else if(l.dropped)if(l.isPartial){t.fillStyle="#f0e442",t.fillRect(i,r,a,s);const e=t.createPattern(this.partialFramePatternCanvas,"repeat");t.fillStyle=e||t.fillStyle}else{t.fillStyle="#f08080",t.fillRect(i,r,a,s);const e=t.createPattern(this.droppedFramePatternCanvas,"repeat");t.fillStyle=e||t.fillStyle}else t.fillStyle="#d7f0d1";t.fillRect(i,r,a,s);const o=i18n.TimeUtilities.preciseMillisToString(l.duration,1),c=t.measureText(o).width;c<=a&&(t.fillStyle=this.textColor(e),t.fillText(o,i+(a-c)/2,r+s-4))}async drawScreenshot(e,t,n,i,r,a){const s=this.entryData[e];if(!this.screenshotImageCache.has(s)){this.screenshotImageCache.set(s,null);const e=s.args.snapshot,t=await UI.UIUtils.loadImageFromData(e);return this.screenshotImageCache.set(s,t),void this.dispatchEventToListeners(Events.DataChanged)}const l=this.screenshotImageCache.get(s);if(!l)return;const o=n+1,c=i+1,m=a-2,h=m/l.naturalHeight,p=Math.floor(l.naturalWidth*h);t.save(),t.beginPath(),t.rect(n,i,r,a),t.clip(),t.drawImage(l,o,c,p,m),t.strokeStyle="#ccc",t.strokeRect(o-.5,c-.5,Math.min(r-1,p+1),m),t.restore()}decorateEntry(e,t,n,i,r,a,s,l,o){const c=this.entryType(e);return c===EntryType.Frame?(this.drawFrame(e,t,n,i,r,a,s),!0):c===EntryType.Screenshot&&(this.drawScreenshot(e,t,i,r,a,s),!0)}forceDecoration(e){const t=EntryType,n=this.entryType(e);if(n===t.Frame)return!0;if(n===t.Screenshot)return!0;if(n===t.Event){const t=this.entryData[e];return Boolean(TimelineModel.TimelineModel.EventOnTimelineData.forEvent(t).warning)}return!1}appendHeader(e,t,n,i){const r={startLevel:this.currentLevel,name:e,style:t,selectable:n,expanded:i};return this.timelineDataInternal.groups.push(r),r}appendEvent(e,t){const n=this.entryData.length;this.entryData.push(e);const i=this.timelineDataInternal;return i.entryLevels[n]=t,i.entryTotalTimes[n]=e.duration||InstantEventVisibleDurationMs,i.entryStartTimes[n]=e.startTime,this.#n.set(e,n),n}appendAsyncEvent(e,t){const n=e.steps,i=n.length>1&&"p"===n[1].phase?1:0;for(let e=0;e<n.length-1;++e){const r=this.entryData.length;this.entryData.push(n[e+i]);const a=n[e].startTime,s=this.timelineDataInternal;s.entryLevels[r]=t,s.entryTotalTimes[r]=n[e+1].startTime-a,s.entryStartTimes[r]=a}}appendFrame(e){const t=this.entryData.length;this.entryData.push(e),this.entryIndexToTitle[t]=i18n.TimeUtilities.millisToString(e.duration,!0),this.timelineDataInternal&&(this.timelineDataInternal.entryLevels[t]=this.currentLevel,this.timelineDataInternal.entryTotalTimes[t]=e.duration,this.timelineDataInternal.entryStartTimes[t]=e.startTime)}createSelection(e){const t=this.entryType(e);let n=null;const i=this.entryData[e];return i&&this.isEntryRegularEvent(i)?n=TimelineSelection.fromTraceEvent(i):t===EntryType.Frame&&(n=TimelineSelection.fromFrame(this.entryData[e])),n&&(this.lastSelection=new Selection(n,e)),n}formatValue(e,t){return i18n.TimeUtilities.preciseMillisToString(e,t)}canJumpToEntry(e){return!1}entryIndexForSelection(e){if(!e||TimelineSelection.isRangeSelection(e.object)||TimelineSelection.isSyntheticNetworkRequestDetailsEventSelection(e.object))return-1;if(this.lastSelection&&this.lastSelection.timelineSelection.object===e.object)return this.lastSelection.entryIndex;const t=this.entryData.indexOf(e.object);return-1!==t&&(this.lastSelection=new Selection(e,t)),t}buildFlowForInitiator(e){if(this.lastInitiatorEntry===e)return!1;this.lastInitiatorEntry=e;let t=this.eventByIndex(e);if(TraceEngine.Legacy.eventIsFromNewEngine(t))return!1;const n=this.timelineDataInternal;if(!n)return!1;for(n.flowStartTimes=[],n.flowStartLevels=[],n.flowEndTimes=[],n.flowEndLevels=[];t;){let e;for(;t&&(e=TimelineModel.TimelineModel.EventOnTimelineData.forEvent(t).initiator(),!e);t=this.eventParent(t));if(!e||!t)break;const i=this.#n.get(t),r=this.#n.get(e);n.flowStartTimes.push(e.endTime||e.startTime),n.flowStartLevels.push(n.entryLevels[r]),n.flowEndTimes.push(t.startTime),n.flowEndLevels.push(n.entryLevels[i]),t=e}return!0}eventParent(e){const t=this.#n.get(e);return void 0===t?null:this.entryParent[t]||null}eventByIndex(e){if(e<0)return null;const t=this.entryType(e);return t===EntryType.TrackAppender||t===EntryType.Event?this.entryData[e]:null}setEventColorMapping(e){this.colorForEvent=e}get performanceModel(){return this.legacyPerformanceModel}}export const InstantEventVisibleDurationMs=.001;export var Events;!function(e){e.DataChanged="DataChanged"}(Events||(Events={}));export var EntryType;!function(e){e.Frame="Frame",e.Event="Event",e.TrackAppender="TrackAppender",e.Screenshot="Screenshot"}(EntryType||(EntryType={}));