summaryrefslogtreecommitdiffstats
path: root/docshell/test/browser/browser_timelineMarkers-frame-04.js
diff options
context:
space:
mode:
Diffstat (limited to 'docshell/test/browser/browser_timelineMarkers-frame-04.js')
-rw-r--r--docshell/test/browser/browser_timelineMarkers-frame-04.js123
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);