• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { SpSystemTrace } from './SpSystemTrace';
17import { ThreadStruct, ThreadStructOnClick } from '../database/ui-worker/ProcedureWorkerThread';
18import { TraceRow } from './trace/base/TraceRow';
19import { JankStruct, JankStructOnClick } from '../database/ui-worker/ProcedureWorkerJank';
20import { HeapSnapshotStruct, HeapSnapshotStructOnClick } from '../database/ui-worker/ProcedureWorkerHeapSnapshot';
21import { FuncStruct, funcStructOnClick } from '../database/ui-worker/ProcedureWorkerFunc';
22import { CpuFreqStruct, CpuFreqStructOnClick } from '../database/ui-worker/ProcedureWorkerFreq';
23import { ClockStruct, ClockStructOnClick } from '../database/ui-worker/ProcedureWorkerClock';
24import { DmaFenceStruct, DmaFenceStructOnClick } from '../database/ui-worker/ProcedureWorkerDmaFence';
25import { SnapshotStruct, SnapshotStructOnClick } from '../database/ui-worker/ProcedureWorkerSnapshot';
26import { IrqStruct, IrqStructOnClick } from '../database/ui-worker/ProcedureWorkerIrq';
27import { HeapStruct, HeapStructOnClick } from '../database/ui-worker/ProcedureWorkerHeap';
28import { JsCpuProfilerStruct, JsCpuProfilerStructOnClick } from '../database/ui-worker/ProcedureWorkerCpuProfiler';
29import { AppStartupStruct, AppStartupStructOnClick } from '../database/ui-worker/ProcedureWorkerAppStartup';
30import { AllAppStartupStruct, allAppStartupStructOnClick } from '../database/ui-worker/ProcedureWorkerAllAppStartup';
31import { SoStruct, SoStructOnClick } from '../database/ui-worker/ProcedureWorkerSoInit';
32import { FrameAnimationStruct, FrameAnimationStructOnClick } from '../database/ui-worker/ProcedureWorkerFrameAnimation';
33import { FrameDynamicStruct, FrameDynamicStructOnClick } from '../database/ui-worker/ProcedureWorkerFrameDynamic';
34import { FrameSpacingStruct, FrameSpacingStructOnClick } from '../database/ui-worker/ProcedureWorkerFrameSpacing';
35import { SampleStruct, sampleStructOnClick } from '../database/ui-worker/ProcedureWorkerBpftrace';
36import { SportRuler } from './trace/timer-shaft/SportRuler';
37import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil';
38import { LitSearch } from './trace/search/Search';
39import { TabPaneCurrent } from './trace/sheet/TabPaneCurrent';
40import type { SpKeyboard } from './SpKeyboard';
41import { enableVSync } from './chart/VSync';
42import { CpuStruct, CpuStructOnClick } from '../database/ui-worker/cpu/ProcedureWorkerCPU';
43import { ProcessMemStruct } from '../database/ui-worker/ProcedureWorkerMem';
44import { CpuStateStruct, CpuStateStructOnClick } from '../database/ui-worker/cpu/ProcedureWorkerCpuState';
45import {
46  CpuFreqLimitsStruct,
47  CpuFreqLimitsStructOnClick
48} from '../database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits';
49import { FlagsConfig } from './SpFlags';
50import { LitMainMenu } from '../../base-ui/menu/LitMainMenu';
51import { PerfToolsStructOnClick, PerfToolStruct } from '../database/ui-worker/ProcedureWorkerPerfTool';
52import { Utils } from './trace/base/Utils';
53import { BaseStruct } from '../bean/BaseStruct';
54import { GpuCounterStruct, gpuCounterStructOnClick } from '../database/ui-worker/ProcedureWorkerGpuCounter';
55import { HangStructOnClick } from '../database/ui-worker/ProcedureWorkerHang';
56import { XpowerStruct, XpowerStructOnClick } from '../database/ui-worker/ProcedureWorkerXpower';
57import { XpowerStatisticStruct, XpowerStatisticStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerStatistic';
58import { SpAiAnalysisPage } from './SpAiAnalysisPage';
59import { XpowerAppDetailStruct, XpowerAppDetailStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerAppDetail';
60import { XpowerWifiBytesStructOnClick, XpowerWifiPacketsStructOnClick, XpowerWifiStruct } from '../database/ui-worker/ProcedureWorkerXpowerWifi';
61import { XpowerThreadInfoStruct, XpowerThreadInfoStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerThreadInfo';
62import { XpowerGpuFreqStruct, XpowerGpuFreqStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerGpuFreq';
63import { XpowerThreadCountStruct, XpowerThreadCountStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerThreadCount';
64import { XpowerGpuFreqCountStruct, XpowerGpuFreqCountStructOnClick } from '../database/ui-worker/ProcedureWorkerXpowerGpuFreqCount';
65import { SnapShotOnClick, SnapShotStruct } from '../database/ui-worker/ProcedureWorkerSnaps';
66import { ThreadSysCallStruct, ThreadSysCallStructOnClick } from '../database/ui-worker/ProcedureWorkerThreadSysCall';
67
68function timeoutJudge(sp: SpSystemTrace): number {
69  let timeoutJudge = window.setTimeout((): void => {
70    if (SpSystemTrace.wakeupList.length && CpuStruct.selectCpuStruct) {
71      let checkHandlerKey: boolean = true;
72      let saveSelectCpuStruct: unknown = JSON.parse(sessionStorage.getItem('saveselectcpustruct')!);
73      for (const item of SpSystemTrace.wakeupList) {
74        if (item.ts === CpuStruct.selectCpuStruct.startTime && item.dur === CpuStruct.selectCpuStruct.dur) {
75          checkHandlerKey = false;
76          if (SpSystemTrace.wakeupList[0].schedulingDesc) {
77            //@ts-ignore
78            SpSystemTrace.wakeupList.unshift(saveSelectCpuStruct);
79          }
80          sp.refreshCanvas(true);
81          break;
82        } else if (
83          //@ts-ignore
84          saveSelectCpuStruct.startTime === CpuStruct.selectCpuStruct.startTime &&
85          //@ts-ignore
86          saveSelectCpuStruct.dur === CpuStruct.selectCpuStruct.dur
87        ) {
88          // 如果点击的是第一层,保持唤醒树不变
89          checkHandlerKey = false;
90          sp.refreshCanvas(true);
91          break;
92        }
93      }
94      // 点击线程在唤醒树内
95      if (!checkHandlerKey) {
96        // 查询获取tab表格数据
97        window.publish(window.SmartEvent.UI.WakeupList, SpSystemTrace.wakeupList);
98      } else {
99        // 不在唤醒树内,清空数组
100        sp.wakeupListNull();
101        sp.refreshCanvas(true);
102      }
103    } else {
104      sp.wakeupListNull();
105      sp.refreshCanvas(true);
106    }
107    clearTimeout(timeoutJudge);
108  }, 10);
109  return timeoutJudge;
110}
111
112function threadClickHandlerFunc(sp: SpSystemTrace): (e: ThreadStruct) => void {
113  let threadClickHandler = (d: ThreadStruct): void => {
114    sp.observerScrollHeightEnable = false;
115    sp.scrollToProcess(`${d.cpu}`, '', 'cpu-data', true);
116    let cpuRow = sp.queryAllTraceRow<TraceRow<CpuStruct>>(
117      `trace-row[row-id='${Utils.getDistributedRowId(d.cpu)}'][row-type='cpu-data']`,
118      (row) => row.rowId === `${Utils.getDistributedRowId(d.cpu)}` && row.rowType === 'cpu-data'
119    )[0];
120    if (cpuRow) {
121      sp.currentRow = cpuRow;
122      cpuRow.fixedList = [
123        {
124          startTime: d.startTime,
125          dur: d.dur,
126          tid: d.tid,
127          id: d.id,
128          processId: d.pid,
129          cpu: d.cpu,
130          argSetID: d.argSetID,
131        },
132      ];
133      let findEntry = cpuRow!.fixedList[0];
134      sp.rechargeCpuData(
135        // @ts-ignore
136        findEntry, // @ts-ignore
137        cpuRow.dataListCache.find((it) => it.startTime > findEntry.startTime)
138      );
139      if (
140        // @ts-ignore
141        findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || // @ts-ignore
142        findEntry!.startTime! > TraceRow.range!.endNS
143      ) {
144        sp.timerShaftEL?.setRangeNS(
145          // @ts-ignore
146          findEntry!.startTime! - findEntry!.dur! * 2, // @ts-ignore
147          findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2
148        );
149      }
150      sp.hoverStructNull().selectStructNull().wakeupListNull(); // @ts-ignore
151      CpuStruct.hoverCpuStruct = findEntry; // @ts-ignore
152      CpuStruct.selectCpuStruct = findEntry; // @ts-ignore
153      sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted');
154      sp.traceSheetEL?.displayCpuData(
155        CpuStruct.selectCpuStruct!,
156        (wakeUpBean) => {
157          sp.removeLinkLinesByBusinessType('thread');
158          CpuStruct.wakeupBean = wakeUpBean;
159          sp.refreshCanvas(true);
160        },
161        cpuClickHandlerFunc(sp)
162      );
163    }
164  };
165  return threadClickHandler;
166}
167
168//点击prio箭头刷新canvas
169function prioClickHandlerFunc(sp: SpSystemTrace): (d: unknown) => void {
170  return function (d: unknown): void {
171    // @ts-ignore
172    ThreadStruct.prioCount = d;
173    ThreadStruct.isClickPrio = true;
174    sp.refreshCanvas(true);
175  };
176}
177
178function scrollToFuncHandlerFunc(sp: SpSystemTrace): Function {
179  let funClickHandle = (funcStruct: unknown): void => {
180    // @ts-ignore
181    if (funcStruct.chainId) {
182    }
183    sp.observerScrollHeightEnable = true;
184    // @ts-ignore
185    sp.moveRangeToCenter(funcStruct.startTs!, funcStruct.dur!);
186    sp.scrollToActFunc(funcStruct, false);
187  };
188  return funClickHandle;
189}
190
191function scrollToFunc(sp: SpSystemTrace): Function {
192  let funClickHandle = (funcStruct: unknown): void => {
193    // @ts-ignore
194    if (funcStruct.chainId) {
195    }
196    sp.observerScrollHeightEnable = true;
197    // @ts-ignore
198    sp.scrollToActFunc(funcStruct, false);
199  };
200  return funClickHandle;
201}
202
203function jankClickHandlerFunc(sp: SpSystemTrace): Function {
204  let jankClickHandler = (d: unknown): void => {
205    sp.observerScrollHeightEnable = true;
206    let jankRowParent: unknown;
207    //@ts-ignore
208    if (d.rowId === 'actual frameTime') {
209      jankRowParent = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>("trace-row[row-id='frameTime']");
210    } else {
211      jankRowParent = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>(
212        //@ts-ignore
213        `trace-row[row-type='process'][row-id='${d.pid}']`
214      );
215    }
216    //@ts-ignore
217    jankRowParent!.expansion = true;
218    let jankRow: unknown;
219    //@ts-ignore
220    jankRowParent.childrenList.forEach((item: TraceRow<JankStruct>) => {
221      //@ts-ignore
222      if (`${item.rowId}` === `${d.rowId}` && `${item.rowType}` === 'janks') {
223        jankRow = item;
224      }
225    });
226    //@ts-ignore
227    sp.currentRow = jankRow;
228    if (jankRow) {
229      JankStruct.selectJankStructList.length = 0;
230      //@ts-ignore
231      let findJankEntry = jankRow!.dataListCache!.find(
232        //@ts-ignore
233        (dat: unknown) => `${dat.name}` === `${d.name}` && `${dat.pid}` === `${d.pid}`
234      );
235      if (findJankEntry) {
236        if (
237          findJankEntry!.ts! + findJankEntry!.dur! < TraceRow.range!.startNS ||
238          findJankEntry!.ts! > TraceRow.range!.endNS
239        ) {
240          sp.timerShaftEL?.setRangeNS(
241            findJankEntry!.ts! - findJankEntry!.dur! * 2,
242            findJankEntry!.ts! + findJankEntry!.dur! + findJankEntry!.dur! * 2
243          );
244        }
245        sp.hoverStructNull().selectStructNull().wakeupListNull();
246        JankStruct.hoverJankStruct = findJankEntry;
247        JankStruct.selectJankStruct = findJankEntry;
248        sp.timerShaftEL?.drawTriangle(findJankEntry!.ts || 0, 'inverted');
249        sp.traceSheetEL?.displayJankData(
250          JankStruct.selectJankStruct!,
251          (datas) => {
252            sp.removeLinkLinesByBusinessType('janks');
253            // 绘制跟自己关联的线
254            datas.forEach((data) => {
255              //@ts-ignore
256              let endParentRow = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( // @ts-ignore
257                `trace-row[row-type='process'][row-id='${data.pid}'][folder]`
258              );
259              sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data, true);
260            });
261          },
262          jankClickHandler
263        );
264      }
265      //@ts-ignore
266      sp.scrollToProcess(jankRow.rowId!, jankRow.rowParentId!, jankRow.rowType!, true);
267    }
268  };
269  return jankClickHandler;
270}
271
272function snapshotClickHandlerFunc(sp: SpSystemTrace): Function {
273  let snapshotClickHandler = (d: HeapSnapshotStruct): void => {
274    sp.observerScrollHeightEnable = true;
275    let snapshotRow = sp.shadowRoot?.querySelector<TraceRow<HeapSnapshotStruct>>(`trace-row[row-id='heapsnapshot']`);
276    let task = (): void => {
277      if (snapshotRow) {
278        let findEntry = snapshotRow!.dataListCache!.find((dat) => dat.startTs === d.startTs);
279        sp.hoverStructNull();
280        sp.selectStructNull();
281        sp.wakeupListNull();
282        HeapSnapshotStruct.hoverSnapshotStruct = findEntry;
283        HeapSnapshotStruct.selectSnapshotStruct = findEntry;
284      }
285    };
286    if (snapshotRow) {
287      if (snapshotRow!.isComplete) {
288        task();
289      } else {
290        snapshotRow!.onComplete = task;
291      }
292    }
293  };
294  return snapshotClickHandler;
295}
296
297//@ts-ignore
298function cpuClickHandlerTask(threadRow: TraceRow<unknown>, sp: SpSystemTrace, d: CpuStruct): void {
299  if (threadRow) {
300    let findEntry = threadRow!.fixedList[0];
301    if (
302      //@ts-ignore
303      findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS ||
304      //@ts-ignore
305      findEntry!.startTime! > TraceRow.range!.endNS
306    ) {
307      sp.timerShaftEL?.setRangeNS(
308        //@ts-ignore
309        findEntry!.startTime! - findEntry!.dur! * 2,
310        //@ts-ignore
311        findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2
312      );
313    }
314    ThreadStruct.firstselectThreadStruct = ThreadStruct.selectThreadStruct;
315    sp.hoverStructNull().selectStructNull().wakeupListNull();
316    //@ts-ignore
317    ThreadStruct.hoverThreadStruct = findEntry;
318    //@ts-ignore
319    ThreadStruct.selectThreadStruct = findEntry;
320    //@ts-ignore
321    sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted');
322    sp.traceSheetEL?.displayThreadData(
323      ThreadStruct.selectThreadStruct!,
324      threadClickHandlerFunc(sp), // @ts-ignore
325      cpuClickHandlerFunc(sp),
326      prioClickHandlerFunc(sp),
327      (datas, str): void => {
328        sp.removeLinkLinesByBusinessType('thread');
329        if (str === 'wakeup tid') {
330          datas.forEach((data) => {
331            //@ts-ignore
332            let endParentRow = sp.shadowRoot?.querySelector<TraceRow<unknown>>( //@ts-ignore
333              `trace-row[row-id='${data.pid}'][folder]`
334            );
335            sp.drawThreadLine(endParentRow, ThreadStruct.firstselectThreadStruct, data);
336          });
337        }
338        sp.refreshCanvas(true);
339      }
340    );
341    sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true);
342  }
343}
344
345function cpuClickHandlerFunc(sp: SpSystemTrace) {
346  return function (d: CpuStruct): void {
347    //@ts-ignore
348    let traceRow = sp.shadowRoot?.querySelector<TraceRow<unknown>>(
349      `trace-row[row-id='${Utils.getDistributedRowId(d.processId)}'][row-type='process']`
350    );
351    if (traceRow) {
352      traceRow.expansion = true;
353    }
354    sp.observerScrollHeightEnable = true;
355    let threadRow = sp.queryAllTraceRow<TraceRow<ThreadStruct>>(
356      `trace-row[row-id='${Utils.getDistributedRowId(d.tid)}'][row-type='thread'][row-parent-id='${traceRow?.rowId}']`,
357      (row) => row.rowId === `${d.tid}` && row.rowType === 'thread' && row.rowParentId === traceRow?.rowId
358    )[0];
359    sp.currentRow = threadRow;
360    if (threadRow) {
361      threadRow.fixedList = [
362        {
363          startTime: d.startTime,
364          dur: d.dur,
365          cpu: d.cpu,
366          id: d.id,
367          tid: d.tid,
368          state: d.state,
369          pid: d.processId,
370          argSetID: d.argSetID,
371        },
372      ];
373      if (threadRow!.isComplete) {
374        cpuClickHandlerTask(threadRow, sp, d);
375      } else {
376        sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'process', false);
377        sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true);
378        threadRow!.onComplete = (): void => cpuClickHandlerTask(threadRow, sp, d);
379      }
380    }
381  };
382}
383
384
385function allStructOnClick(clickRowType: string, sp: SpSystemTrace, row?: TraceRow<BaseStruct>, entry?: unknown): void {
386  CpuStructOnClick(clickRowType, sp, cpuClickHandlerFunc(sp), entry as CpuStruct)
387    .then(() => ThreadStructOnClick(clickRowType, sp, threadClickHandlerFunc(sp), cpuClickHandlerFunc(sp),
388      prioClickHandlerFunc(sp), entry as ThreadStruct))
389    .then(() => funcStructOnClick(clickRowType, sp, row as TraceRow<FuncStruct>,
390      scrollToFuncHandlerFunc(sp), entry as FuncStruct))
391    .then(() => CpuFreqStructOnClick(clickRowType, sp, entry as CpuFreqStruct))
392    .then(() => CpuStateStructOnClick(clickRowType, sp, entry as CpuStateStruct))
393    .then(() => CpuFreqLimitsStructOnClick(clickRowType, sp, entry as CpuFreqLimitsStruct))
394    .then(() => ClockStructOnClick(clickRowType, sp, entry as ClockStruct))
395    .then(() => XpowerStructOnClick(clickRowType, sp, entry as XpowerStruct))
396    .then(() => XpowerStatisticStructOnClick(clickRowType, sp, row as TraceRow<XpowerStatisticStruct>, entry as XpowerStatisticStruct))
397    .then(() => XpowerAppDetailStructOnClick(clickRowType, sp, entry as XpowerAppDetailStruct))
398    .then(() => XpowerWifiBytesStructOnClick(clickRowType, sp, entry as XpowerWifiStruct))
399    .then(() => XpowerWifiPacketsStructOnClick(clickRowType, sp, entry as XpowerWifiStruct))
400    .then(() => XpowerThreadInfoStructOnClick(clickRowType, sp, entry as XpowerThreadInfoStruct))
401    .then(() => XpowerGpuFreqStructOnClick(clickRowType, sp, entry as XpowerGpuFreqStruct))
402    .then(() => XpowerThreadCountStructOnClick(clickRowType, sp, entry as XpowerThreadCountStruct))
403    .then(() => XpowerGpuFreqCountStructOnClick(clickRowType, sp, entry as XpowerGpuFreqCountStruct))
404    .then(() => HangStructOnClick(clickRowType, sp, scrollToFunc(sp)))
405    .then(() => DmaFenceStructOnClick(clickRowType, sp, entry as DmaFenceStruct))
406    .then(() => SnapshotStructOnClick(clickRowType, sp, row as TraceRow<SnapshotStruct>, entry as SnapshotStruct))
407    .then(() => IrqStructOnClick(clickRowType, sp, entry as IrqStruct))
408    .then(() => HeapStructOnClick(clickRowType, sp, row as TraceRow<HeapStruct>, entry as HeapStruct))
409    .then(() => JankStructOnClick(clickRowType, sp, row as TraceRow<JankStruct>,
410      jankClickHandlerFunc(sp), entry as JankStruct))
411    .then(() => HeapSnapshotStructOnClick(clickRowType, sp, row as TraceRow<HeapSnapshotStruct>,
412      snapshotClickHandlerFunc(sp), entry as HeapSnapshotStruct))
413    .then(() => JsCpuProfilerStructOnClick(clickRowType, sp, row as TraceRow<JsCpuProfilerStruct>,
414      entry as JsCpuProfilerStruct))
415    .then(() => AppStartupStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp), entry as AppStartupStruct))
416    .then(() => allAppStartupStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp), entry as AllAppStartupStruct))
417    .then(() => SoStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp), entry as SoStruct))
418    .then(() => FrameAnimationStructOnClick(clickRowType, sp,
419      scrollToFuncHandlerFunc(sp), row as TraceRow<FrameAnimationStruct>, entry as FrameAnimationStruct))
420    .then(() => FrameDynamicStructOnClick(clickRowType, sp, row, entry as FrameDynamicStruct))
421    .then(() => FrameSpacingStructOnClick(clickRowType, sp, row!, entry as FrameSpacingStruct))
422    .then(() => sampleStructOnClick(clickRowType, sp, row as TraceRow<SampleStruct>, entry as SampleStruct))
423    .then(() => gpuCounterStructOnClick(clickRowType, sp, entry as GpuCounterStruct))
424    .then(() => PerfToolsStructOnClick(clickRowType, sp, entry as PerfToolStruct))
425    .then(() => ThreadSysCallStructOnClick(clickRowType, sp, entry as ThreadSysCallStruct))
426    .then(() => SnapShotOnClick(clickRowType, sp, entry as SnapShotStruct))
427    .then(() => {
428      if (!JankStruct.hoverJankStruct && JankStruct.delJankLineFlag) {
429        sp.removeLinkLinesByBusinessType('janks');
430      }
431      sp.observerScrollHeightEnable = false;
432      sp.selectFlag = null;
433      sp.timerShaftEL?.removeTriangle('inverted');
434      if (!SportRuler.isMouseInSportRuler) {
435        sp.traceSheetEL?.setMode('hidden');
436        sp.refreshCanvas(true, 'click');
437      }
438    })
439    .catch((e): void => { });
440  SpAiAnalysisPage.selectChangeListener(TraceRow.range?.startNS!, TraceRow.range?.endNS!);
441}
442export default function spSystemTraceOnClickHandler(
443  sp: SpSystemTrace,
444  clickRowType: string,
445  row?: TraceRow<BaseStruct>,
446  entry?: unknown
447): void {
448  if (row) {
449    sp.currentRow = row;
450    sp.setAttribute('clickRow', clickRowType);
451    sp.setAttribute('rowName', row.name!);
452    sp.setAttribute('rowId', row.rowId!);
453  }
454  if (!sp.loadTraceCompleted) {
455    return;
456  }
457  sp.queryAllTraceRow().forEach(it => {
458    it.checkType = '-1';
459    it.rangeSelect = false;
460  });
461  sp.selectStructNull();
462  sp._slicesList.forEach((slice: { selected: boolean }): void => {
463    slice.selected = false;
464  });
465  // 判断点击的线程是否在唤醒树内
466  timeoutJudge(sp);
467  allStructOnClick(clickRowType, sp, row, entry);
468  if (!JankStruct.selectJankStruct) {
469    sp.removeLinkLinesByBusinessType('janks');
470  }
471  if (!ThreadStruct.selectThreadStruct) {
472    sp.removeLinkLinesByBusinessType('thread');
473  }
474  if (!FuncStruct.selectFuncStruct) {
475    sp.removeLinkLinesByBusinessType('distributed', 'func');
476  }
477  if (row) {
478    let pointEvent = sp.createPointEvent(row);
479    SpStatisticsHttpUtil.addOrdinaryVisitAction({
480      action: 'trace_row', // @ts-ignore
481      event: pointEvent,
482    });
483  }
484}
485
486//@ts-ignore
487function handleActions(sp: SpSystemTrace, rows: Array<TraceRow<unknown>>, ev: MouseEvent): void {
488  if (sp.rangeSelect.isMouseDown && sp.rangeSelect.drag) {
489    let downRow = sp.visibleRows.find((row) => row.containPoint(ev));
490    if (downRow && downRow.traceId !== Utils.currentSelectTrace) {
491      spSystemTraceDocumentOnMouseMoveMouseUp(sp, rows, ev);
492      return;
493    }
494  }
495  sp.rangeSelect.mouseMove(rows, ev);
496  if (sp.rangeSelect.rangeTraceRow!.length > 0) {
497    sp.tabCpuFreq!.rangeTraceRow = sp.rangeSelect.rangeTraceRow;
498    sp.tabCpuState!.rangeTraceRow = sp.rangeSelect.rangeTraceRow;
499  }
500  let search = document.querySelector('body > sp-application')!.shadowRoot!.querySelector<LitSearch>('#lit-search');
501  if (sp.rangeSelect.isMouseDown && search?.isClearValue) {
502    spSystemTraceDocumentOnMouseMoveMouseDown(sp, search);
503  } else {
504    spSystemTraceDocumentOnMouseMoveMouseUp(sp, rows, ev);
505  }
506}
507
508function handleMouseInTimeShaft(sp: SpSystemTrace, ev: MouseEvent): boolean | undefined {
509  let isMouseInTimeShaft = sp.timerShaftEL?.containPoint(ev);
510  if (isMouseInTimeShaft) {
511    sp.tipEL!.style.display = 'none';
512    sp.hoverStructNull();
513  }
514  return isMouseInTimeShaft;
515}
516
517export function spSystemTraceDocumentOnMouseMove(sp: SpSystemTrace, ev: MouseEvent): void {
518  //@ts-ignore
519  if (!sp.loadTraceCompleted || !sp.mouseEventEnable) {
520    return;
521  }
522  //@ts-ignore
523  if ((window as unknown).collectResize) {
524    sp.style.cursor = 'row-resize';
525    sp.cancelDrag();
526    return;
527  }
528  if (sp.isWASDKeyPress()) {
529    sp.hoverFlag = null;
530    ev.preventDefault();
531    return;
532  }
533  if (ev.ctrlKey && ev.button === 0 && SpSystemTrace.isMouseLeftDown) {
534    // 计算当前tab组件的高度
535    let tabHeight: number =
536      sp.shadowRoot?.querySelector('trace-sheet')!.shadowRoot?.querySelector('lit-tabs')!.clientHeight! + 1;
537    // 计算当前屏幕内高与鼠标位置坐标高度的差值
538    let diffHeight: number = window.innerHeight - ev.clientY;
539    // 如果差值大于面板高度,意味着鼠标位于泳道区域,可以通过ctrl+鼠标左键移动。否则不予生效
540    if (diffHeight > tabHeight) {
541      sp.translateByMouseMove(ev);
542    } else {
543      // 若鼠标位于tab面板区,则将其中标志位置成false
544      SpSystemTrace.isMouseLeftDown = false;
545    }
546  }
547  sp.inFavoriteArea = sp.favoriteChartListEL?.containPoint(ev);
548  //@ts-ignore
549  if ((window as unknown).isSheetMove || sp.isMouseInSheet(ev)) {
550    sp.hoverStructNull();
551    sp.tipEL!.style.display = 'none';
552    return;
553  }
554  let isMouseInTimeShaft = handleMouseInTimeShaft(sp, ev);
555  let rows = sp.visibleRows;
556  sp.timerShaftEL?.documentOnMouseMove(ev, sp);
557
558  if (isMouseInTimeShaft) {
559    return;
560  }
561  handleActions(sp, rows, ev);
562}
563
564export function spSystemTraceDocumentOnMouseMoveMouseDown(sp: SpSystemTrace, search: LitSearch): void {
565  sp.refreshCanvas(true, 'sp move down');
566  if (TraceRow.rangeSelectObject) {
567    if (search && search.searchValue !== '') {
568      search.clear();
569      search.valueChangeHandler?.('');
570    }
571  }
572}
573
574function spSystemTraceDocumentOnMouseMoveMouseUp(
575  sp: SpSystemTrace, //@ts-ignore
576  rows: Array<TraceRow<unknown>>,
577  ev: MouseEvent
578): void {
579  if (!sp.rowsPaneEL!.containPoint(ev, { left: 248 })) {
580    sp.hoverStructNull();
581  }
582  const transformYMatch = sp.canvasPanel?.style.transform.match(/\((\d+)[^\)]+\)/);
583  if (transformYMatch && transformYMatch![1]) {
584    const transformY = transformYMatch![1];
585  let favoriteHeight = sp.favoriteChartListEL!.getBoundingClientRect().height;
586  // @ts-ignore
587  let memTr = rows.filter((item: unknown) => item.rowType === TraceRow.ROW_TYPE_MEM);
588  rows
589    .filter((it) => it.focusContain(ev, sp.inFavoriteArea!, Number(transformY), favoriteHeight) && it.collect === sp.inFavoriteArea)
590    .filter((it) => {
591      if (it.collect) {
592        return true;
593      } else {
594        return (
595          it.getBoundingClientRect().bottom + it.getBoundingClientRect().height >
596          sp.favoriteChartListEL!.getBoundingClientRect().bottom
597        );
598      }
599    })
600    .forEach((tr): void => {
601      if (tr.rowType !== TraceRow.ROW_TYPE_CPU) {
602        CpuStruct.hoverCpuStruct = undefined;
603      }
604      if (tr.rowType !== TraceRow.ROW_TYPE_MEM) {
605        ProcessMemStruct.hoverProcessMemStruct = undefined;
606        memTr.forEach((i: unknown) => {
607          // @ts-ignore
608          i.focusHandler(ev);
609        });
610      }
611      if (sp.currentRowType !== tr.rowType) {
612        sp.currentRowType = tr.rowType || '';
613      }
614      tr.findHoverStruct?.();
615      tr.focusHandler?.(ev);
616    });
617  }
618  requestAnimationFrame(() => sp.refreshCanvas(true, 'sp move up'));
619}
620
621export function spSystemTraceDocumentOnMouseOut(sp: SpSystemTrace, ev: MouseEvent): void {
622  if (!sp.loadTraceCompleted) {
623    return;
624  }
625  CpuStruct.hoverCpuStruct = undefined;
626  TraceRow.isUserInteraction = false;
627  SpSystemTrace.isMouseLeftDown = false;
628  if (!sp.keyboardEnable) {
629    return;
630  }
631  if (sp.isMouseInSheet(ev)) {
632    return;
633  }
634  if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) {
635    sp.rangeSelect.mouseOut(ev);
636    sp.timerShaftEL?.documentOnMouseOut(ev);
637  }
638}
639
640export function spSystemTraceDocumentOnKeyPress(this: unknown, sp: SpSystemTrace, ev: KeyboardEvent): void {
641  if (!sp.loadTraceCompleted || SpSystemTrace.isAiAsk) {
642    return;
643  }
644  let keyPress = ev.key.toLocaleLowerCase();
645  TraceRow.isUserInteraction = true;
646  if (sp.isMousePointInSheet) {
647    return;
648  }
649  sp.observerScrollHeightEnable = false;
650  if (sp.keyboardEnable) {
651    if (keyPress === 'm') {
652      if (sp.selectFlag) {
653        sp.selectFlag!.selected = false;
654      }
655      sp.slicestime = sp.setSLiceMark(ev.shiftKey);
656      if (sp.slicestime) {
657        if (TraceRow.rangeSelectObject) {
658          let showTab = sp.getShowTab();
659          sp.traceSheetEL
660            ?.displayTab<TabPaneCurrent>('tabpane-current', ...showTab)
661            .setCurrentSlicesTime(sp.slicestime);
662        } else {
663          sp.traceSheetEL?.displayTab<TabPaneCurrent>('tabpane-current').setCurrentSlicesTime(sp.slicestime);
664        }
665      }
666    }
667    if (keyPress === 'f') {
668      let search = document.querySelector('body > sp-application')!.shadowRoot!.querySelector<LitSearch>('#lit-search');
669      if (search && search.searchValue !== '' && sp.currentRow !== undefined) {
670        sp.copyCurrentRow = sp.currentRow;
671        sp.currentRow = undefined;
672      }
673      let isSelectSliceOrFlag = false;
674      // 设置当前选中的slicetime
675      let selectSlice: unknown = undefined;
676      sp._slicesList.forEach((slice: { selected: boolean }): void => {
677        if (slice.selected) {
678          selectSlice = slice;
679        }
680      });
681      if (!!selectSlice) {
682        //@ts-ignore
683        sp.currentSlicesTime.startTime = selectSlice.startTime;
684        //@ts-ignore
685        sp.currentSlicesTime.endTime = selectSlice.endTime;
686        isSelectSliceOrFlag = true;
687      }
688
689      if (sp.selectFlag && sp.selectFlag.selected) {
690        sp.currentSlicesTime.startTime = sp.selectFlag?.time;
691        sp.currentSlicesTime.endTime = sp.selectFlag?.time;
692        isSelectSliceOrFlag = true;
693      }
694      // 设置当前的slicesTime
695      !isSelectSliceOrFlag && sp.setCurrentSlicesTime();
696    }
697    let keyPressWASD = keyPress === 'w' || keyPress === 'a' || keyPress === 's' || keyPress === 'd';
698    if (keyPressWASD) {
699      sp.keyPressMap.set(keyPress, true);
700      if (sp.rangeSelect.isMouseDown && sp.rangeSelect.drag) {
701        sp.rangeSelect.mouseUp();
702      }
703      sp.hoverFlag = null;
704    }
705    sp.timerShaftEL!.documentOnKeyPress(ev, sp.currentSlicesTime);
706    if (keyPress === 'f') {
707      sp.verticalScrollToRow();
708    }
709  } else {
710    sp.stopWASD();
711  }
712}
713
714export function spSystemTraceDocumentOnMouseDown(sp: SpSystemTrace, ev: MouseEvent): void {
715  if (!sp.loadTraceCompleted || !sp.mouseEventEnable) {
716    return;
717  }
718  if (sp.isWASDKeyPress()) {
719    ev.preventDefault();
720    ev.stopPropagation();
721    return;
722  }
723  if (ev.button === 0) {
724    SpSystemTrace.isMouseLeftDown = true;
725    if (ev.ctrlKey) {
726      ev.preventDefault();
727      sp.style.cursor = 'move';
728      sp.mouseCurrentPosition = ev.clientX;
729      return;
730    }
731  }
732
733  TraceRow.isUserInteraction = true;
734  if (sp.isMouseInSheet(ev)) {
735    sp.isInSheet = true;
736    return;
737  } else {
738    sp.isInSheet = false;
739  }
740  sp.observerScrollHeightEnable = false;
741  if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) {
742    let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft;
743    let y = ev.offsetY;
744    sp.timerShaftEL?.documentOnMouseDown(ev);
745    if (y > sp.timerShaftEL!.offsetHeight) {
746      sp.rangeSelect.mouseDown(ev);
747      sp.rangeSelect.drag = true;
748      let downRow = sp.visibleRows.find((row) => row.containPoint(ev));
749      Utils.currentSelectTrace = downRow?.traceId;
750    }
751    //  如果鼠标摁下事件发生在traceRow范围或时间轴(sportRuler除外)范围内,清除上次点击调用栈产生的所有的三角旗子
752    // ev.offsetY:鼠标在SpSystemTrace元素的y轴偏移量
753    if (
754      ev.offsetY > sp.timerShaftEL!.clientHeight ||
755      ev.offsetY < sp.timerShaftEL!.clientHeight - sp.timerShaftEL!.sportRuler!.frame.height
756    ) {
757      sp.clearTriangle(sp.timerShaftEL!.sportRuler!.flagList);
758    }
759  } else {
760    sp.rangeSelect.drag = false;
761  }
762}
763
764function handleTimerShaftActions(ev: MouseEvent, sp: SpSystemTrace): void {
765  if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) {
766    let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft;
767    let y = ev.offsetY;
768    if (
769      sp.timerShaftEL!.sportRuler!.frame.contains(x, y) &&
770      x > (TraceRow.rangeSelectObject?.startX || 0) &&
771      x < (TraceRow.rangeSelectObject?.endX || 0)
772    ) {
773      let findSlicestime = sp.timerShaftEL!.sportRuler?.findSlicesTime(x, y); // 查找帽子
774      if (!findSlicestime) {
775        // 如果没有找到帽子,则绘制一个旗子
776        let time = Math.round(
777          (x * (TraceRow.range?.endNS! - TraceRow.range?.startNS!)) / sp.timerShaftEL!.canvas!.offsetWidth +
778          TraceRow.range?.startNS!
779        );
780        sp.timerShaftEL!.sportRuler!.drawTriangle(time, 'squre');
781      }
782    }
783  }
784}
785
786export function spSystemTraceDocumentOnMouseUp(sp: SpSystemTrace, ev: MouseEvent): void {
787  //@ts-ignore
788  if ((window as unknown).collectResize) {
789    return;
790  }
791  if (!sp.loadTraceCompleted || !sp.mouseEventEnable) {
792    return;
793  }
794  //@ts-ignore
795  if ((window as unknown).isSheetMove) {
796    return;
797  }
798  if (sp.isWASDKeyPress()) {
799    ev.preventDefault();
800    ev.stopPropagation();
801    return;
802  }
803  SpSystemTrace.isMouseLeftDown = false;
804  if (ev.ctrlKey) {
805    ev.preventDefault();
806    sp.offsetMouse = 0;
807    sp.mouseCurrentPosition = 0;
808    sp.style.cursor = 'default';
809    return;
810  }
811  TraceRow.isUserInteraction = false;
812  sp.rangeSelect.isMouseDown = false;
813  if (sp.isMouseInSheet(ev)) {
814    return;
815  }
816  handleTimerShaftActions(ev, sp);
817  if (!SportRuler.isMouseInSportRuler) {
818    sp.rangeSelect.mouseUp(ev);
819  }
820  sp.timerShaftEL?.documentOnMouseUp(ev);
821}
822
823export function spSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEvent): void {
824  if (SpSystemTrace.isAiAsk) {
825    return;
826  }
827  if (sp.times.size > 0) {
828    for (let timerId of sp.times) {
829      clearTimeout(timerId);
830    }
831  }
832  if (!sp.keyboardEnable) {
833    return;
834  }
835  let recordTraceElement = sp.parentElement?.querySelector('sp-record-trace');
836  let menuItemElement = recordTraceElement?.shadowRoot?.querySelector('lit-main-menu-item[icon="file-config"]');
837  let flag: boolean = menuItemElement ? menuItemElement.hasAttribute('back') : false;
838  if (ev.key.toLocaleLowerCase() === String.fromCharCode(47) && !flag && !SpSystemTrace.isAiAsk) {
839    if (SpSystemTrace.keyboardFlar) {
840      document
841        .querySelector('body > sp-application')!
842        .shadowRoot!.querySelector<SpKeyboard>('#sp-keyboard')!.style.visibility = 'visible';
843      SpSystemTrace.keyboardFlar = false;
844    } else {
845      document
846        .querySelector('body > sp-application')!
847        .shadowRoot!.querySelector<SpKeyboard>('#sp-keyboard')!.style.visibility = 'hidden';
848      SpSystemTrace.keyboardFlar = true;
849    }
850  }
851  if (!sp.loadTraceCompleted) {
852    return;
853  }
854  let flagsItem = window.localStorage.getItem(FlagsConfig.FLAGS_CONFIG_KEY);
855  let flagsItemJson = JSON.parse(flagsItem!);
856  if (flagsItemJson.VSync === 'Enabled') {
857    enableVSync(false, ev, () => sp.refreshCanvas(true, 'sp key up'));
858  }
859  let keyPress = ev.key.toLocaleLowerCase();
860  if (keyPress === 'w' || keyPress === 'a' || keyPress === 's' || keyPress === 'd') {
861    sp.keyPressMap.set(keyPress, false);
862  }
863  if (keyPress === 'f' && sp.copyCurrentRow) {
864    sp.currentRow = sp.copyCurrentRow;
865  }
866  TraceRow.isUserInteraction = false;
867  sp.observerScrollHeightEnable = false;
868  sp.keyboardEnable && sp.timerShaftEL!.documentOnKeyUp(ev);
869  if (ev.code === 'Enter' || ev.code === 'NumpadEnter') {
870    document.removeEventListener('keydown', sp.documentOnKeyDown);
871    if (ev.shiftKey) {
872      sp.dispatchEvent(
873        new CustomEvent('trace-previous-data', {
874          detail: {},
875          composed: false,
876        })
877      );
878    } else {
879      sp.dispatchEvent(
880        new CustomEvent('trace-next-data', {
881          detail: {},
882          composed: false,
883        })
884      );
885    }
886    document.addEventListener('keydown', sp.documentOnKeyDown);
887  }
888
889  if (ev.ctrlKey) {
890    spSystemTraceDocumentOnKeyUpCtrlKey(keyPress, sp, ev);
891  }
892}
893
894function spSystemTraceDocumentOnKeyUpCtrlKey(keyPress: string, sp: SpSystemTrace, ev: KeyboardEvent): void {
895  if (keyPress === 'b') {
896    let menuBox = document
897      .querySelector('body > sp-application')!
898      .shadowRoot?.querySelector('#main-menu') as LitMainMenu;
899    let searchBox = document
900      .querySelector('body > sp-application')
901      ?.shadowRoot?.querySelector('div > div.search-vessel') as HTMLDivElement;
902    let appContent = document
903      .querySelector('body > sp-application')
904      ?.shadowRoot?.querySelector('div > #app-content') as HTMLDivElement;
905    let rowPane = appContent
906      ?.querySelector('#sp-system-trace')
907      ?.shadowRoot?.querySelector('div > div.rows-pane') as HTMLDivElement;
908    let timerShaft = appContent
909      ?.querySelector('#sp-system-trace')
910      ?.shadowRoot?.querySelector('div > timer-shaft-element') as HTMLDivElement;
911    let spChartList = appContent
912      ?.querySelector('#sp-system-trace')
913      ?.shadowRoot?.querySelector('div > sp-chart-list') as HTMLDivElement;
914    let canvasEle = spChartList.shadowRoot?.querySelector('canvas') as unknown as HTMLDivElement;
915    let sidebarButton = searchBox!.querySelector('div > div.sidebar-button') as HTMLDivElement;
916    let importConfigDiv = searchBox!.querySelector('div > #import-key-path') as HTMLDivElement;
917    if (menuBox.style.zIndex! === '2000' || searchBox!.style.display !== 'none') {
918      SpSystemTrace.isHiddenMenu = true;
919      menuBox.style.width = '0px';
920      menuBox.style.display = 'flex';
921      menuBox.style.zIndex = '0';
922      sidebarButton.style.width = '48px';
923      importConfigDiv!.style.left = '45px';
924      searchBox!.style.display = 'none';
925      rowPane.style.maxHeight = '100%';
926    } else {
927      SpSystemTrace.isHiddenMenu = false;
928      menuBox.style.width = '248px';
929      menuBox.style.zIndex = '2000';
930      menuBox.style.display = 'flex';
931      sidebarButton.style.width = '0px';
932      importConfigDiv!.style.left = '5px';
933      searchBox!.style.display = '';
934      rowPane.style.maxHeight = '100%';
935    }
936  }
937  if (keyPress === '[' && sp._slicesList.length > 1) {
938    sp.selectFlag = undefined;
939    sp.MarkJump(sp._slicesList, 'slice', 'previous', ev);
940  } else if (keyPress === ',' && sp._flagList.length > 1) {
941    sp.MarkJump(sp._flagList, 'flag', 'previous', ev);
942  } else if (keyPress === ']' && sp._slicesList.length > 1) {
943    sp.selectFlag = undefined;
944    sp.MarkJump(sp._slicesList, 'slice', 'next', ev);
945  } else if (keyPress === '.' && sp._flagList.length > 1) {
946    sp.MarkJump(sp._flagList, 'flag', 'next', ev);
947  } else {
948    return;
949  }
950}
951
952function handleClickActions(sp: SpSystemTrace, x: number, y: number, ev: MouseEvent): void {
953  if (
954    !(
955      sp.timerShaftEL!.sportRuler!.frame.contains(x, y) &&
956      x > (TraceRow.rangeSelectObject?.startX || 0) &&
957      x < (TraceRow.rangeSelectObject?.endX || 0)
958    )
959  ) {
960    const transformYMatch = sp.canvasPanel?.style.transform.match(/\((\d+)[^\)]+\)/);
961    const transformY = transformYMatch![1];
962    let inFavoriteArea = sp.favoriteChartListEL?.containPoint(ev);
963    let favoriteHeight = sp.favoriteChartListEL!.getBoundingClientRect().height;
964    let rows = sp.visibleRows.filter((it) =>
965      it.focusContain(ev, inFavoriteArea!, Number(transformY), favoriteHeight) && it.collect === inFavoriteArea);
966    if (JankStruct.delJankLineFlag) {
967      sp.removeLinkLinesByBusinessType('janks');
968    }
969    let strict = true;
970    let offset = false;
971    if (
972      rows[0] &&
973      (rows[0].rowType === TraceRow.ROW_TYPE_FRAME_DYNAMIC || rows[0].rowType === TraceRow.ROW_TYPE_FRAME_SPACING)
974    ) {
975      strict = false;
976      offset = true;
977    }
978    let skip = false;
979    if (
980      rows[0] &&
981      (rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_WIFI_BYTES ||
982        rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_WIFI_PACKETS ||
983        rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_APP_DETAIL_DISPLAY ||
984        rows[0].rowType === TraceRow.ROW_TYPE_XPOWER_STATISTIC)
985    ) {
986      skip = true;
987    }
988    if (rows && rows[0] && (rows[0].getHoverStruct(strict, offset) ||
989      (rows[0].rowType === TraceRow.ROW_TYPE_GPU_COUNTER && rows[0].getHoverStruct(false) || skip))
990    ) {
991      sp.onClickHandler(rows[0]!.rowType!, rows[0], rows[0].getHoverStruct(strict, offset));
992      sp.documentOnMouseMove(ev);
993    } else {
994      sp.clickEmptyArea();
995    }
996  }
997}
998
999export function spSystemTraceDocumentOnClick(sp: SpSystemTrace, ev: MouseEvent): void {
1000  if (!sp.loadTraceCompleted) {
1001    return;
1002  }
1003  if (sp.isWASDKeyPress()) {
1004    sp.hoverFlag = null;
1005    ev.preventDefault();
1006    ev.stopPropagation();
1007    return;
1008  }
1009  //@ts-ignore
1010  if ((window as unknown).isSheetMove) {
1011    return;
1012  }
1013  if (sp.isMouseInSheet(ev)) {
1014    return;
1015  }
1016  //@ts-ignore
1017  if ((window as unknown).isPackUpTable) {
1018    //@ts-ignore
1019    (window as unknown).isPackUpTable = false;
1020    return;
1021  }
1022  let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft;
1023  let y = ev.offsetY;
1024  if (sp.timerShaftEL?.getRangeRuler()?.frame.contains(x, y)) {
1025    sp.clickEmptyArea();
1026    return;
1027  }
1028  if (sp.rangeSelect.isDrag()) {
1029    return;
1030  }
1031  handleClickActions(sp, x, y, ev);
1032  ev.preventDefault();
1033}
1034
1035export function spSystemTraceDocumentOnKeyDown(sp: SpSystemTrace, ev: KeyboardEvent): void {
1036  document.removeEventListener('keyup', sp.documentOnKeyUp);
1037  sp.debounce(sp.continueSearch, 250, ev)();
1038  document.addEventListener('keyup', sp.documentOnKeyUp);
1039}
1040