Skip to content

Commit d39a8c1

Browse files
committed
refactor panel column sortings
1 parent a598364 commit d39a8c1

15 files changed

+266
-283
lines changed

jest/tests/wrappers.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
TAG_EVAL_RETURN_SET_INTERVAL,
1515
TRACE_ERROR_MESSAGE,
1616
} from '../../src/api/const.ts';
17-
import { WrapperCallstackType } from '../../src/api/settings.ts';
17+
import { EWrapperCallstackType } from '../../src/api/settings.ts';
1818

1919
const TEST_STACK = `Error: ${TRACE_ERROR_MESSAGE}
2020
at <anonymous>:1:1
@@ -391,7 +391,7 @@ describe('wrappers', () => {
391391
const standard = [
392392
{ name: 'call2', link: 'https://example2.com/bundle3.js:4:5' },
393393
];
394-
wrapper.setCallstackType(WrapperCallstackType.SHORT);
394+
wrapper.setCallstackType(EWrapperCallstackType.SHORT);
395395
const { trace } = wrapper.createCallstack(
396396
<Error>{ stack: TEST_STACK },
397397
null

src/api-monitor-cs-main.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import {
1212
type TMediaTelemetry,
1313
} from './api/mediaMonitor.ts';
1414
import { Wrapper, TimerType, type TWrapperMetrics } from './api/wrappers.ts';
15-
import { DEFAULT_PANELS, panelsArrayToVisibilityMap } from './api/settings.ts';
15+
import {
16+
panelsArrayToVisibilityMap,
17+
type TPanelVisibilityMap,
18+
} from './api/settings.ts';
1619

1720
export interface TMetrics {
1821
mediaMetrics: TMediaTelemetry;
@@ -38,7 +41,7 @@ const wrapRequestIdleCallbackOnce = callingOnce(() =>
3841
const wrapCancelIdleCallbackOnce = callingOnce(() =>
3942
wrapper.wrapCancelIdleCallback()
4043
);
41-
let panels = panelsArrayToVisibilityMap(DEFAULT_PANELS);
44+
let panels: TPanelVisibilityMap;
4245
const eachSecond = new Timer(
4346
() => {
4447
meetMedia(document.querySelectorAll('video,audio'));

src/api/comparator.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import type { TOnlineTimerMetrics } from './wrappers.ts';
2-
import { SortOrder, type TSortOrder } from './settings.ts';
2+
import { ESortOrder } from './settings.ts';
33

44
// descending sort by `handler` field
5-
function compareIfEqual<T, Key extends keyof T>(
6-
field: Key,
7-
first: T,
8-
second: T
9-
) {
5+
function compareIfEqual<T>(field: keyof T, first: T, second: T) {
106
if (field === 'calls' || field === 'delay') {
117
// @ts-ignore
128
return second['handler'] > first['handler'] ? 1 : -1;
@@ -15,10 +11,7 @@ function compareIfEqual<T, Key extends keyof T>(
1511
}
1612
}
1713

18-
export function compareByFieldOrder<T, Key extends keyof T>(
19-
field: Key,
20-
order: TSortOrder
21-
) {
14+
export function compareByFieldOrder<T>(field: keyof T, order: ESortOrder) {
2215
return function (first: T, second: T) {
2316
let a = first[field] || 0;
2417
let b = second[field] || 0;
@@ -27,13 +20,13 @@ export function compareByFieldOrder<T, Key extends keyof T>(
2720
(typeof a === 'number' && typeof b === 'number') ||
2821
(typeof a === 'string' && typeof b === 'string')
2922
) {
30-
if (order === SortOrder.DESCENDING) {
23+
if (order === ESortOrder.DESCENDING) {
3124
return b > a ? 1 : b < a ? -1 : compareIfEqual(field, first, second);
3225
} else {
3326
return a > b ? 1 : a < b ? -1 : compareIfEqual(field, first, second);
3427
}
3528
} else {
36-
return typeof (order === SortOrder.DESCENDING ? b : a) === 'number'
29+
return typeof (order === ESortOrder.DESCENDING ? b : a) === 'number'
3730
? -1
3831
: 1;
3932
}

src/api/mediaMonitor.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,13 @@ type TMediaModel = {
1313
metrics: TMediaMetrics;
1414
eventListener: (e: Event) => void;
1515
};
16-
export const TMediaType = {
17-
VIDEO: 0,
18-
AUDIO: 1,
19-
} as const;
20-
type TMediaTypeKeys = (typeof TMediaType)[keyof typeof TMediaType];
16+
export enum EMediaType {
17+
VIDEO,
18+
AUDIO,
19+
}
2120
export type TMediaMetrics = {
2221
mediaId: string;
23-
type: TMediaTypeKeys;
22+
type: EMediaType;
2423
events: { [key: string]: number };
2524
props: { [key: string]: unknown };
2625
};
@@ -168,7 +167,7 @@ function startMonitorMedia(mediaId: string, el: HTMLMediaElement): TMediaModel {
168167
metrics: {
169168
mediaId,
170169
type:
171-
el instanceof HTMLVideoElement ? TMediaType.VIDEO : TMediaType.AUDIO,
170+
el instanceof HTMLVideoElement ? EMediaType.VIDEO : EMediaType.AUDIO,
172171
events,
173172
props,
174173
},

src/api/settings.ts

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
import type {
2+
TCancelAnimationFrameHistory,
3+
TCancelIdleCallbackHistory,
4+
TClearTimerHistory,
5+
TRequestAnimationFrameHistory,
6+
TRequestIdleCallbackHistory,
7+
TSetTimerHistory,
8+
} from './wrappers.ts';
9+
110
type TPanelKey =
211
| 'eval'
312
| 'media'
@@ -11,11 +20,6 @@ type TPanelKey =
1120
| 'requestIdleCallback'
1221
| 'cancelIdleCallback';
1322

14-
export type THistorySortField =
15-
(typeof HistorySortField)[keyof typeof HistorySortField];
16-
export type TWrapperCallstackType =
17-
(typeof WrapperCallstackType)[keyof typeof WrapperCallstackType];
18-
export type TSortOrder = (typeof SortOrder)[keyof typeof SortOrder];
1923
export type TPanelVisibilityMap = {
2024
[K in TPanelKey]: TSettingsPanel;
2125
};
@@ -26,7 +30,7 @@ export type TSettingsPanel = {
2630
wrap: boolean | null;
2731
};
2832
export type TSettings = typeof DEFAULT_SETTINGS;
29-
export type TSettingsProperty = Partial<typeof DEFAULT_SETTINGS>;
33+
export type TSettingsProperty = Partial<TSettings>;
3034

3135
const SETTINGS_VERSION = '1.0.7';
3236
export const DEFAULT_PANELS: TSettingsPanel[] = [
@@ -78,35 +82,52 @@ export const DEFAULT_PANELS: TSettingsPanel[] = [
7882
},
7983
];
8084

81-
export const WrapperCallstackType = {
82-
FULL: 0,
83-
SHORT: 1,
84-
} as const;
85+
export enum EWrapperCallstackType {
86+
FULL,
87+
SHORT,
88+
}
89+
export enum ESortOrder {
90+
ASCENDING,
91+
DESCENDING,
92+
}
8593

86-
export const HistorySortField = {
87-
calls: 'calls',
88-
handler: 'handler',
89-
delay: 'delay',
90-
selfTime: 'selfTime',
94+
export const DEFAULT_SORT_SET_TIMERS = {
95+
field: <keyof TSetTimerHistory>'calls',
96+
order: <ESortOrder>ESortOrder.DESCENDING,
9197
} as const;
92-
93-
export const SortOrder = {
94-
ASCENDING: 0,
95-
DESCENDING: 1,
98+
export const DEFAULT_SORT_CLEAR_TIMERS = {
99+
field: <keyof TClearTimerHistory>'calls',
100+
order: <ESortOrder>ESortOrder.DESCENDING,
101+
} as const;
102+
export const DEFAULT_SORT_RAF = {
103+
field: <keyof TRequestAnimationFrameHistory>'calls',
104+
order: <ESortOrder>ESortOrder.DESCENDING,
105+
} as const;
106+
export const DEFAULT_SORT_CAF = {
107+
field: <keyof TCancelAnimationFrameHistory>'calls',
108+
order: <ESortOrder>ESortOrder.DESCENDING,
109+
} as const;
110+
export const DEFAULT_SORT_RIC = {
111+
field: <keyof TRequestIdleCallbackHistory>'calls',
112+
order: <ESortOrder>ESortOrder.DESCENDING,
113+
} as const;
114+
export const DEFAULT_SORT_CIC = {
115+
field: <keyof TCancelIdleCallbackHistory>'calls',
116+
order: <ESortOrder>ESortOrder.DESCENDING,
96117
} as const;
97-
98-
export const DEFAULT_SORT = {
99-
timersHistoryField: HistorySortField.delay as THistorySortField,
100-
timersHistoryOrder: SortOrder.DESCENDING as TSortOrder,
101-
};
102118

103119
export const DEFAULT_SETTINGS = {
104120
panels: DEFAULT_PANELS,
105-
sort: DEFAULT_SORT,
121+
sortSetTimers: DEFAULT_SORT_SET_TIMERS,
122+
sortClearTimers: DEFAULT_SORT_CLEAR_TIMERS,
123+
sortRequestAnimationFrame: DEFAULT_SORT_RAF,
124+
sortCancelAnimationFrame: DEFAULT_SORT_CAF,
125+
sortRequestIdleCallback: DEFAULT_SORT_RIC,
126+
sortCancelIdleCallback: DEFAULT_SORT_CIC,
106127
paused: false,
107128
devtoolsPanelShown: false,
108129
traceForDebug: <string | null>null,
109-
wrapperCallstackType: <TWrapperCallstackType>WrapperCallstackType.FULL,
130+
wrapperCallstackType: EWrapperCallstackType.SHORT,
110131
};
111132

112133
export function panelsArrayToVisibilityMap(panels: TSettingsPanel[]) {
@@ -116,7 +137,7 @@ export function panelsArrayToVisibilityMap(panels: TSettingsPanel[]) {
116137
);
117138
}
118139

119-
export async function getSettings(): Promise<typeof DEFAULT_SETTINGS> {
140+
export async function getSettings(): Promise<TSettings> {
120141
let store = await chrome.storage.local.get([SETTINGS_VERSION]);
121142
const isEmpty = !Object.keys(store).length;
122143

src/api/wrappers.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,7 @@ import {
1919
TAG_EVAL_RETURN_SET_INTERVAL,
2020
} from './const.ts';
2121
import { TAG_EXCEPTION, cloneObjectSafely } from './clone.ts';
22-
import {
23-
WrapperCallstackType,
24-
type TWrapperCallstackType,
25-
type TPanelVisibilityMap,
26-
} from './settings.ts';
22+
import { EWrapperCallstackType, type TPanelVisibilityMap } from './settings.ts';
2723
import { hashString } from './hash.ts';
2824
import { trim2microsecond } from './time.ts';
2925

@@ -185,7 +181,7 @@ export class Wrapper {
185181
};
186182
selfTraceLink = '';
187183
#traceForDebug: string | null = null;
188-
#callstackType: TWrapperCallstackType = WrapperCallstackType.FULL;
184+
#callstackType: EWrapperCallstackType = EWrapperCallstackType.FULL;
189185

190186
constructor() {
191187
this.#initSelfTrace();
@@ -225,7 +221,7 @@ export class Wrapper {
225221
this.#traceForDebug = traceId;
226222
}
227223

228-
setCallstackType(type: TWrapperCallstackType) {
224+
setCallstackType(type: EWrapperCallstackType) {
229225
this.#callstackType = type;
230226
}
231227

@@ -920,7 +916,7 @@ export class Wrapper {
920916
}
921917

922918
createCallstack(e: Error, uniqueTrait?: unknown): TCallstack {
923-
if (this.#callstackType === WrapperCallstackType.FULL) {
919+
if (this.#callstackType === EWrapperCallstackType.FULL) {
924920
return this.#createFullCallstack(e, uniqueTrait);
925921
} else {
926922
return this.#createShortCallstack(e, uniqueTrait);

src/view/components/AnimationCancelHistory.svelte

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,40 @@
11
<script lang="ts">
22
import type { TCancelAnimationFrameHistory } from '../../api/wrappers.ts';
33
import {
4-
DEFAULT_SORT,
4+
DEFAULT_SORT_CAF,
55
getSettings,
66
setSettings,
7-
HistorySortField,
8-
type THistorySortField,
9-
type TSortOrder,
7+
ESortOrder,
108
} from '../../api/settings.ts';
119
import { compareByFieldOrder } from '../../api/comparator.ts';
1210
import Variable from './Variable.svelte';
1311
import Trace from './Trace.svelte';
1412
import TraceDomain from './TraceDomain.svelte';
15-
import TimersHistoryCellSort from './TimersHistoryCellSort.svelte';
13+
import SortableColumn from './SortableColumn.svelte';
1614
1715
let {
1816
metrics,
1917
caption = '',
2018
}: { metrics: TCancelAnimationFrameHistory[]; caption?: string } = $props();
21-
let field = $state(DEFAULT_SORT.timersHistoryField);
22-
let order = $state(DEFAULT_SORT.timersHistoryOrder);
19+
let sortField = $state(DEFAULT_SORT_CAF.field);
20+
let sortOrder = $state(DEFAULT_SORT_CAF.order);
2321
let sortedMetrics = $derived.by(() =>
24-
metrics.sort(
25-
compareByFieldOrder(<keyof TCancelAnimationFrameHistory>field, order)
26-
)
22+
metrics.sort(compareByFieldOrder(sortField, sortOrder))
2723
);
2824
2925
getSettings().then((settings) => {
30-
field = settings.sort.timersHistoryField;
31-
order = settings.sort.timersHistoryOrder;
26+
sortField = settings.sortCancelAnimationFrame.field;
27+
sortOrder = settings.sortCancelAnimationFrame.order;
3228
});
3329
34-
function onChangeSort(_field: THistorySortField, _order: TSortOrder) {
35-
field = _field;
36-
order = _order;
30+
function onChangeSort(_field: string, _order: ESortOrder) {
31+
sortField = <keyof TCancelAnimationFrameHistory>_field;
32+
sortOrder = _order;
3733
3834
setSettings({
39-
sort: {
40-
timersHistoryField: $state.snapshot(_field),
41-
timersHistoryOrder: $state.snapshot(_order),
35+
sortCancelAnimationFrame: {
36+
field: $state.snapshot(sortField),
37+
order: $state.snapshot(sortOrder),
4238
},
4339
});
4440
}
@@ -54,19 +50,19 @@
5450
<th class="shaft"></th>
5551
<th class="w-full">Callstack</th>
5652
<th class="ta-c">
57-
<TimersHistoryCellSort
58-
field={HistorySortField.calls}
59-
currentField={field}
60-
currentFieldOrder={order}
61-
eventChangeSorting={onChangeSort}>Called</TimersHistoryCellSort
53+
<SortableColumn
54+
field="calls"
55+
currentField={sortField}
56+
currentFieldOrder={sortOrder}
57+
eventChangeSorting={onChangeSort}>Called</SortableColumn
6258
>
6359
</th>
6460
<th class="ta-c">
65-
<TimersHistoryCellSort
66-
field={HistorySortField.handler}
67-
currentField={field}
68-
currentFieldOrder={order}
69-
eventChangeSorting={onChangeSort}>Handler</TimersHistoryCellSort
61+
<SortableColumn
62+
field="handler"
63+
currentField={sortField}
64+
currentFieldOrder={sortOrder}
65+
eventChangeSorting={onChangeSort}>Handler</SortableColumn
7066
>
7167
</th>
7268
</tr>

0 commit comments

Comments
 (0)