Skip to content

Commit 3363bec

Browse files
committed
Make it possible to override the zeroAt value
1 parent d07c28b commit 3363bec

File tree

10 files changed

+111
-3
lines changed

10 files changed

+111
-3
lines changed

locales/en-US/app.ftl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,10 @@ MarkerContextMenu--end-selection-at-marker-start =
438438
End selection at marker’s <strong>start</strong>
439439
MarkerContextMenu--end-selection-at-marker-end =
440440
End selection at marker’s <strong>end</strong>
441+
MarkerContextMenu--override-zero-at-marker-start =
442+
Override zero at marker’s start
443+
MarkerContextMenu--reset-override-zero-at =
444+
Reset the override for zero
441445
MarkerContextMenu--copy-description = Copy description
442446
MarkerContextMenu--copy-call-stack = Copy call stack
443447
MarkerContextMenu--copy-url = Copy URL

src/actions/profile-view.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1905,6 +1905,13 @@ export function changeMouseTimePosition(
19051905
};
19061906
}
19071907

1908+
export function overrideZeroAt(zeroAt: Milliseconds | null): Action {
1909+
return {
1910+
type: 'OVERRIDE_ZERO_AT',
1911+
zeroAt,
1912+
};
1913+
}
1914+
19081915
export function changeTableViewOptions(
19091916
tab: TabSlug,
19101917
tableViewOptions: TableViewOptions

src/components/shared/MarkerContextMenu.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131
background-image: url(../../../res/img/svg/end-selection-at-marker-end.svg);
3232
}
3333

34+
.markerContextMenuIconOverrideZeroAtMarkerStart {
35+
background-image: url(../../../res/img/svg/start-selection-at-marker-start.svg);
36+
}
37+
38+
.markerContextMenuIconResetOverrideZeroAt {
39+
background-image: url(../../../res/img/svg/searchfield-cancel.svg);
40+
}
41+
3442
.markerContextMenuIconCopyDescription {
3543
background-image: url(../../../res/img/svg/copy-dark.svg);
3644
}

src/components/shared/MarkerContextMenu.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ import {
1313
setContextMenuVisibility,
1414
updatePreviewSelection,
1515
selectTrackFromTid,
16+
overrideZeroAt,
1617
} from 'firefox-profiler/actions/profile-view';
1718
import {
1819
getPreviewSelection,
1920
getCommittedRange,
2021
getProfiledThreadIds,
2122
getInnerWindowIDToPageMap,
23+
isZeroAtOverridden,
2224
} from 'firefox-profiler/selectors/profile';
2325
import { getRightClickedMarkerInfo } from 'firefox-profiler/selectors/right-clicked-marker';
2426
import copy from 'copy-to-clipboard';
@@ -59,12 +61,14 @@ type StateProps = {
5961
readonly getMarkerLabelToCopy: (param: MarkerIndex) => string;
6062
readonly profiledThreadIds: Set<Tid>;
6163
readonly innerWindowIDToPageMap: Map<InnerWindowID, Page> | null;
64+
readonly isZeroAtOverridden: boolean;
6265
};
6366

6467
type DispatchProps = {
6568
readonly updatePreviewSelection: typeof updatePreviewSelection;
6669
readonly setContextMenuVisibility: typeof setContextMenuVisibility;
6770
readonly selectTrackFromTid: typeof selectTrackFromTid;
71+
readonly overrideZeroAt: typeof overrideZeroAt;
6872
};
6973

7074
type Props = ConnectedProps<OwnProps, StateProps, DispatchProps>;
@@ -141,6 +145,16 @@ class MarkerContextMenuImpl extends PureComponent<Props> {
141145
});
142146
};
143147

148+
overrideZeroAtMarkerStart = () => {
149+
const { marker, overrideZeroAt } = this.props;
150+
overrideZeroAt(marker.start);
151+
};
152+
153+
resetZeroAt = () => {
154+
const { overrideZeroAt } = this.props;
155+
overrideZeroAt(null);
156+
};
157+
144158
_isZeroDurationMarker(marker: Marker | null): boolean {
145159
return !marker || marker.end === null;
146160
}
@@ -379,7 +393,8 @@ class MarkerContextMenuImpl extends PureComponent<Props> {
379393
};
380394

381395
override render() {
382-
const { marker, previewSelection, committedRange } = this.props;
396+
const { marker, previewSelection, committedRange, isZeroAtOverridden } =
397+
this.props;
383398
const { data } = marker;
384399

385400
const selectionEnd = previewSelection
@@ -482,6 +497,25 @@ class MarkerContextMenuImpl extends PureComponent<Props> {
482497
</>
483498
)}
484499

500+
<div className="react-contextmenu-separator" />
501+
502+
<MenuItem onClick={this.overrideZeroAtMarkerStart}>
503+
<span className="react-contextmenu-icon markerContextMenuIconOverrideZeroAtMarkerStart" />
504+
<Localized id="MarkerContextMenu--override-zero-at-marker-start">
505+
Override zero at marker’s start
506+
</Localized>
507+
</MenuItem>
508+
{isZeroAtOverridden ? (
509+
<MenuItem onClick={this.resetZeroAt}>
510+
<span className="react-contextmenu-icon markerContextMenuIconResetOverrideZeroAt" />
511+
<Localized id="MarkerContextMenu--reset-override-zero-at">
512+
Reset the override for zero
513+
</Localized>
514+
</MenuItem>
515+
) : (
516+
''
517+
)}
518+
485519
<div className="react-contextmenu-separator" />
486520
<MenuItem onClick={this.copyMarkerDescription}>
487521
<span className="react-contextmenu-icon markerContextMenuIconCopyDescription" />
@@ -533,12 +567,14 @@ const MarkerContextMenu = explicitConnect<OwnProps, StateProps, DispatchProps>({
533567
getMarkerLabelToCopy: selectors.getMarkerLabelToCopyGetter(state),
534568
profiledThreadIds: getProfiledThreadIds(state),
535569
innerWindowIDToPageMap: getInnerWindowIDToPageMap(state),
570+
isZeroAtOverridden: isZeroAtOverridden(state),
536571
};
537572
},
538573
mapDispatchToProps: {
539574
updatePreviewSelection,
540575
setContextMenuVisibility,
541576
selectTrackFromTid,
577+
overrideZeroAt,
542578
},
543579
component: MarkerContextMenuImpl,
544580
});

src/reducers/profile-view.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,15 @@ const mouseTimePosition: Reducer<Milliseconds | null> = (
824824
}
825825
};
826826

827+
const overrideZeroAt: Reducer<Milliseconds | null> = (state = null, action) => {
828+
switch (action.type) {
829+
case 'OVERRIDE_ZERO_AT':
830+
return action.zeroAt;
831+
default:
832+
return state;
833+
}
834+
};
835+
827836
/**
828837
* Provide a mechanism to wrap the reducer in a special function that can reset
829838
* the state to the default values. This is useful when viewing multiple profiles
@@ -864,6 +873,7 @@ const profileViewReducer: Reducer<ProfileViewState> = wrapReducerInResetter(
864873
hoveredMarker,
865874
mouseTimePosition,
866875
perTab: tableViewOptionsPerTab,
876+
overrideZeroAt,
867877
}),
868878
profile,
869879
globalTracks,

src/selectors/profile.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,15 @@ export const getScrollToSelectionGeneration: Selector<number> = (state) =>
9696
getProfileViewOptions(state).scrollToSelectionGeneration;
9797
export const getFocusCallTreeGeneration: Selector<number> = (state) =>
9898
getProfileViewOptions(state).focusCallTreeGeneration;
99-
export const getZeroAt: Selector<Milliseconds> = (state) =>
100-
getProfileRootRange(state).start;
99+
export const getZeroAt: Selector<Milliseconds> = (state) => {
100+
const viewOptions = getProfileViewOptions(state);
101+
if (viewOptions.overrideZeroAt !== null) {
102+
return viewOptions.overrideZeroAt;
103+
}
104+
return getProfileRootRange(state).start;
105+
};
106+
export const isZeroAtOverridden: Selector<boolean> = (state) =>
107+
getProfileViewOptions(state).overrideZeroAt !== null;
101108
export const getProfileTimelineUnit: Selector<TimelineUnit> = (state) => {
102109
const { sampleUnits } = getProfile(state).meta;
103110
return sampleUnits ? sampleUnits.time : 'ms';

src/test/components/MarkerTable.test.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,23 @@ describe('MarkerTable', function () {
239239
);
240240
});
241241

242+
it('can override the zero at timing using the context menu', () => {
243+
const { getRowElement } = setup();
244+
245+
const startNode = ensureExists(
246+
getRowElement(/setTimeout/).querySelector('.start')
247+
);
248+
expect(startNode).toHaveTextContent('0.153s');
249+
250+
fireFullContextMenu(getRowElement(/setTimeout/) as HTMLElement);
251+
fireFullClick(screen.getByText('Override zero at marker’s start'));
252+
253+
const startNode2 = ensureExists(
254+
getRowElement(/setTimeout/).querySelector('.start')
255+
);
256+
expect(startNode2).toHaveTextContent('0s');
257+
});
258+
242259
describe('EmptyReasons', () => {
243260
it('shows reasons when a profile has no non-network markers', () => {
244261
const { profile } = getProfileFromTextSamples('A'); // Just a simple profile without any marker.

src/test/components/__snapshots__/MarkerChart.test.tsx.snap

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,20 @@ exports[`MarkerChart context menus displays when right clicking on a marker 1`]
133133
<div
134134
class="react-contextmenu-separator"
135135
/>
136+
<div
137+
aria-disabled="false"
138+
class="react-contextmenu-item"
139+
role="menuitem"
140+
tabindex="-1"
141+
>
142+
<span
143+
class="react-contextmenu-icon markerContextMenuIconOverrideZeroAtMarkerStart"
144+
/>
145+
Override zero at marker’s start
146+
</div>
147+
<div
148+
class="react-contextmenu-separator"
149+
/>
136150
<div
137151
aria-disabled="false"
138152
class="react-contextmenu-item"

src/types/actions.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,10 @@ type UrlStateAction =
550550
readonly type: 'CHANGE_MOUSE_TIME_POSITION';
551551
readonly mouseTimePosition: Milliseconds | null;
552552
}
553+
| {
554+
readonly type: 'OVERRIDE_ZERO_AT';
555+
readonly zeroAt: Milliseconds | null;
556+
}
553557
| {
554558
readonly type: 'CHANGE_TABLE_VIEW_OPTIONS';
555559
readonly tab: TabSlug;

src/types/state.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ export type ProfileViewState = {
103103
hoveredMarker: MarkerReference | null;
104104
mouseTimePosition: Milliseconds | null;
105105
perTab: TableViewOptionsPerTab;
106+
overrideZeroAt: number | null;
106107
};
107108
readonly profile: Profile | null;
108109
globalTracks: GlobalTrack[];

0 commit comments

Comments
 (0)