summaryrefslogtreecommitdiffstats
path: root/devtools/client/performance/test/helpers/profiler-mm-utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/performance/test/helpers/profiler-mm-utils.js')
-rw-r--r--devtools/client/performance/test/helpers/profiler-mm-utils.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/devtools/client/performance/test/helpers/profiler-mm-utils.js b/devtools/client/performance/test/helpers/profiler-mm-utils.js
new file mode 100644
index 000000000..bffebf818
--- /dev/null
+++ b/devtools/client/performance/test/helpers/profiler-mm-utils.js
@@ -0,0 +1,117 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+/**
+ * The following functions are used in testing to control and inspect
+ * the nsIProfiler in child process content. These should be called from
+ * the parent process.
+ */
+
+const { Cc, Ci } = require("chrome");
+const { Task } = require("devtools/shared/task");
+
+const FRAME_SCRIPT_UTILS_URL = "chrome://devtools/content/shared/frame-script-utils.js";
+
+let gMM = null;
+
+/**
+ * Loads the relevant frame scripts into the provided browser's message manager.
+ */
+exports.pmmLoadFrameScripts = (gBrowser) => {
+ gMM = gBrowser.selectedBrowser.messageManager;
+ gMM.loadFrameScript(FRAME_SCRIPT_UTILS_URL, false);
+};
+
+/**
+ * Clears the cached message manager.
+ */
+exports.pmmClearFrameScripts = () => {
+ gMM = null;
+};
+
+/**
+ * Sends a message to the message listener, attaching an id to the payload data.
+ * Resolves a returned promise when the response is received from the message
+ * listener, with the same id as part of the response payload data.
+ */
+exports.pmmUniqueMessage = function (message, payload) {
+ if (!gMM) {
+ throw new Error("`pmmLoadFrameScripts()` must be called when using MessageManager.");
+ }
+
+ let { generateUUID } = Cc["@mozilla.org/uuid-generator;1"]
+ .getService(Ci.nsIUUIDGenerator);
+ payload.id = generateUUID().toString();
+
+ return new Promise(resolve => {
+ gMM.addMessageListener(message + ":response", function onHandler({ data }) {
+ if (payload.id == data.id) {
+ gMM.removeMessageListener(message + ":response", onHandler);
+ resolve(data.data);
+ }
+ });
+ gMM.sendAsyncMessage(message, payload);
+ });
+};
+
+/**
+ * Checks if the nsProfiler module is active.
+ */
+exports.pmmIsProfilerActive = () => {
+ return exports.pmmSendProfilerCommand("IsActive");
+};
+
+/**
+ * Starts the nsProfiler module.
+ */
+exports.pmmStartProfiler = Task.async(function* ({ entries, interval, features }) {
+ let isActive = (yield exports.pmmSendProfilerCommand("IsActive")).isActive;
+ if (!isActive) {
+ return exports.pmmSendProfilerCommand("StartProfiler", [entries, interval, features,
+ features.length]);
+ }
+ return null;
+});
+/**
+ * Stops the nsProfiler module.
+ */
+exports.pmmStopProfiler = Task.async(function* () {
+ let isActive = (yield exports.pmmSendProfilerCommand("IsActive")).isActive;
+ if (isActive) {
+ return exports.pmmSendProfilerCommand("StopProfiler");
+ }
+ return null;
+});
+
+/**
+ * Calls a method on the nsProfiler module.
+ */
+exports.pmmSendProfilerCommand = (method, args = []) => {
+ return exports.pmmUniqueMessage("devtools:test:profiler", { method, args });
+};
+
+/**
+ * Evaluates a script in content, returning a promise resolved with the
+ * returned result.
+ */
+exports.pmmEvalInDebuggee = (script) => {
+ return exports.pmmUniqueMessage("devtools:test:eval", { script });
+};
+
+/**
+ * Evaluates a console method in content.
+ */
+exports.pmmConsoleMethod = function (method, ...args) {
+ // Terrible ugly hack -- this gets stringified when it uses the
+ // message manager, so an undefined arg in `console.profileEnd()`
+ // turns into a stringified "null", which is terrible. This method
+ // is only used for test helpers, so swap out the argument if its undefined
+ // with an empty string. Differences between empty string and undefined are
+ // tested on the front itself.
+ if (args[0] == null) {
+ args[0] = "";
+ }
+ return exports.pmmUniqueMessage("devtools:test:console", { method, args });
+};