feat: WebFrameMain.collectJavaScriptCallStack() (#44204)

* feat: WebFrameMain.unresponsiveDocumentJSCallStack

* Revert "feat: WebFrameMain.unresponsiveDocumentJSCallStack"

This reverts commit e0612bc1a00a5282cba5df97da3c9c90e96ef244.

* feat: frame.collectJavaScriptCallStack()

* feat: frame.collectJavaScriptCallStack()

* Update web-frame-main.md
This commit is contained in:
Sam Maddock 2024-12-02 23:32:24 -05:00 committed by GitHub
parent 6d4c271268
commit 2222920429
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 });