profile
viewpoint
Nazım Can Altınova canova @mozilla Berlin, Germany https://canova.dev

canova/interpreter 3

Toy Interpreter Written in Rust

canova/addon-sdk 0

The Add-on SDK repository.

canova/android-components 0

A collection of Android libraries to build browsers or browser-like applications.

canova/bedrock 0

Making mozilla.org awesome, one pebble at a time

canova/brackets-autoprefixer 0

Brackets/Edge Code extension that parses CSS documents and add vendor prefixes automatically.

canova/brackets-extension-rating 0

Brackets extension used to display other extensions rating

canova/brackets-html-skeleton 0

Easily insert a variety of HTML elements into your document

canova/Brackets-PHP-SmartHints 0

Trying to build a robust code hint/intelligence extension for PHP code in the Brackets editor

canova/brackets-snippets 0

A brackets snippets extension

PR opened firefox-devtools/profiler

Reviewers
Make sure that we disable the history replace state when we are done with it

Without a try..finally block, if fn throws an error, we won't be able to disable the replace state and it will always stay that way. So with a finally block, even though it throws something, at least we will be able to recover the replace state. There are 2 Outreachy onboarding PRs that are also using these functions. We discovered this while looking at them.

+10 -4

0 comment

1 changed file

pr created time in 10 hours

create barnchcanova/perf.html

branch : history-replace

created branch time in 10 hours

PullRequestReviewEvent

issue commentfirefox-devtools/profiler

zee-worker failing in tests for decompressing gzipped files using retrieveProfileFromFile

@Cheederah assigned to you. Let us know if you need anything!

gregtatum

comment created time in 15 hours

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

  /* See https://design.firefox.com/photon/components/message-bars.html */ .photon-message-bar {+  position: relative;

You can also undo this since we are not going to make the button absolute

lape15

comment created time in 18 hours

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

  /* See https://design.firefox.com/photon/components/message-bars.html */ .photon-message-bar {+  position: relative;   display: flex;   min-height: 32px;   box-sizing: border-box;-  align-items: center;+  flex-wrap: wrap;    /* Note: 32px is: 4px (left padding for the message bar) + 4px (left padding    * for the icon) + 16px (icon width) + 4px (right padding for the icon) + 4px    * (space between icon and text) */-  padding: 4px 4px 4px 32px;+  padding: 4px 24px 4px 32px;

We don't need this either.

lape15

comment created time in 18 hours

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

 /* This rule is useful only for message bars that have a close button but no  * action button. */ .photon-message-bar-inner-content {+  min-width: 200px;

We don't need this.

lape15

comment created time in 18 hours

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Issue 2986 - Task1: Marker tooltip and sidebar should make it clear when a stack comes from another thread

 export type MarkerSchemaByName = ObjectMap<MarkerSchema>;  * start and end time.  */ export type CauseBacktrace = {|+  tid: Tid,

We should make this optional (tid?:), because this tid value won't be present for older uploaded profiles. We don't have the data to add an upgrader for that. So the best solution is to make it optional. Also it would be good to add a comment that explains this. Something like this should be good:

// `tid` is optional because older processed profiles may not have it.
// No upgrader was written for this change.
anap226

comment created time in 20 hours

Pull request review commentfirefox-devtools/profiler

Issue 2986 - Task1: Marker tooltip and sidebar should make it clear when a stack comes from another thread

 function _mutateProfileToEnsureCauseBacktraces(profile) {             syncProfile.samples.data[0][syncProfile.samples.schema.time];           if (stackIndex !== null) {             marker.cause = {+              tid: syncProfile.tid,

So here, we shouldn't add the tid because we don't touch the old profile upgraders. They are created in the past to move the old profile structure to the new version. But in that time, we didn't have the tid. So tid are not going to be there anyway. Can you please undo this line and the comment below?

anap226

comment created time in 21 hours

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Issue 2986 - Task1: Marker tooltip and sidebar should make it clear when a stack comes from another thread

 function _processStackTable(  /**  * Convert stack field to cause field for the given payload. A cause field includes- * both an IndexIntoStackTable, and the time the stack was captured. If the stack- * was captured within the the start and end time of the marker, this was a synchronous- * stack. Otherwise, if it happened before, it was an async stack, and is most likely- * some event that happened in the past that triggered the marker.+ * the thread ID (tid), an IndexIntoStackTable, and the time the stack was captured.+ * If the stack was captured within the start and end time of the marker, this was a+ * synchronous stack. Otherwise, if it happened before, it was an async stack, and is+ * most likely some event that happened in the past that triggered the marker.

Thanks for updating the comment as well!

anap226

comment created time in 21 hours

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Fixing popState and UrlState management for dragging/dropping files

 export function retrieveProfileFromFile(               throw new Error('Unable to parse the profile.');             } -            await dispatch(viewProfile(profile));+            await withHistoryReplaceStateSync(() => {

We don't need to await here because withHistoryReplaceStateSync is a sync method. We could possibly use the async one here but it doesn't seem like the good choice because that actually waits until the end of the symbolication and therefore waits even after the profile view is ready. That makes stuff a lot more error prone because it's going to still be in the replace state even after profile view is ready.

So, we can just remove this await from here and keep using withHistoryReplaceStateSync :)

Cheederah

comment created time in 2 days

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Including screenshots in the profile comparison view

 function mergeMarkers(    return { markerTable: newMarkerTable, translationMaps }; }++/**+ * Merge screenshot markers from different threads. And update the target threads string table while doing it.+ */+function mergeScreenshotMarkers(+  threads: Thread[],+  targetThread: Thread+): {+  markerTable: RawMarkerTable,+  translationMaps: TranslationMapForMarkers[],+} {+  const targetMarkerTable = { ...targetThread.markers };+  const translationMaps = [];++  threads.forEach(thread => {+    if (thread.name === 'Compositor') {

Btw, it would be better if we change this if to something more generic instead of hardcoding Compositor thread name here. The thread of screenshot markers is an implementation detail inside the Firefox. So someone can decide to put these markers inside another thread in the future. This check won't work in that case. We can replace it with this instead: https://github.com/firefox-devtools/profiler/blob/510a546b4f4903d5987c575ace0fb5a50adadaf2/src/profile-logic/tracks.js#L365

CipherGirl

comment created time in 2 days

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Including screenshots in the profile comparison view

 function mergeMarkers(    return { markerTable: newMarkerTable, translationMaps }; }++/**+ * Merge screenshot markers from different threads. And update the target threads string table while doing it.+ */+function mergeScreenshotMarkers(+  threads: Thread[],+  targetThread: Thread+): {+  markerTable: RawMarkerTable,+  translationMaps: TranslationMapForMarkers[],+} {+  const targetMarkerTable = { ...targetThread.markers };+  const translationMaps = [];++  threads.forEach(thread => {+    if (thread.name === 'Compositor') {+      const translationMap = new Map();+      const { markers, stringTable } = thread;++      for (let markerIndex = 0; markerIndex < markers.length; markerIndex++) {+        // We need to move the url string to the new string table if doesn't exist.+        if (+          markers.data[markerIndex] !== null &&+          markers.data[markerIndex].type === 'CompositorScreenshot'+        ) {+          const urlIndex = markers.data[markerIndex].url;+          const newUrl = urlIndex >= 0 ? stringTable.getString(urlIndex) : null;++          // Move compositorScreenshot marker data to the new marker table.+          const compositorScreenshotMarkerData = {+            ...markers.data[markerIndex],

Nice! It's great that you actually didn't mutate the old marker data, and shallow copied to a new object instead!

CipherGirl

comment created time in 2 days

PullRequestReviewEvent
PullRequestReviewEvent

pull request commentfirefox-devtools/profiler

Including screenshots in the profile comparison view

Translation maps are being constructed so we can map the previous index to new index in case we need this information somewhere. Probably we don't need it for this work, but it's still good to keep it as a rule of thumb.

There is a failing check by codecov, I don't understand much of it. Can you explain how this works, and why it's failing in this patch?

Codecov is checking the code coverage in the PR. Since you added a new function, ideally we should test it, so we can make sure that it's correct. But we can focus on the testing once we are done with the implementation.

So for the screenshot tracks, in this place we are checking the screenshot markers and then create a screenshot track if we find any: https://github.com/firefox-devtools/profiler/blob/510a546b4f4903d5987c575ace0fb5a50adadaf2/src/profile-logic/tracks.js#L363-L381

So in this place, this if check is returning false all the time: https://github.com/firefox-devtools/profiler/blob/510a546b4f4903d5987c575ace0fb5a50adadaf2/src/profile-logic/tracks.js#L365 That's because we are not copying the marker names correctly, like the mergeMarker function. Since marker names are also inside the stringTable, we should also copy the names to the new thread's string table like you did for the url field: https://github.com/firefox-devtools/profiler/blob/510a546b4f4903d5987c575ace0fb5a50adadaf2/src/profile-logic/merge-compare.js#L1083-L1085

CipherGirl

comment created time in 2 days

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Navigate and zoom the flamegraph just by (double) clicking #969

 class FlameGraphCanvas extends React.PureComponent<Props> {         const startTime = stackTiming.start[i];         const endTime = stackTiming.end[i]; -        const x: CssPixels = startTime * containerWidth;+        const x: CssPixels = startTime + containerWidth;         const y: CssPixels =-          (maxStackDepth - depth - 1) * ROW_HEIGHT - viewportTop;-        const w: CssPixels = (endTime - startTime) * containerWidth;+          (maxStackDepth + depth + 1) * ROW_HEIGHT - viewportTop;+        const w: CssPixels = (endTime + startTime) * containerWidth;

I don't see these errors anymore but I see this:

Error ------------------------------------------------------------------ src/components/flame-graph/FlameGraph.js:288:11

Cannot create `FlameGraphCanvas` element because `ThunkAction` [1] is incompatible with undefined [2] in the return
value of property `chartProps.updatePreviewSelection`.

   src/components/flame-graph/FlameGraph.js:288:11
                   v----------------
    288|           <FlameGraphCanvas
    289|             key={threadsKey}
    290|             // ChartViewport props
    291|             viewportProps={{
    292|               timeRange,
    293|               maxViewportHeight,
    294|               maximumZoom: 1,
    295|               previewSelection,
    296|               startsAtBottom: true,
    297|               disableHorizontalMovement: true,
    298|               viewportNeedsUpdate,
    299|               marginLeft: 0,
    300|               marginRight: 0,
    301|               containerRef: this._takeViewportRef,
    302|             }}
       :
    315|               categories,
    316|               selectedCallNodeIndex,
    317|               scrollToSelectionGeneration,
    318|               callTreeSummaryStrategy,
    319|               stackFrameHeight: STACK_FRAME_HEIGHT,
    320|               onSelectionChange: this._onSelectedCallNodeChange,
    321|               onRightClick: this._onRightClickedCallNodeChange,
    322|               shouldDisplayTooltips: this._shouldDisplayTooltips,
    323|               interval,
    324|               isInverted,
    325|               samples,
    326|               unfilteredSamples,
    327|               tracedTiming,
    328|             }}
    329|           />
                   -^

References:
   src/actions/profile-view.js:1277:4
   1277| ): ThunkAction<void> {
            ^^^^^^^^^^^^^^^^^ [1]
   src/actions/profile-view.js:1277:16
   1277| ): ThunkAction<void> {
                        ^^^^ [2]

That's because you added a new updatePreviewSelection prop but didn't send that prop to the component where we render this canvas component. You also need to pass this prop so you can use it there. Also good to note that I didn't check if this is the right solution. I only looked at the flow error.

codershona

comment created time in 3 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Fixing popState and UrlState management for dragging/dropping files

 class UrlManagerImpl extends React.PureComponent<Props> {       if (!getIsHistoryReplaceState()) {         // Push the URL state only when the url setup is done, and we haven't set         // a flag to only replace the state.+

Could you also undo this change?

Cheederah

comment created time in 3 days

PullRequestReviewEvent
PullRequestReviewEvent

push eventfirefox-devtools/profiler

burianovata

commit sha 4bf219bb298060ff57e22b59a148b584805970d6

Expose profile.meta.logicalCPUs and profile.meta.physicalCPUs in the UI (PR #2927)

view details

push time in 3 days

issue closedfirefox-devtools/profiler

Expose profile.meta.logicalCPUs and profile.meta.physicalCPUs in the UI

We have some information about the number of CPU cores in the profile. It would be nice to display this information in the profile info popup.

closed time in 3 days

mstange
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

   line-height: 1.4; } +.multi-line {+  width: 300px;

We really don't have to add a class at all :) See my comment below on how to do this.

lape15

comment created time in 4 days

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

 <h3 class='photon-title-20'>Photon Message Bar Generic</h3>             aria-label="Hide the message" title="Hide the message">           </button>         </div>+        <div class="photon-message-bar multi-line">+        This is a dismissable message bar.+       <button class="photon-button photon-message-bar-close-button" type="button"+          aria-label="Hide the message" title="Hide the message">+        </button>+        <button class="photon-button photon-button-micro photon-message-bar-action-button" type="button">+          Call to action+        </button>+    </div>

Btw, the indentation of the divs and buttons don't look correct to me. Could you fix it?

lape15

comment created time in 4 days

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

 <h3 class='photon-title-20'>Photon Message Bar Generic</h3>             aria-label="Hide the message" title="Hide the message">           </button>         </div>+        <div class="photon-message-bar multi-line">

We shouldn't add a new class name for this. We can do it by wrapping this <div class="photon-message-bar"> with a <div style="width: 300px;"> instead. We should do this since we don't want to add a multi-line class on our other components as well.

lape15

comment created time in 4 days

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

   line-height: 1.4; } +.multi-line {+  width: 300px;+}+ .photon-message-bar-action-button {   flex: none;-  margin: 0 8px;+  margin: 2px 0;

I don't think we should change this one. Is there a specific reason to do this?

lape15

comment created time in 4 days

PullRequestReviewEvent
PullRequestReviewEvent

pull request commentfirefox-devtools/profiler

Implement new animation for commiting selection range (Issue #1140)

So I'm redirecting that review to Julien because I don't have a strong opinion on the transition.

mariehposa

comment created time in 4 days

Pull request review commentfirefox-devtools/profiler

Fixing popState and UrlState management for dragging/dropping files

 class UrlManagerImpl extends React.PureComponent<Props> {       if (!getIsHistoryReplaceState()) {         // Push the URL state only when the url setup is done, and we haven't set         // a flag to only replace the state.-        window.history.pushState(urlState, document.title, newUrl);+        const result = newUrl.split('&');+        if (result[1] !== 'v=5') {

Unfortunately, that doesn't look correct. We have v=5 in the url to indicate the url version. See: https://github.com/firefox-devtools/profiler/blob/b3143cfdd9f771fb63b00abeb8e638f2f43c2556/src/app-logic/url-handling.js#L38 It's possible to change in the future since we are incrementing that whenever we have a change in the url strucure. So this will not work when we upgrade the url. Also checking v=5 doesn't seem like the correct way to fix the solution even though the url version was going to stay 5 all the time. Another "valid" url can very well have the same string. Instead of doing this, we should maybe try to figure out "when" and "where" we are adding this invalid url to the history. So maybe we can eliminate updating the history overall.

Cheederah

comment created time in 7 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Issue #1119 Move non-generic css out of res/style.css (Part-3 / Move for TreeView Component)

+/* This Source Code Form is subject to the terms of the Mozilla Public+ * License, v. 2.0. If a copy of the MPL was not distributed with this+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */++.treeView {+  display: flex;+  flex: 1;+  flex-flow: column nowrap;+  border-top: 1px solid var(--grey-30);+  cursor: default;+  -webkit-user-select: none;+  user-select: none;+}++.treeViewHeader {+  position: relative;+  height: 16px;+  padding: 1px 0;+  border-bottom: 1px solid var(--grey-30);+  background: white;+}++.treeViewHeaderMainColumn {+  flex: 1;+}++.treeViewContextMenu {+  display: flex;+  flex: 1;+}+.treeViewBody {+  position: relative;+  z-index: 0;+  overflow: auto;+  flex: 1;+  line-height: 16px;+  outline: 0;+  will-change: scroll-position;+}++.treeViewBodyInnerWrapper {+  position: absolute;+  top: 0;+  left: 0;+  display: flex;+  min-width: 100%;+  flex-flow: row nowrap;+}++.treeViewBodyInner0 {+  position: sticky;+  z-index: 2;+  left: 0;+}++.treeViewBodyInner1 {+  /* This allows the right column to expand more than its content, so that the+   * background always extends to the right edge. */+  flex-grow: 1;+}++.treeViewBodyInner {+  overflow: hidden;+  background: white;+}++.treeViewRow {+  display: flex;+  flex-flow: row nowrap;+  align-items: center;+  justify-content: flex-start;+  white-space: nowrap;+}++.treeViewHeaderColumn {+  position: absolute;+  top: 0;+  bottom: 0;+  box-sizing: border-box;+  padding: 1px 5px;+  line-height: 15px;+  white-space: nowrap;+}+.treeViewHeaderColumn.treeViewFixedColumn::after {+  position: absolute;+  top: 3px;+  right: 0;+  bottom: 3px;+  width: 1px;+  background: #e5e5e5;+  content: '';+}+.treeViewHeaderColumn.total,+.treeViewHeaderColumn.self {+  text-align: right;+}+.treeViewRowColumn.treeViewFixedColumn {+  overflow: hidden;+  box-sizing: border-box;+  border-right: 1px solid var(--grey-30);+  text-overflow: ellipsis;+}+.treeViewFixedColumn.total {+  left: 0;+  width: 70px;+}+.treeViewFixedColumn.totalPercent {+  left: 70px;+  width: 50px;+  border-right: none;+}+.treeViewFixedColumn.self {+  left: 120px;+  width: 70px;+}+.treeViewHeaderColumn.total {+  width: 120px;+}+.treeViewFixedColumn.icon {+  left: 190px;+  display: flex;+  width: 19px;+  flex-flow: column nowrap;+  align-items: center;+}+.treeViewRowColumn.total,+.treeViewRowColumn.totalPercent,+.treeViewRowColumn.self,+.treeViewRowColumn.timestamp {+  padding-right: 5px;+  text-align: right;+}+.treeViewRowColumn.type {+  padding-left: 5px;+  text-align: left;+}++.treeRowIndentSpacer {+  flex-shrink: 0;+}++.treeViewAppendageColumn {+  margin-left: 10px;+  opacity: 0.6;+}++.treeViewRow.even {+  background-color: #fff;+}+.treeViewRow.odd {+  background-color: #f5f5f5;+}++/* Note that `isRightClicked` is present before `isSelected` so that it can be overriden. */+.treeViewRow.isRightClicked {+  background-color: var(--blue-50-a30);+}+.treeViewRow.isSelected {+  background-color: var(--grey-30);+  color: black;+}+.treeViewRow.dim > .treeViewMainColumn {+  opacity: 0.7;+}+.treeViewBody:focus .treeViewRow.isSelected {+  background-color: highlight;+  color: highlighttext;+}+.treeViewBody:focus .treeViewRow.isSelected a {+  color: inherit;+}++.treeViewHighlighting {+  padding: 1px 0;++  /* This negative margin enlarges the background to the top, so that it fully+   * covers the underlying background. There's an underlying background when the+   * line is selected. */+  margin: -1px 0;+  background: #cbe8fe;+  border-radius: 2px;+  box-shadow: 0 0 0 0.5px rgba(0, 0, 0, 0.05), 0 1px 1px rgba(0, 0, 0, 0.3);+  color: #000;+}++.treeRowToggleButton {+  width: 0;+  height: 0;+  border-top: 5px solid transparent;+  border-right: 4px solid transparent;+  border-bottom: 5px solid transparent;+  border-left: 8px solid;+  margin-left: 8px;+  color: #888;+}++.treeRowToggleButton.expanded {+  border-top: 8px solid;+  border-right: 5px solid transparent;+  border-bottom: 4px solid transparent;+  border-left: 5px solid transparent;+  margin-top: 5px;+  margin-right: 5px;+  margin-left: 5px;+}++.treeRowToggleButton:active:hover {+  color: var(--grey-60);+}++.treeViewBody:focus .treeViewRow.isSelected > .treeRowToggleButton {+  color: #fff;+}++.treeViewBody:focus+  .treeViewRow.isSelected+  > .treeRowToggleButton:active:hover {+  color: rgba(255, 255, 255, 0.7);+}++.treeRowToggleButton.leaf {+  visibility: hidden;+}++.treeAndSidebarWrapper {

This class belongs to ProfileCallTreeView component which is outside of TreeView. Could you move this back?

aintabb

comment created time in 7 days

Pull request review commentfirefox-devtools/profiler

Issue #1119 Move non-generic css out of res/style.css (Part-3 / Move for TreeView Component)

+/* This Source Code Form is subject to the terms of the Mozilla Public+ * License, v. 2.0. If a copy of the MPL was not distributed with this+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */++.treeView {+  display: flex;+  flex: 1;+  flex-flow: column nowrap;+  border-top: 1px solid var(--grey-30);+  cursor: default;+  -webkit-user-select: none;+  user-select: none;+}++.treeViewHeader {+  position: relative;+  height: 16px;+  padding: 1px 0;+  border-bottom: 1px solid var(--grey-30);+  background: white;+}++.treeViewHeaderMainColumn {+  flex: 1;+}++.treeViewContextMenu {+  display: flex;+  flex: 1;+}+.treeViewBody {+  position: relative;+  z-index: 0;+  overflow: auto;+  flex: 1;+  line-height: 16px;+  outline: 0;+  will-change: scroll-position;+}++.treeViewBodyInnerWrapper {+  position: absolute;+  top: 0;+  left: 0;+  display: flex;+  min-width: 100%;+  flex-flow: row nowrap;+}++.treeViewBodyInner0 {+  position: sticky;+  z-index: 2;+  left: 0;+}++.treeViewBodyInner1 {+  /* This allows the right column to expand more than its content, so that the+   * background always extends to the right edge. */+  flex-grow: 1;+}++.treeViewBodyInner {+  overflow: hidden;+  background: white;+}++.treeViewRow {+  display: flex;+  flex-flow: row nowrap;+  align-items: center;+  justify-content: flex-start;+  white-space: nowrap;+}++.treeViewHeaderColumn {+  position: absolute;+  top: 0;+  bottom: 0;+  box-sizing: border-box;+  padding: 1px 5px;+  line-height: 15px;+  white-space: nowrap;+}

Can you also add an empty line after this please? And I see a few more after, that would be also good to add after them as well. I guess some of them were also like that before, but we can fix them while we are here :)

aintabb

comment created time in 7 days

Pull request review commentfirefox-devtools/profiler

Issue #1119 Move non-generic css out of res/style.css (Part-3 / Move for TreeView Component)

+/* This Source Code Form is subject to the terms of the Mozilla Public+ * License, v. 2.0. If a copy of the MPL was not distributed with this+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */++.treeView {+  display: flex;+  flex: 1;+  flex-flow: column nowrap;+  border-top: 1px solid var(--grey-30);+  cursor: default;+  -webkit-user-select: none;+  user-select: none;+}++.treeViewHeader {+  position: relative;+  height: 16px;+  padding: 1px 0;+  border-bottom: 1px solid var(--grey-30);+  background: white;+}++.treeViewHeaderMainColumn {+  flex: 1;+}++.treeViewContextMenu {+  display: flex;+  flex: 1;+}

Can you add an empty line after this rule?

aintabb

comment created time in 7 days

Pull request review commentfirefox-devtools/profiler

Issue #1119 Move non-generic css out of res/style.css (Part-3 / Move for TreeView Component)

+/* This Source Code Form is subject to the terms of the Mozilla Public+ * License, v. 2.0. If a copy of the MPL was not distributed with this+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */++.nodeIcon {+  min-width: 14px;+  height: 100%;+  min-height: 14px;+  background: center / contain no-repeat;+}

It looks like these changes belong to your previous PR. It's landed already, so we shouldn't see them here anymore. That would be better if you can open new branch from main instead of your previous branch. So that way we can only see the relevant commits. That can cause some merge conflicts after the previous ones are merged but we need to fix them anyway :)

aintabb

comment created time in 7 days

PullRequestReviewEvent
PullRequestReviewEvent

push eventfirefox-devtools/profiler

Riju19

commit sha cd7ad293e58098e4e19e78a2e464e31db14056b3

Optimise max depth computation

view details

Riju19

commit sha fa062221d64cbcee9d4059764858727b7ac7dfad

Fix minor typographical nits in call-tree.md

view details

Nazım Can Altınova

commit sha 01b1dbd10305fbef51fee985fc031ec287cdf3ef

Merge branch 'main' into optimize-max-depth

view details

Nazım Can Altınova

commit sha 0eae882b7df04d9d5049207ae59665a18b2d1814

Optimise max depth computation (PR #2984)

view details

push time in 7 days

PR merged firefox-devtools/profiler

Optimise max depth computation

This pull request is to simplify and optimise max depth computation. Fixes #982

+9 -16

3 comments

2 changed files

Riju19

pr closed time in 7 days

issue closedfirefox-devtools/profiler

Computing the max depth could be simpler and faster

this code: https://github.com/devtools-html/perf.html/blob/a60e54d082e285ed6760ff97b1b756c3f3cb8052/src/profile-logic/profile-data.js#L783-L802

could easily be transformed into something like:

return Math.max(...callNodeTable.depth) + 1;

The role of this bug is:

  • check that the result is actually the same
  • try to profile to see if there's a perf difference

closed time in 7 days

julienw
PullRequestReviewEvent

push eventRiju19/profiler

burianovata

commit sha 24e3cde7df425e60e88c07c60c2e0c8039039fd2

Change CSS loads that use `require` to `import` in src/components/stack-chart/ (PR #2950)

view details

Nazım Can Altınova

commit sha 01b1dbd10305fbef51fee985fc031ec287cdf3ef

Merge branch 'main' into optimize-max-depth

view details

push time in 7 days

push eventfirefox-devtools/profiler

burianovata

commit sha 24e3cde7df425e60e88c07c60c2e0c8039039fd2

Change CSS loads that use `require` to `import` in src/components/stack-chart/ (PR #2950)

view details

push time in 7 days

PR merged firefox-devtools/profiler

Change CSS loads that use `require` to `import` in src/components/stack-chart/

Fixes (part of) #2922 in src/components/stack-chart/

+2 -2

3 comments

2 changed files

burianovata

pr closed time in 7 days

PullRequestReviewEvent

pull request commentfirefox-devtools/profiler

Including screenshots in the profile comparison view

I added a comment with more information. Removing the review request for now. Let me know if you have questions!

CipherGirl

comment created time in 7 days

Pull request review commentfirefox-devtools/profiler

Including screenshots in the profile comparison view

 export function mergeProfilesForDiffing(       );     }     const profile = profiles[i];-    let thread = profile.threads[selectedThreadIndex];+    let thread = { ...profile.threads[selectedThreadIndex] };     transformStacks[i] = profileSpecific.transforms[selectedThreadIndex];     implementationFilters.push(profileSpecific.implementation);      // We adjust the categories using the maps computed above.     // TODO issue #2151: Also adjust subcategories.-    thread.stackTable.category = adjustCategories(-      thread.stackTable.category,-      translationMapsForCategories[i]-    );-    thread.frameTable.category = adjustNullableCategories(-      thread.frameTable.category,-      translationMapsForCategories[i]+    thread.stackTable = {+      ...thread.stackTable,+      category: adjustCategories(+        thread.stackTable.category,+        translationMapsForCategories[i]+      ),+    };+    thread.frameTable = {+      ...thread.frameTable,+      category: adjustNullableCategories(+        thread.frameTable.category,+        translationMapsForCategories[i]+      ),+    };++    const screenshotMarker = profile.threads.filter(+      t => t.name === 'Compositor'+    )[0].markers;++    const compositorScreenshot = screenshotMarker.data.filter(+      d => d !== null && d.type === 'CompositorScreenshot'     ); +    /*+    const mergeScreenshot = { ...thread.markers, ...screenshotMarker };+    thread.markers = mergeScreenshot;+    */++    Array.prototype.push.apply(thread.markers.data, screenshotMarker.data);

So right now it looks like we are pushing the data of screenshot markers to data of the thread we would like to send. But here, we would also push the name, startTime, endTime, phase, and category. That will pretty much going to look like mergeMarkers in the end actually. I think you can reuse some of its code on your own function.

So I think we can to create a function called mergeScreenshotMarkers. That will be pretty similar for mergeMarkers but it will be more specific to screenshots. We can't use that directly because apparently it will not for that.

I think I mentioned before, url field of the screenshot string is not the url string, it's only an index into the stringTable. So we need to get that string from old stringTable and copy it into the new one. To do that, you can take a look at the current code for marker "name"s. They are also index into string tables, and we need to copy them as well like this: https://github.com/firefox-devtools/profiler/blob/319253c5757a85737f813866e63540c7426f4be5/src/profile-logic/merge-compare.js#L1078-L1079 getString adds the string if it's not present in the stringTable already. And here we get the new stringTable index: https://github.com/firefox-devtools/profiler/blob/319253c5757a85737f813866e63540c7426f4be5/src/profile-logic/merge-compare.js#L1084 So we need to do the exact same thing, but for data.url of screenshot markers.

Hope that helps! Let me know if you have any questions!

CipherGirl

comment created time in 7 days

PullRequestReviewEvent

push eventfirefox-devtools/profiler

Yunus Emre Ozvarlik

commit sha ada7782f25ba67c72d5fdd525d2430ab6118f2df

Move non-generic css out of res/style.css (Part-2 / Move for Icon Component) (PR #2991) Co-authored-by: Nazım Can Altınova <466239+canova@users.noreply.github.com>

view details

push time in 7 days

PR merged firefox-devtools/profiler

Issue #1119 Move non-generic css out of res/style.css (Part-2 / Move for Icon Component)

(Issue-1119) I have created a new css file, "Icon.css" and moved the "Icon" component related styling code, out of the style.css to new Icon.css file. As far I can see, Only dependent selector was ".nodeIcon" and I moved it.

Please review @canova , @gregtatum

+12 -7

2 comments

3 changed files

aintabb

pr closed time in 7 days

push eventaintabb/profiler

CipherGirl

commit sha c31ec33b76edfb045710d144589ae42b07e2d647

Comparison view big root range fixed

view details

CipherGirl

commit sha 2602303e47a552f91d1b87c8125dd32d5a65d9d5

Added tests for initial rootRange

view details

CipherGirl

commit sha d0286dc42b4a7a1e54f16b07334879bfa635ddc0

Removed unused variables

view details

Hasna Hena Mow

commit sha 99555230cc019b80f7571e64b083413374316bef

Merge branch 'main' into Issue#2470-Big-Root-Range

view details

Hasna Hena Mow

commit sha e0512339f8d9068276da5e00e007f33cff805960

Merge branch 'main' into Issue#2470-Big-Root-Range

view details

depfu[bot]

commit sha 81055516b7eec0560d329970be61cbfe24441a48

⬆️ Update all of react to version 16.14.0 (PR #2990) Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>

view details

Julien Wajsberg

commit sha 319253c5757a85737f813866e63540c7426f4be5

Fix a wrong computation of the root range in the comparison view, in some situations (Merge PR #2941) Fixes #2470

view details

Segun Ogundipe

commit sha 5e118fe3e3c168c81ab225a804fc9002c38e5935

Extract ThreadActivityGraph canvas drawing to a separate pure component (PR #2907) Co-authored-by: Nazım Can Altınova <466239+canova@users.noreply.github.com>

view details

nibble0101

commit sha 404085abe4fa72b0e8a9861393eda2612ee20db8

switched to a new branch as requested by @julienw

view details

Joseph Mawa

commit sha f48005c1a1615a205fe4cc4e57cd658ff1a2187b

Merge branch 'main' into create-range-selection

view details

Abir

commit sha 400be4b3ac93d69ac54e281b1ae9e2abf6bd3516

In Icon.js, moved the code of componentWillReceiveProps to componentDidUpdate (PR #2937) Part of #1006

view details

Qandeel Mya

commit sha 9abf9c80c5f9300480ecfa70f7db616eff290be3

Zipprofileviewer componentdidupdate (PR #2930) Co-authored-by: Nazım Can Altınova <466239+canova@users.noreply.github.com>

view details

Julien Wajsberg

commit sha ad15fb27b3f63498b91a0cc5a82edeacaf7fa26e

Simplify the test further

view details

Julien Wajsberg

commit sha a4d621c25457cbbbf49bc799c1fca6e75cd170a2

Create range selection by clicking a screenshot (Merge PR #2940) Fixes #2634.

view details

Nazım Can Altınova

commit sha 6933274d5df8d3d1deca6f4a04b7e5f3b11cbbd7

Merge branch 'main' into issue/1119-move-non-generic-css-out-of-res-style-css

view details

push time in 7 days

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Optimise max depth computation

 exports[`FlameGraph EmptyReasons shows reasons when a profile has no samples 1`] </div> `; -exports[`FlameGraph EmptyReasons shows reasons when samples are out of range 1`] = `-<div-  class="EmptyReasons"->-  <h3>-    The -    flame graph-     is empty for “-    Empty-    ”-  </h3>-  <p>-    Broaden the selected range to view samples.-  </p>-</div>-`;+exports[`FlameGraph EmptyReasons shows reasons when samples are out of range 1`] = `null`;

These snapshot changes indicate that there is a problem in the change. Because it looks like we are not properly indicating the empty thread with EmptyReasons properly for flame graph and stack chart.

Riju19

comment created time in 8 days

Pull request review commentfirefox-devtools/profiler

Optimise max depth computation

 export function convertStackToCallNodePath(  *  * If no samples are found, 0 is returned.  */-export function computeCallNodeMaxDepth(-  thread: Thread,-  callNodeInfo: CallNodeInfo-): number {-  let maxDepth = 0;-  const { samples } = thread;-  const { callNodeTable, stackIndexToCallNodeIndex } = callNodeInfo;-  for (let i = 0; i < samples.length; i++) {-    const stackIndex = samples.stack[i];-    if (stackIndex !== null) {-      const callNodeIndex = stackIndexToCallNodeIndex[stackIndex];-      // Change to one-based depth-      const depth = callNodeTable.depth[callNodeIndex] + 1;-      if (depth > maxDepth) {-        maxDepth = depth;-      }-    }-  }-  return maxDepth;+export function computeCallNodeMaxDepth(callNodeInfo: CallNodeInfo): number {+  if (callNodeInfo.callNodeTable.depth.length === 0) return 0;

Thanks for checking this edge case!

On the other hand, we try to avoid adding if blocks without brackets in the project. Because it's mostly hard to read and easy to make something wrong with these type of ifs :) Can you please add brackets that contain return 0;?

Riju19

comment created time in 8 days

Pull request review commentfirefox-devtools/profiler

Optimise max depth computation

 A call tree is a summary representation of sample and stack data. It adds togeth   E    G ``` -In this case the profiler took 3 samples, each 1 millisecond apart. Visualizing profile information in this form doesn't scale when you have thousands of samples, so it's best to summarize this information. The call tree does this by starting at the root of all the samples, and looks at the functions called. If the functions are the same, then they are combined into a single node. After evaluating the first depth of the stack, the second level is evaluated. If any of the samples do not the same function at the second depth, then the tree is split into multiple nodes, one for each function. This branching continues until all levels of the samples' stacks have been evaluated. Taking the above samples and the corresponding relationship between the stacks would produce the following tree. One special thing to note here is the function F has been called multiple times, but has different positions in the 2nd and 3rd callstacks.+In this case the profiler took 3 samples, each 1 millisecond apart. Visualizing profile information in this form doesn't scale when you have thousands of samples, so it's best to summarize this information. The call tree does this by starting at the root of all the samples, and looks at the functions called. If the functions are the same, then they are combined into a single node. After evaluating the first depth of the stack, the second level is evaluated. If any of the samples do not call the same function at the second depth, then the tree is split into multiple nodes, one for each function. This branching continues until all levels of the samples' stacks have been evaluated. Taking the above samples and the corresponding relationship between the stacks would produce the following tree. One special thing to note here is the function F has been called multiple times, but has different positions in the 2nd and 3rd callstacks.

It's fine to keep these in this PR for now, but in the following issues it would be good to at least move these document related fixes to another commit. It's good to create commits that do only one thing.

Riju19

comment created time in 8 days

PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Better style the message bars when the available space forces multili…

 <h3 class='photon-title-20'>Photon Message Bar Generic</h3>             aria-label="Hide the message" title="Hide the message">           </button>         </div>+        <div class="photon-message-bar sized-to-content">+          <div class="child-section">

So this fix involves an additional div here. But we are not using that div anywhere in the codebase. Ideally we should be able to find a solution that doesn't involve an additional div. Would you mind trying to figure out a solution that doesn't involve this?

lape15

comment created time in 8 days

PullRequestReviewEvent
PullRequestReviewEvent

push eventfirefox-devtools/profiler

Qandeel Mya

commit sha 9abf9c80c5f9300480ecfa70f7db616eff290be3

Zipprofileviewer componentdidupdate (PR #2930) Co-authored-by: Nazım Can Altınova <466239+canova@users.noreply.github.com>

view details

push time in 8 days

PR merged firefox-devtools/profiler

Zipprofileviewer componentdidupdate

hi @julienw! I have worked on this "src/components/app/ZipFileViewer.js (claimed by @qmya) Probably can be moved to componentDidUpdate" :) Could you merge it :)

Part of #1006

+2 -5

2 comments

1 changed file

qmya

pr closed time in 8 days

push eventqmya/profiler

Abir

commit sha 400be4b3ac93d69ac54e281b1ae9e2abf6bd3516

In Icon.js, moved the code of componentWillReceiveProps to componentDidUpdate (PR #2937) Part of #1006

view details

Nazım Can Altınova

commit sha f046373749111bb7f937c5a24f489634a559e6e7

Merge branch 'main' into zipprofileviewer-componentdidupdate

view details

push time in 8 days

push eventqmya/profiler

CipherGirl

commit sha c31ec33b76edfb045710d144589ae42b07e2d647

Comparison view big root range fixed

view details

CipherGirl

commit sha 2602303e47a552f91d1b87c8125dd32d5a65d9d5

Added tests for initial rootRange

view details

CipherGirl

commit sha d0286dc42b4a7a1e54f16b07334879bfa635ddc0

Removed unused variables

view details

Hasna Hena Mow

commit sha 99555230cc019b80f7571e64b083413374316bef

Merge branch 'main' into Issue#2470-Big-Root-Range

view details

Hasna Hena Mow

commit sha e0512339f8d9068276da5e00e007f33cff805960

Merge branch 'main' into Issue#2470-Big-Root-Range

view details

depfu[bot]

commit sha 81055516b7eec0560d329970be61cbfe24441a48

⬆️ Update all of react to version 16.14.0 (PR #2990) Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>

view details

Julien Wajsberg

commit sha 319253c5757a85737f813866e63540c7426f4be5

Fix a wrong computation of the root range in the comparison view, in some situations (Merge PR #2941) Fixes #2470

view details

Segun Ogundipe

commit sha 5e118fe3e3c168c81ab225a804fc9002c38e5935

Extract ThreadActivityGraph canvas drawing to a separate pure component (PR #2907) Co-authored-by: Nazım Can Altınova <466239+canova@users.noreply.github.com>

view details

Nazım Can Altınova

commit sha b78a1934c94018efa9ad2982270b8c9f1b4444bc

Merge branch 'main' into zipprofileviewer-componentdidupdate

view details

push time in 8 days

PullRequestReviewEvent

Pull request review commentfirefox-devtools/profiler

Navigate and zoom the flamegraph just by (double) clicking #969

 // @flow  import React, { PureComponent } from 'react';-import { ContextMenuTrigger } from 'react-contextmenu';+import { ContextMenuTrigger as ReactContextMenuTrigger } from 'react-contextmenu'; -export default class MyContextMenuTrigger extends PureComponent<{}> {+export class ContextMenuTrigger extends PureComponent<{}> {   render() {-    return <ContextMenuTrigger holdToDisplay={-1} {...this.props} />;+    return <ReactContextMenuTrigger holdToDisplay={-1} {...this.props} />;

Also the changes in this file

codershona

comment created time in 8 days

Pull request review commentfirefox-devtools/profiler

Navigate and zoom the flamegraph just by (double) clicking #969

 export default explicitConnect<{||}, StateProps, DispatchProps>({     changeRightClickedCallNode,   },   options: { forwardRef: true },-  component: FlameGraph,+  component: FlameGraphImpl,

Also the changes in this file.

codershona

comment created time in 8 days

Pull request review commentfirefox-devtools/profiler

Navigate and zoom the flamegraph just by (double) clicking #969

 class FlameGraphCanvas extends React.PureComponent<Props> {         const startTime = stackTiming.start[i];         const endTime = stackTiming.end[i]; -        const x: CssPixels = startTime * containerWidth;+        const x: CssPixels = startTime + containerWidth;         const y: CssPixels =-          (maxStackDepth - depth - 1) * ROW_HEIGHT - viewportTop;-        const w: CssPixels = (endTime - startTime) * containerWidth;+          (maxStackDepth + depth + 1) * ROW_HEIGHT - viewportTop;+        const w: CssPixels = (endTime + startTime) * containerWidth;

Why did you have to change the computations of these x, y and w values? I don't think this is correct.

codershona

comment created time in 8 days

Pull request review commentfirefox-devtools/profiler

Navigate and zoom the flamegraph just by (double) clicking #969

 const MOUSE_CLICK_MAX_MOVEMENT_DELTA: CssPixels = 5;  // This isn't a PureComponent on purpose: we always want to update if the parent updates // But we still conditionally update the canvas itself, see componentDidUpdate.-export default class ChartCanvas<HoveredItem> extends React.Component<+export class ChartCanvas<HoveredItem> extends React.Component<

These changes don't belong to the PR. I think they are from other landed commits. Could you please rebase it on top of main branch?

codershona

comment created time in 8 days

PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent

push eventfirefox-devtools/profiler

Segun Ogundipe

commit sha 5e118fe3e3c168c81ab225a804fc9002c38e5935

Extract ThreadActivityGraph canvas drawing to a separate pure component (PR #2907) Co-authored-by: Nazım Can Altınova <466239+canova@users.noreply.github.com>

view details

push time in 8 days

PR merged firefox-devtools/profiler

Reviewers
Extract ThreadActivityGraph canvas drawing to a separate pure component #2499

Description

This fixes ThreadActivity canvas re-rendering on mouse hover

Fixes #2499

Type of change

  • [x] Bug fix (non-breaking change which fixes an issue)

Checklist:

  • [x] My code follows the style guidelines of this project
  • [x] My changes generate no new warnings
  • [x] Existing tests pass locally with my changes
+271 -198

3 comments

6 changed files

Segun-Ogundipe

pr closed time in 8 days

issue closedfirefox-devtools/profiler

Moving the mouse over the activity graph causes it to re-render

In a development build of the profiler, open the web console and then move your mouse around the thread activity graph. You can see lots of messages of the form

"ThreadActivityGraph render" took 3ms to execute.

being printed as you move the mouse.

closed time in 8 days

mstange

push eventSegun-Ogundipe/profiler

Salma Taha

commit sha c1dc5d0ba62528e5d68851d094073add13b12114

Edited loading in profiles section

view details

Salma Taha

commit sha 6c818979d2d3d4db251e66b95380e88f8139636b

Re-phrased as requested by reviewer

view details

CipherGirl

commit sha 5b453988883a1473beaac7fa77f1850e8bb210ad

Added mouseTimePosition actions, reducer, selector and tests

view details

CipherGirl

commit sha c82b33fa8c7230540e9f4e6bae7864eca026c907

Removed todo comments

view details

CipherGirl

commit sha ed8d6ea298db0bc05f27cc69640f8e5fd6c56138

Small changes

view details

CipherGirl

commit sha 28640b3d7382521da391be2fecfcaecbaae53764

Fixed test

view details

CipherGirl

commit sha 038adcda266cc695c49a6f27242562981ecfbec7

Test fix

view details

CipherGirl

commit sha 9a26e038601d20d6b106b669405c8ebc403f0bb8

Minor Edits

view details

Hasna Hena Mow

commit sha 6f2213f552760dbee2371ad54900bcdbe305b7b7

Merge branch 'main' into issue#222

view details

Julien Wajsberg

commit sha a43b21a12fab82d34294ff9e692b1d10995a664e

Add a mention to take care about the HTTP scheme on localhost

view details

Julien Wajsberg

commit sha f51790e41e39b2286b03030fa7b9c14ed830f51e

Correct a problem in how to enable the button

view details

CipherGirl

commit sha c31ec33b76edfb045710d144589ae42b07e2d647

Comparison view big root range fixed

view details

CipherGirl

commit sha 2602303e47a552f91d1b87c8125dd32d5a65d9d5

Added tests for initial rootRange

view details

CipherGirl

commit sha d0286dc42b4a7a1e54f16b07334879bfa635ddc0

Removed unused variables

view details

Akintan Lape

commit sha 721f8b3c95901d2cf48b6c8d6d43ff43ea2b562b

Warning for a non-release firefox build (PR #2966) Co-authored-by: Nazım Can Altınova <canaltinova@gmail.com>

view details

Hasna Hena Mow

commit sha 99555230cc019b80f7571e64b083413374316bef

Merge branch 'main' into Issue#2470-Big-Root-Range

view details

Hasna Hena Mow

commit sha 7abde849dcbd9964f4aed1249a4ba11b5d615266

Merge branch 'main' into issue#222

view details

Julien Wajsberg

commit sha c0b33f069024a529906a195a6af9b4a6e654b1be

Merge branch 'main' into 2847-loading-profiles-doc

view details

Julien Wajsberg

commit sha e5bd0fd0489070b9bcd242d90315db95a2008701

Edit loading in profiles section of CONTRIBUTING.md (Merge PR #2976) Fixes #2847

view details

Julien Wajsberg

commit sha 4d1193d0b94d53f61125499ac1025ab5b554b846

Added changeMouseTimePosition and getMouseTimePosition actions, reducer, selector and test (Merge PR #2917) This is part 1 of issue #222.

view details

push time in 8 days

PullRequestReviewEvent

issue commentfirefox-devtools/profiler

Show Responsivess xor BHR as hang markers

Also the selector Julien mention has been renamed to getTimelineJankMarkerIndexes.

digitarald

comment created time in 8 days

issue commentfirefox-devtools/profiler

Show Responsivess xor BHR as hang markers

Hi @mariehposa, assigning issue to you. Let us know if you need anything!

digitarald

comment created time in 8 days

issue commentfirefox-devtools/profiler

Make the selected row part of the URL, but use replaceState if it's the only thing that changes

Unassigning this issue because we realized it's not exactly an issue for Outreachy applicants. It's a lot more involved than we expected.

mstange

comment created time in 9 days

issue commentfirefox-devtools/profiler

Marker tooltip and sidebar should make it clear when a stack comes from another thread

Hi @mariehposa, sorry but I talked with @anap226 to assign that issue to them before you. Would you mind working on something else? I can try to find something for you tomorrow if you can find something to work on by then.

@anap226 I can assign the issue to you if you can leave a comment here (as per our conversation on chat.mozilla.org).

squelart

comment created time in 9 days

pull request commentfirefox-devtools/profiler

Change CSS loads that use `require` to `import` in src/components/stack-chart/

Hi @burianovata, how is it going? Do you still intend to finish that?

burianovata

comment created time in 9 days

pull request commentfirefox-devtools/profiler

Expose profile.meta.logicalCPUs and profile.meta.physicalCPUs in the UI #2705

Hi @burianovata, how is it going? Do you still intend to finish that?

burianovata

comment created time in 9 days

issue commentfirefox-devtools/profiler

Marker tooltip and sidebar should make it clear when a stack comes from another thread

@nibble0101 as discussed in Matrix, let's keep this issue for other applicants since you are working on one already :)

This is still up for grabs!

squelart

comment created time in 9 days

more