diff options
Diffstat (limited to 'docshell/test/browser/browser_timelineMarkers-frame-04.js')
-rw-r--r-- | docshell/test/browser/browser_timelineMarkers-frame-04.js | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/docshell/test/browser/browser_timelineMarkers-frame-04.js b/docshell/test/browser/browser_timelineMarkers-frame-04.js new file mode 100644 index 0000000000..a05804c5b3 --- /dev/null +++ b/docshell/test/browser/browser_timelineMarkers-frame-04.js @@ -0,0 +1,123 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// This file expects frame-head.js to be loaded in the environment. +/* import-globals-from frame-head.js */ + +"use strict"; + +// Test that the docShell profile timeline API returns the right +// markers for XMLHttpRequest events. + +var TESTS = [ + { + desc: "Event dispatch from XMLHttpRequest", + searchFor(markers) { + return markers.filter(m => m.name == "DOMEvent").length >= 5; + }, + setup(docShell) { + content.dispatchEvent(new content.Event("dog")); + }, + check(markers) { + let domMarkers = markers.filter(m => m.name == "DOMEvent"); + // One subtlety here is that we have five events: the event we + // inject in "setup", plus the four state transition events. The + // first state transition is reported synchronously and so should + // show up as a nested marker. + is(domMarkers.length, 5, "Got 5 markers"); + + // We should see some Javascript markers, and they should have a + // cause. + let jsMarkers = markers.filter( + m => m.name == "Javascript" && m.causeName + ); + ok(jsMarkers.length > 0, "Got some Javascript markers"); + is( + jsMarkers[0].stack.functionDisplayName, + "do_xhr", + "Javascript marker has entry point name" + ); + }, + }, +]; + +if ( + !Services.prefs.getBoolPref( + "javascript.options.asyncstack_capture_debuggee_only" + ) +) { + TESTS.push( + { + desc: "Async stack trace on Javascript marker", + searchFor: markers => { + return markers.some( + m => m.name == "Javascript" && m.causeName == "promise callback" + ); + }, + setup(docShell) { + content.dispatchEvent(new content.Event("promisetest")); + }, + check(markers) { + markers = markers.filter( + m => m.name == "Javascript" && m.causeName == "promise callback" + ); + ok(markers.length > 0, "Found a Javascript marker"); + + let frame = markers[0].stack; + ok(frame.asyncParent !== null, "Parent frame has async parent"); + is( + frame.asyncParent.asyncCause, + "promise callback", + "Async parent has correct cause" + ); + let asyncFrame = frame.asyncParent; + // Skip over self-hosted parts of our Promise implementation. + while (asyncFrame.source === "self-hosted") { + asyncFrame = asyncFrame.parent; + } + is( + asyncFrame.functionDisplayName, + "do_promise", + "Async parent has correct function name" + ); + }, + }, + { + desc: "Async stack trace on Javascript marker with script", + searchFor: markers => { + return markers.some( + m => m.name == "Javascript" && m.causeName == "promise callback" + ); + }, + setup(docShell) { + content.dispatchEvent(new content.Event("promisescript")); + }, + check(markers) { + markers = markers.filter( + m => m.name == "Javascript" && m.causeName == "promise callback" + ); + ok(markers.length > 0, "Found a Javascript marker"); + + let frame = markers[0].stack; + ok(frame.asyncParent !== null, "Parent frame has async parent"); + is( + frame.asyncParent.asyncCause, + "promise callback", + "Async parent has correct cause" + ); + let asyncFrame = frame.asyncParent; + // Skip over self-hosted parts of our Promise implementation. + while (asyncFrame.source === "self-hosted") { + asyncFrame = asyncFrame.parent; + } + is( + asyncFrame.functionDisplayName, + "do_promise_script", + "Async parent has correct function name" + ); + }, + } + ); +} + +timelineContentTest(TESTS); |