summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/redux/middleware/performance-marker.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/shared/redux/middleware/performance-marker.js')
-rw-r--r--devtools/client/shared/redux/middleware/performance-marker.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/devtools/client/shared/redux/middleware/performance-marker.js b/devtools/client/shared/redux/middleware/performance-marker.js
new file mode 100644
index 0000000000..c829dffe3e
--- /dev/null
+++ b/devtools/client/shared/redux/middleware/performance-marker.js
@@ -0,0 +1,68 @@
+/* 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";
+
+/**
+ * This function returns a middleware, which is responsible for adding markers that will
+ * be visible in performance profiles, and may help investigate performance issues.
+ *
+ * Example usage, adding a marker when console messages are added, and when they are cleared:
+ *
+ * return createPerformanceMarkerMiddleware({
+ * "MESSAGES_ADD": {
+ * label: "WebconsoleAddMessages",
+ * sessionId: 12345,
+ * getMarkerDescription: function({ action, state }) {
+ * const { messages } = action;
+ * const totalMessageCount = state.messages.mutableMessagesById.size;
+ * return `${messages.length} messages handled, store now has ${totalMessageCount} messages`;
+ * },
+ * },
+ * "MESSAGES_CLEARED": {
+ * label: "WebconsoleClearMessages",
+ * sessionId: 12345
+ * },
+ * });
+ *
+ * @param {Object} cases: An object, keyed by action type, that will determine if a
+ * given action will add a marker.
+ * @param {String} cases.{actionType} - The type of the action that will trigger the
+ * marker creation.
+ * @param {String} cases.{actionType}.label - The marker label
+ * @param {Integer} cases.{actionType}.sessionId - The telemetry sessionId. This is used
+ * to be able to distinguish markers coming from different toolboxes.
+ * @param {Function} [cases.{actionType}.getMarkerDescription] - An optional function that
+ * will be called when adding the marker to populate its description. The function
+ * is called with an object holding the action and the state
+ */
+function createPerformanceMarkerMiddleware(cases) {
+ return function (store) {
+ return next => action => {
+ const condition = cases[action.type];
+ const shouldAddProfileMarker = !!condition;
+
+ // Start the marker timer before calling next(action).
+ const startTime = shouldAddProfileMarker ? Cu.now() : null;
+ const newState = next(action);
+
+ if (shouldAddProfileMarker) {
+ ChromeUtils.addProfilerMarker(
+ `${condition.label} ${condition.sessionId}`,
+ startTime,
+ condition.getMarkerDescription
+ ? condition.getMarkerDescription({
+ action,
+ state: store.getState(),
+ })
+ : ""
+ );
+ }
+ return newState;
+ };
+ };
+}
+
+module.exports = {
+ createPerformanceMarkerMiddleware,
+};