diff --git a/front_end/panels/console/ErrorStackParser.test.ts b/front_end/panels/console/ErrorStackParser.test.ts index dd08e4ce9915..db118101e2cb 100644 --- a/front_end/panels/console/ErrorStackParser.test.ts +++ b/front_end/panels/console/ErrorStackParser.test.ts @@ -340,5 +340,25 @@ describe('ErrorStackParser', () => { assert.strictEqual(parsedFrames[3].link?.url, urlString`http://example.com/b.js`); assert.isTrue(parsedFrames[3].isCallFrame); }); + + it('combines builtin frames in native frames', () => { + const parsedFrames = parseErrorStack(`Error: some error + at foo (http://example.com/a.js:6:3) + at forEach (native) + at JSON.parse (native) + at bar (http://example.com/b.js:43:14)`); + assert.exists(parsedFrames); + + assert.isUndefined(parsedFrames[0].link); + assert.isUndefined(parsedFrames[0].isCallFrame); + assert.strictEqual(parsedFrames[1].link?.url, urlString`http://example.com/a.js`); + assert.isTrue(parsedFrames[1].isCallFrame); + assert.isUndefined(parsedFrames[2].link); + assert.isTrue(parsedFrames[2].isCallFrame); + assert.strictEqual( + parsedFrames[2].line, ' at forEach (native)\n at JSON.parse (native)'); + assert.strictEqual(parsedFrames[3].link?.url, urlString`http://example.com/b.js`); + assert.isTrue(parsedFrames[3].isCallFrame); + }); }); }); diff --git a/front_end/panels/console/ErrorStackParser.ts b/front_end/panels/console/ErrorStackParser.ts index a0f9f4dba046..2842f57d5daf 100644 --- a/front_end/panels/console/ErrorStackParser.ts +++ b/front_end/panels/console/ErrorStackParser.ts @@ -75,7 +75,7 @@ export function parseSourcePositionsFromErrorStack( const linkCandidate = line.substring(left, right); const splitResult = Common.ParsedURL.ParsedURL.splitLineAndColumn(linkCandidate); - if (splitResult.url === '') { + if (splitResult.url === '' || splitResult.url === 'native') { if (linkInfos.length && linkInfos[linkInfos.length - 1].isCallFrame && !linkInfos[linkInfos.length - 1].link) { // Combine builtin frames. linkInfos[linkInfos.length - 1].line += `\n${line}`;