Skip to content

Commit 794df48

Browse files
vzaidmanfacebook-github-bot
authored andcommitted
re-write console stack trace frame urls to be relative to debugger (#52704)
Summary: Pull Request resolved: #52704 Stack traces for console calls are passed to the debugger when they are relative to device. (e.g. 10.0.2.2 for Android emulator) Changelog: [android][fixed] fix stack trace linkifying failing when using Android emulator and other situations where the device and debugger have different bundle urls Reviewed By: motiz88 Differential Revision: D78553183 fbshipit-source-id: 91d7e7ccc99d12ec7d06f4201237ecf557a46c4f
1 parent 6d4ea94 commit 794df48

4 files changed

Lines changed: 83 additions & 1 deletion

File tree

packages/dev-middleware/src/__tests__/InspectorProxyCdpRewritingHacks-test.js

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ describe.each(['HTTP', 'HTTPS'])(
184184
describe.each(['10.0.2.2:8080', '[::1]', 'example.com:2000'])(
185185
'%s aliasing to and from localhost',
186186
sourceHost => {
187-
test('in source map fetching during Debugger.scriptParsed', async () => {
187+
test('Debugger.scriptParsed - in source map fetching', async () => {
188188
serverRef.app.use('/source-map', serveStaticJson({version: 3}));
189189
const {device, debugger_} = await createAndConnectTarget(
190190
serverRef,
@@ -220,6 +220,53 @@ describe.each(['HTTP', 'HTTPS'])(
220220
}
221221
});
222222

223+
test('Runtime.consoleAPICalled - in location resolutions', async () => {
224+
const {device, debugger_} = await createAndConnectTarget(
225+
serverRef,
226+
autoCleanup.signal,
227+
{
228+
app: 'bar-app',
229+
id: 'page1',
230+
title: 'bar-title',
231+
vm: 'bar-vm',
232+
},
233+
{
234+
deviceHostHeader: sourceHost,
235+
},
236+
);
237+
try {
238+
const consoleMessage = await sendFromTargetToDebugger(
239+
device,
240+
debugger_,
241+
'page1',
242+
{
243+
method: 'Runtime.consoleAPICalled',
244+
params: {
245+
stackTrace: {
246+
callFrames: [
247+
{
248+
url: `${protocol.toLowerCase()}://${sourceHost}/bundleFile:1:2`,
249+
field2: 'aaa',
250+
},
251+
{
252+
url: `${protocol.toLowerCase()}://${sourceHost}/bundleFile:5:4`,
253+
field3: 'bbb',
254+
},
255+
],
256+
},
257+
},
258+
},
259+
);
260+
expect(consoleMessage.params.stackTrace.callFrames).toEqual([
261+
{url: `${serverRef.serverBaseUrl}/bundleFile:1:2`, field2: 'aaa'},
262+
{url: `${serverRef.serverBaseUrl}/bundleFile:5:4`, field3: 'bbb'},
263+
]);
264+
} finally {
265+
device.close();
266+
debugger_.close();
267+
}
268+
});
269+
223270
test('in Debugger.setBreakpointByUrl', async () => {
224271
const {device, debugger_} = await createAndConnectTarget(
225272
serverRef,

packages/dev-middleware/src/inspector-proxy/Device.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,23 @@ export default class Device {
844844

845845
this.#isLegacyPageReloading = false;
846846
}
847+
848+
if (payload.method === 'Runtime.consoleAPICalled') {
849+
const callFrames = payload.params?.stackTrace?.callFrames ?? [];
850+
for (const callFrame of callFrames) {
851+
if (callFrame.url) {
852+
const parsedUrl = this.#tryParseHTTPURL(callFrame.url);
853+
if (parsedUrl) {
854+
// Rewrite device-relative URLs pointing to the server so that they're
855+
// reachable from the frontend.
856+
callFrame.url = this.#deviceRelativeUrlToDebuggerRelativeUrl(
857+
parsedUrl,
858+
debuggerInfo,
859+
).href;
860+
}
861+
}
862+
}
863+
}
847864
}
848865

849866
/**

packages/dev-middleware/src/inspector-proxy/cdp-types/messages.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export type CDPClientMessage =
4848

4949
export type CDPServerMessage =
5050
| CDPEvent<'Debugger.scriptParsed'>
51+
| CDPEvent<'Runtime.consoleAPICalled'>
5152
| CDPEvent<>
5253
| CDPResponse<'Debugger.getScriptSource'>
5354
| CDPResponse<>;

packages/dev-middleware/src/inspector-proxy/cdp-types/protocol.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,27 @@ export interface Debugger {
8484
*/
8585
sourceMapURL: string,
8686
};
87+
88+
ConsoleAPICalled: {
89+
args: Array<{type: string, value: string}>,
90+
executionContextId: number,
91+
stackTrace: {
92+
timestamp: number,
93+
type: string,
94+
callFrames: Array<{
95+
columnNumber: number,
96+
lineNumber: number,
97+
functionName: string,
98+
scriptId: string,
99+
url: string,
100+
}>,
101+
},
102+
};
87103
}
88104

89105
export type Events = {
90106
'Debugger.scriptParsed': Debugger['ScriptParsedEvent'],
107+
'Runtime.consoleAPICalled': Debugger['ConsoleAPICalled'],
91108
[method: string]: JSONSerializable,
92109
};
93110

0 commit comments

Comments
 (0)