Skip to content

Commit 02d23fd

Browse files
bmeurerDevtools-frontend LUCI CQ
authored andcommitted
[console] Append optional issue summary to error messages.
Note that this will also be sent as part of the prompt for Console Insights and should make it more likely that Console Insights gives a useful response for a failed fetch (due to CORS policy violations). Currently the `issueSummary` information is only sent by Chrome when the `DevToolsImprovedNetworkError` feature is enabled. Fixed: 371523542 Screenshot: https://i.imgur.com/iUdAPNI.png Change-Id: I7495a7727547167f40df66bce72a6131524c51ae Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6021664 Auto-Submit: Benedikt Meurer <[email protected]> Commit-Queue: Danil Somsikov <[email protected]> Reviewed-by: Danil Somsikov <[email protected]>
1 parent ff3d577 commit 02d23fd

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

front_end/panels/console/ConsoleViewMessage.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,35 @@ import {describeWithMockConnection} from '../../testing/MockConnection.js';
1616
import * as Components from '../../ui/legacy/components/utils/utils.js';
1717
import * as UI from '../../ui/legacy/legacy.js';
1818

19+
import * as Console from './console.js';
1920
// The css files aren't exported by the bundle, so we need to import it directly.
2021
// eslint-disable-next-line rulesdir/es_modules_import
2122
import consoleViewStyles from './consoleView.css.js';
2223

24+
describe('ConsoleViewMessage', () => {
25+
describe('concatErrorDescriptionAndIssueSummary', () => {
26+
const {concatErrorDescriptionAndIssueSummary} = Console.ConsoleViewMessage;
27+
28+
it('correctly appends the issue summary in case of single line error descriptions', () => {
29+
assert.strictEqual(
30+
concatErrorDescriptionAndIssueSummary(
31+
'TypeError: Failed to fetch',
32+
'Access blocked by CORS policy: Cross origin requests are not allowed by request mode.'),
33+
'TypeError: Failed to fetch. Access blocked by CORS policy: Cross origin requests are not allowed by request mode.',
34+
);
35+
});
36+
37+
it('correctly inserts the issue summary in case of multi-line error descriptions', () => {
38+
assert.strictEqual(
39+
concatErrorDescriptionAndIssueSummary(
40+
'TypeError: Failed to fetch\n at (index):25:5',
41+
'Access blocked by CORS policy: Cross origin requests are not allowed by request mode.'),
42+
'TypeError: Failed to fetch. Access blocked by CORS policy: Cross origin requests are not allowed by request mode.\n at (index):25:5',
43+
);
44+
});
45+
});
46+
});
47+
2348
describeWithMockConnection('ConsoleViewMessage', () => {
2449
describe('anchor rendering', () => {
2550
it('links to the top frame for normal console message', () => {

front_end/panels/console/ConsoleViewMessage.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,24 @@ export const getMessageForElement = (element: Element): ConsoleViewMessage|undef
221221
return elementToMessage.get(element);
222222
};
223223

224+
/**
225+
* Combines the error description (essentially the `Error#stack` property value)
226+
* with the `issueSummary`.
227+
*
228+
* @param description the `description` property of the `Error` remote object.
229+
* @param issueSummary the optional `issueSummary` of the `exceptionMetaData`.
230+
* @returns the enriched description.
231+
* @see https://goo.gle/devtools-reduce-network-noise-design
232+
*/
233+
export const concatErrorDescriptionAndIssueSummary = (description: string, issueSummary: string): string => {
234+
// Insert the issue summary right after the error message.
235+
const pos = description.indexOf('\n');
236+
const prefix = pos === -1 ? description : description.substring(0, pos);
237+
const suffix = pos === -1 ? '' : description.substring(pos);
238+
description = `${prefix}. ${issueSummary}${suffix}`;
239+
return description;
240+
};
241+
224242
// This value reflects the 18px min-height of .console-message, plus the
225243
// 1px border of .console-message-wrapper. Keep in sync with consoleView.css.
226244
const defaultConsoleRowHeight = 19;
@@ -1704,6 +1722,11 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
17041722
return null;
17051723
}
17061724

1725+
const issueSummary = exceptionDetails?.exceptionMetaData?.issueSummary;
1726+
if (typeof issueSummary === 'string') {
1727+
string = concatErrorDescriptionAndIssueSummary(string, issueSummary);
1728+
}
1729+
17071730
const linkInfos = parseSourcePositionsFromErrorStack(runtimeModel, string);
17081731
if (!linkInfos?.length) {
17091732
return null;

0 commit comments

Comments
 (0)