feat: WebFrameMain.collectJavaScriptCallStack() (#44938)

* feat: WebFrameMain.unresponsiveDocumentJSCallStack

Co-authored-by: Samuel Maddock <smaddock@slack-corp.com>

* Revert "feat: WebFrameMain.unresponsiveDocumentJSCallStack"

This reverts commit e0612bc1a00a5282cba5df97da3c9c90e96ef244.

Co-authored-by: Samuel Maddock <smaddock@slack-corp.com>

* feat: frame.collectJavaScriptCallStack()

Co-authored-by: Samuel Maddock <smaddock@slack-corp.com>

* feat: frame.collectJavaScriptCallStack()

Co-authored-by: Samuel Maddock <smaddock@slack-corp.com>

* Update web-frame-main.md

Co-authored-by: Sam Maddock <smaddock@slack-corp.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Samuel Maddock <smaddock@slack-corp.com>
This commit is contained in:
trop[bot] 2024-12-03 09:55:52 -08:00 committed by GitHub
commit f383391c0e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 131 additions and 1 deletions

View file

@ -21,8 +21,16 @@ describe('webFrameMain module', () => {
type Server = { server: http.Server, url: string, crossOriginUrl: string }
/** Creates an HTTP server whose handler embeds the given iframe src. */
const createServer = async (): Promise<Server> => {
const createServer = async (options: {
headers?: Record<string, string>
} = {}): Promise<Server> => {
const server = http.createServer((req, res) => {
if (options.headers) {
for (const [k, v] of Object.entries(options.headers)) {
res.setHeader(k, v);
}
}
const params = new URLSearchParams(new URL(req.url || '', `http://${req.headers.host}`).search || '');
if (params.has('frameSrc')) {
res.end(`<iframe src="${params.get('frameSrc')}"></iframe>`);
@ -444,6 +452,29 @@ describe('webFrameMain module', () => {
});
});
describe('webFrameMain.collectJavaScriptCallStack', () => {
let server: Server;
before(async () => {
server = await createServer({
headers: {
'Document-Policy': 'include-js-call-stacks-in-crash-reports'
}
});
});
after(() => {
server.server.close();
});
it('collects call stack during JS execution', async () => {
const w = new BrowserWindow({ show: false });
await w.loadURL(server.url);
const callStackPromise = w.webContents.mainFrame.collectJavaScriptCallStack();
w.webContents.mainFrame.executeJavaScript('"run a lil js"');
const callStack = await callStackPromise;
expect(callStack).to.be.a('string');
});
});
describe('"frame-created" event', () => {
it('emits when the main frame is created', async () => {
const w = new BrowserWindow({ show: false });