diff options
Diffstat (limited to 'devtools/client/shared/redux/middleware/performance-marker.js')
-rw-r--r-- | devtools/client/shared/redux/middleware/performance-marker.js | 68 |
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, +}; |