1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
/* 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";
const { TIMELINE_BLUEPRINT } = require("devtools/client/performance/modules/markers");
/**
* This file contains utilities for parsing out the markers blueprint
* to generate strings to be displayed in the UI.
*/
exports.MarkerBlueprintUtils = {
/**
* Takes a marker and a list of marker names that should be hidden, and
* determines if this marker should be filtered or not.
*
* @param object marker
* @return boolean
*/
shouldDisplayMarker: function (marker, hiddenMarkerNames) {
if (!hiddenMarkerNames || hiddenMarkerNames.length == 0) {
return true;
}
// If this marker isn't yet defined in the blueprint, simply check if the
// entire category of "UNKNOWN" markers are supposed to be visible or not.
let isUnknown = !(marker.name in TIMELINE_BLUEPRINT);
if (isUnknown) {
return hiddenMarkerNames.indexOf("UNKNOWN") == -1;
}
return hiddenMarkerNames.indexOf(marker.name) == -1;
},
/**
* Takes a marker and returns the blueprint definition for that marker type,
* falling back to the UNKNOWN blueprint definition if undefined.
*
* @param object marker
* @return object
*/
getBlueprintFor: function (marker) {
return TIMELINE_BLUEPRINT[marker.name] || TIMELINE_BLUEPRINT.UNKNOWN;
},
/**
* Returns the label to display for a marker, based off the blueprints.
*
* @param object marker
* @return string
*/
getMarkerLabel: function (marker) {
let blueprint = this.getBlueprintFor(marker);
let dynamic = typeof blueprint.label === "function";
let label = dynamic ? blueprint.label(marker) : blueprint.label;
return label;
},
/**
* Returns the generic label to display for a marker name.
* (e.g. "Function Call" for JS markers, rather than "setTimeout", etc.)
*
* @param string type
* @return string
*/
getMarkerGenericName: function (markerName) {
let blueprint = this.getBlueprintFor({ name: markerName });
let dynamic = typeof blueprint.label === "function";
let generic = dynamic ? blueprint.label() : blueprint.label;
// If no class name found, attempt to throw a descriptive error as to
// how the marker implementor can fix this.
if (!generic) {
let message = `Could not find marker generic name for "${markerName}".`;
if (typeof blueprint.label === "function") {
message += ` The following function must return a generic name string when no` +
` marker passed: ${blueprint.label}`;
} else {
message += ` ${markerName}.label must be defined in the marker blueprint.`;
}
throw new Error(message);
}
return generic;
},
/**
* Returns an array of objects with key/value pairs of what should be rendered
* in the marker details view.
*
* @param object marker
* @return array<object>
*/
getMarkerFields: function (marker) {
let blueprint = this.getBlueprintFor(marker);
let dynamic = typeof blueprint.fields === "function";
let fields = dynamic ? blueprint.fields(marker) : blueprint.fields;
return Object.entries(fields || {})
.filter(([_, value]) => dynamic ? true : value in marker)
.map(([label, value]) => ({ label, value: dynamic ? value : marker[value] }));
},
};
|