Skip to content

Commit 7e274bd

Browse files
authored
Show 'open in Firefox Profiler' links in failure summary lines referencing profile artifacts. (#8871)
1 parent e2054c5 commit 7e274bd

File tree

4 files changed

+47
-5
lines changed

4 files changed

+47
-5
lines changed

ui/job-view/details/tabs/TabsPanel.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ class TabsPanel extends React.Component {
225225
<FailureSummaryTab
226226
selectedJob={selectedJobFull}
227227
jobLogUrls={jobLogUrls}
228+
jobDetails={jobDetails}
228229
logParseStatus={logParseStatus}
229230
logViewerFullUrl={logViewerFullUrl}
230231
addBug={addBug}

ui/shared/JobArtifacts.jsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ export default class JobArtifacts extends React.PureComponent {
8181
<a
8282
title={line.value}
8383
href={getPerfAnalysisUrl(line.url)}
84+
target="_blank"
85+
rel="noreferrer"
8486
>
8587
open in Firefox Profiler
8688
</a>
@@ -97,10 +99,9 @@ export default class JobArtifacts extends React.PureComponent {
9799

98100
JobArtifacts.propTypes = {
99101
jobDetails: PropTypes.arrayOf({
100-
contentType: PropTypes.string.isRequired,
101-
expires: PropTypes.string.isRequired,
102-
name: PropTypes.string.isRequired,
103-
storageType: PropTypes.string.isRequired,
102+
url: PropTypes.string.isRequired,
103+
value: PropTypes.string.isRequired,
104+
title: PropTypes.string.isRequired,
104105
}),
105106
jobArtifactsLoading: PropTypes.bool,
106107
repoName: PropTypes.string.isRequired,

ui/shared/tabs/failureSummary/FailureSummaryTab.jsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ class FailureSummaryTab extends React.Component {
168168
render() {
169169
const {
170170
jobLogUrls,
171+
jobDetails,
171172
logParseStatus,
172173
logViewerFullUrl,
173174
selectedJob,
@@ -236,6 +237,7 @@ class FailureSummaryTab extends React.Component {
236237
addBug={addBug}
237238
currentRepo={currentRepo}
238239
developerMode={developerMode}
240+
jobDetails={jobDetails}
239241
/>
240242
))}
241243

@@ -356,6 +358,11 @@ FailureSummaryTab.propTypes = {
356358
url: PropTypes.string.isRequired,
357359
parse_status: PropTypes.string.isRequired,
358360
}),
361+
jobDetails: PropTypes.arrayOf({
362+
url: PropTypes.string.isRequired,
363+
value: PropTypes.string.isRequired,
364+
title: PropTypes.string.isRequired,
365+
}),
359366
logParseStatus: PropTypes.string,
360367
logViewerFullUrl: PropTypes.string,
361368
currentRepo: PropTypes.shape({}).isRequired,
@@ -366,6 +373,7 @@ FailureSummaryTab.propTypes = {
366373

367374
FailureSummaryTab.defaultProps = {
368375
jobLogUrls: [],
376+
jobDetails: [],
369377
logParseStatus: 'pending',
370378
logViewerFullUrl: null,
371379
addBug: null,

ui/shared/tabs/failureSummary/SuggestionsListItem.jsx

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { isReftest } from '../../../helpers/job';
1616
import {
1717
createQueryParams,
1818
getLogViewerUrl,
19+
getPerfAnalysisUrl,
1920
parseQueryParams,
2021
} from '../../../helpers/url';
2122

@@ -51,6 +52,7 @@ export default class SuggestionsListItem extends React.Component {
5152
toggleBugFiler,
5253
toggleInternalIssueFiler,
5354
selectedJob,
55+
jobDetails,
5456
addBug,
5557
currentRepo,
5658
developerMode,
@@ -141,6 +143,31 @@ export default class SuggestionsListItem extends React.Component {
141143
}
142144
const filterTestPath = suggestion.search.match(/([a-z_\-0-9]+[/])+/gi);
143145

146+
let line = [suggestion.search];
147+
const hasProfile = suggestion.search.match(
148+
/profile uploaded in (profile_.*\.js\.json)/,
149+
);
150+
if (hasProfile) {
151+
const artifact = jobDetails.find(
152+
(artifact) => artifact.value === hasProfile[1],
153+
);
154+
if (artifact) {
155+
const [begin, end] = suggestion.search.split(hasProfile[0]);
156+
line = [
157+
begin,
158+
<a
159+
title="open in Firefox Profiler"
160+
href={getPerfAnalysisUrl(artifact.url)}
161+
target="_blank"
162+
rel="noreferrer"
163+
>
164+
open {artifact.value} in the Firefox Profiler
165+
</a>,
166+
end,
167+
];
168+
}
169+
}
170+
144171
return (
145172
<li>
146173
<div>
@@ -188,7 +215,7 @@ export default class SuggestionsListItem extends React.Component {
188215
</Button>
189216
)}
190217

191-
<span className="align-middle">{suggestion.search} </span>
218+
<span className="align-middle">{line} </span>
192219
<Clipboard
193220
description=" text of error line"
194221
text={suggestion.search}
@@ -246,6 +273,11 @@ export default class SuggestionsListItem extends React.Component {
246273
SuggestionsListItem.propTypes = {
247274
selectedJob: PropTypes.shape({}).isRequired,
248275
suggestion: PropTypes.shape({}).isRequired,
276+
jobDetails: PropTypes.arrayOf({
277+
url: PropTypes.string.isRequired,
278+
value: PropTypes.string.isRequired,
279+
title: PropTypes.string.isRequired,
280+
}).isRequired,
249281
toggleBugFiler: PropTypes.func.isRequired,
250282
toggleInternalIssueFiler: PropTypes.func.isRequired,
251283
developerMode: PropTypes.bool.isRequired,

0 commit comments

Comments
 (0)