constants.js (12212B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 // Options passed to MemoryFront's startRecordingAllocations never change. 8 exports.ALLOCATION_RECORDING_OPTIONS = { 9 probability: 1, 10 maxLogLength: 1, 11 }; 12 13 // If TREE_ROW_HEIGHT changes, be sure to change `var(--heap-tree-row-height)` 14 // in `devtools/client/themes/memory.css` 15 exports.TREE_ROW_HEIGHT = 18; 16 17 /*** Actions ******************************************************************/ 18 19 const actions = (exports.actions = {}); 20 21 // Fired by UI to request a snapshot from the actor. 22 actions.TAKE_SNAPSHOT_START = "take-snapshot-start"; 23 actions.TAKE_SNAPSHOT_END = "take-snapshot-end"; 24 25 // When a heap snapshot is read into memory -- only fired 26 // once per snapshot. 27 actions.READ_SNAPSHOT_START = "read-snapshot-start"; 28 actions.READ_SNAPSHOT_END = "read-snapshot-end"; 29 30 // When a census is being performed on a heap snapshot 31 actions.TAKE_CENSUS_START = "take-census-start"; 32 actions.TAKE_CENSUS_END = "take-census-end"; 33 actions.TAKE_CENSUS_ERROR = "take-census-error"; 34 35 // When a tree map is being calculated on a heap snapshot 36 actions.TAKE_TREE_MAP_START = "take-tree-map-start"; 37 actions.TAKE_TREE_MAP_END = "take-tree-map-end"; 38 actions.TAKE_TREE_MAP_ERROR = "take-tree-map-error"; 39 40 // When requesting that the server start/stop recording allocation stacks. 41 actions.TOGGLE_RECORD_ALLOCATION_STACKS_START = 42 "toggle-record-allocation-stacks-start"; 43 actions.TOGGLE_RECORD_ALLOCATION_STACKS_END = 44 "toggle-record-allocation-stacks-end"; 45 46 // When a heap snapshot is being saved to a user-specified 47 // location on disk. 48 actions.EXPORT_SNAPSHOT_START = "export-snapshot-start"; 49 actions.EXPORT_SNAPSHOT_END = "export-snapshot-end"; 50 actions.EXPORT_SNAPSHOT_ERROR = "export-snapshot-error"; 51 52 // When a heap snapshot is being read from a user selected file, 53 // and represents the entire state until the census is available. 54 actions.IMPORT_SNAPSHOT_START = "import-snapshot-start"; 55 actions.IMPORT_SNAPSHOT_END = "import-snapshot-end"; 56 actions.IMPORT_SNAPSHOT_ERROR = "import-snapshot-error"; 57 58 // Fired by UI to select a snapshot to view. 59 actions.SELECT_SNAPSHOT = "select-snapshot"; 60 61 // Fired to delete a provided list of snapshots 62 actions.DELETE_SNAPSHOTS_START = "delete-snapshots-start"; 63 actions.DELETE_SNAPSHOTS_END = "delete-snapshots-end"; 64 65 // Fired to toggle tree inversion on or off. 66 actions.TOGGLE_INVERTED = "toggle-inverted"; 67 68 // Fired when a snapshot is selected for diffing. 69 actions.SELECT_SNAPSHOT_FOR_DIFFING = "select-snapshot-for-diffing"; 70 71 // Fired when taking a census diff. 72 actions.TAKE_CENSUS_DIFF_START = "take-census-diff-start"; 73 actions.TAKE_CENSUS_DIFF_END = "take-census-diff-end"; 74 actions.DIFFING_ERROR = "diffing-error"; 75 76 // Fired to set a new census display. 77 actions.SET_CENSUS_DISPLAY = "set-census-display"; 78 79 // Fired to change the display that controls the dominator tree labels. 80 actions.SET_LABEL_DISPLAY = "set-label-display"; 81 82 // Fired to set a tree map display 83 actions.SET_TREE_MAP_DISPLAY = "set-tree-map-display"; 84 85 // Fired when changing between census or dominators view. 86 actions.CHANGE_VIEW = "change-view"; 87 actions.POP_VIEW = "pop-view"; 88 89 // Fired when there is an error processing a snapshot or taking a census. 90 actions.SNAPSHOT_ERROR = "snapshot-error"; 91 92 // Fired when there is a new filter string set. 93 actions.SET_FILTER_STRING = "set-filter-string"; 94 95 // Fired to expand or collapse nodes in census reports. 96 actions.EXPAND_CENSUS_NODE = "expand-census-node"; 97 actions.EXPAND_DIFFING_CENSUS_NODE = "expand-diffing-census-node"; 98 actions.COLLAPSE_CENSUS_NODE = "collapse-census-node"; 99 actions.COLLAPSE_DIFFING_CENSUS_NODE = "collapse-diffing-census-node"; 100 101 // Fired when nodes in various trees are focused. 102 actions.FOCUS_CENSUS_NODE = "focus-census-node"; 103 actions.FOCUS_DIFFING_CENSUS_NODE = "focus-diffing-census-node"; 104 actions.FOCUS_DOMINATOR_TREE_NODE = "focus-dominator-tree-node"; 105 106 actions.FOCUS_INDIVIDUAL = "focus-individual"; 107 actions.FETCH_INDIVIDUALS_START = "fetch-individuals-start"; 108 actions.FETCH_INDIVIDUALS_END = "fetch-individuals-end"; 109 actions.INDIVIDUALS_ERROR = "individuals-error"; 110 111 actions.COMPUTE_DOMINATOR_TREE_START = "compute-dominator-tree-start"; 112 actions.COMPUTE_DOMINATOR_TREE_END = "compute-dominator-tree-end"; 113 actions.FETCH_DOMINATOR_TREE_START = "fetch-dominator-tree-start"; 114 actions.FETCH_DOMINATOR_TREE_END = "fetch-dominator-tree-end"; 115 actions.DOMINATOR_TREE_ERROR = "dominator-tree-error"; 116 actions.FETCH_IMMEDIATELY_DOMINATED_START = "fetch-immediately-dominated-start"; 117 actions.FETCH_IMMEDIATELY_DOMINATED_END = "fetch-immediately-dominated-end"; 118 actions.EXPAND_DOMINATOR_TREE_NODE = "expand-dominator-tree-node"; 119 actions.COLLAPSE_DOMINATOR_TREE_NODE = "collapse-dominator-tree-node"; 120 121 actions.RESIZE_SHORTEST_PATHS = "resize-shortest-paths"; 122 123 // Fired when the memory front is changed. 124 actions.UPDATE_MEMORY_FRONT = "update-memory-front"; 125 126 /*** Census Displays ***************************************************************/ 127 128 const COUNT = Object.freeze({ by: "count", count: true, bytes: true }); 129 const INTERNAL_TYPE = Object.freeze({ by: "internalType", then: COUNT }); 130 const DESCRIPTIVE_TYPE = Object.freeze({ by: "descriptiveType", then: COUNT }); 131 const ALLOCATION_STACK = Object.freeze({ 132 by: "allocationStack", 133 then: COUNT, 134 noStack: COUNT, 135 }); 136 const OBJECT_CLASS = Object.freeze({ 137 by: "objectClass", 138 then: COUNT, 139 other: COUNT, 140 }); 141 const COARSE_TYPE = Object.freeze({ 142 by: "coarseType", 143 objects: OBJECT_CLASS, 144 strings: COUNT, 145 scripts: { 146 by: "filename", 147 then: INTERNAL_TYPE, 148 noFilename: INTERNAL_TYPE, 149 }, 150 other: INTERNAL_TYPE, 151 domNode: DESCRIPTIVE_TYPE, 152 }); 153 154 exports.censusDisplays = Object.freeze({ 155 coarseType: Object.freeze({ 156 displayName: "Type", 157 get tooltip() { 158 // Importing down here is necessary because of the circular dependency 159 // this introduces with `./utils.js`. 160 const { L10N } = require("resource://devtools/client/memory/utils.js"); 161 return L10N.getStr("censusDisplays.coarseType.tooltip"); 162 }, 163 inverted: true, 164 breakdown: COARSE_TYPE, 165 }), 166 167 allocationStack: Object.freeze({ 168 displayName: "Call Stack", 169 get tooltip() { 170 const { L10N } = require("resource://devtools/client/memory/utils.js"); 171 return L10N.getStr("censusDisplays.allocationStack.tooltip"); 172 }, 173 inverted: false, 174 breakdown: ALLOCATION_STACK, 175 }), 176 177 invertedAllocationStack: Object.freeze({ 178 displayName: "Inverted Call Stack", 179 get tooltip() { 180 const { L10N } = require("resource://devtools/client/memory/utils.js"); 181 return L10N.getStr("censusDisplays.invertedAllocationStack.tooltip"); 182 }, 183 inverted: true, 184 breakdown: ALLOCATION_STACK, 185 }), 186 }); 187 188 const DOMINATOR_TREE_LABEL_COARSE_TYPE = Object.freeze({ 189 by: "coarseType", 190 objects: OBJECT_CLASS, 191 scripts: Object.freeze({ 192 by: "internalType", 193 then: Object.freeze({ 194 by: "filename", 195 then: COUNT, 196 noFilename: COUNT, 197 }), 198 }), 199 strings: INTERNAL_TYPE, 200 other: INTERNAL_TYPE, 201 domNode: DESCRIPTIVE_TYPE, 202 }); 203 204 exports.labelDisplays = Object.freeze({ 205 coarseType: Object.freeze({ 206 displayName: "Type", 207 get tooltip() { 208 const { L10N } = require("resource://devtools/client/memory/utils.js"); 209 return L10N.getStr("dominatorTreeDisplays.coarseType.tooltip"); 210 }, 211 breakdown: DOMINATOR_TREE_LABEL_COARSE_TYPE, 212 }), 213 214 allocationStack: Object.freeze({ 215 displayName: "Call Stack", 216 get tooltip() { 217 const { L10N } = require("resource://devtools/client/memory/utils.js"); 218 return L10N.getStr("dominatorTreeDisplays.allocationStack.tooltip"); 219 }, 220 breakdown: Object.freeze({ 221 by: "allocationStack", 222 then: DOMINATOR_TREE_LABEL_COARSE_TYPE, 223 noStack: DOMINATOR_TREE_LABEL_COARSE_TYPE, 224 }), 225 }), 226 }); 227 228 exports.treeMapDisplays = Object.freeze({ 229 coarseType: Object.freeze({ 230 displayName: "Type", 231 get tooltip() { 232 const { L10N } = require("resource://devtools/client/memory/utils.js"); 233 return L10N.getStr("treeMapDisplays.coarseType.tooltip"); 234 }, 235 breakdown: COARSE_TYPE, 236 inverted: false, 237 }), 238 }); 239 240 /*** View States **************************************************************/ 241 242 /** 243 * The various main views that the tool can be in. 244 */ 245 const viewState = (exports.viewState = Object.create(null)); 246 viewState.CENSUS = "view-state-census"; 247 viewState.DIFFING = "view-state-diffing"; 248 viewState.DOMINATOR_TREE = "view-state-dominator-tree"; 249 viewState.TREE_MAP = "view-state-tree-map"; 250 viewState.INDIVIDUALS = "view-state-individuals"; 251 252 /*** Snapshot States **********************************************************/ 253 254 const snapshotState = (exports.snapshotState = Object.create(null)); 255 256 /** 257 * Various states a snapshot can be in. 258 * An FSM describing snapshot states: 259 * 260 * SAVING -> SAVED -> READING -> READ 261 * ↗ 262 * IMPORTING 263 * 264 * Any of these states may go to the ERROR state, from which they can never 265 * leave (mwah ha ha ha!) 266 */ 267 snapshotState.ERROR = "snapshot-state-error"; 268 snapshotState.IMPORTING = "snapshot-state-importing"; 269 snapshotState.SAVING = "snapshot-state-saving"; 270 snapshotState.SAVED = "snapshot-state-saved"; 271 snapshotState.READING = "snapshot-state-reading"; 272 snapshotState.READ = "snapshot-state-read"; 273 274 /* 275 * Various states the census model can be in. 276 * 277 * SAVING <-> SAVED 278 * | 279 * V 280 * ERROR 281 */ 282 283 const censusState = (exports.censusState = Object.create(null)); 284 285 censusState.SAVING = "census-state-saving"; 286 censusState.SAVED = "census-state-saved"; 287 censusState.ERROR = "census-state-error"; 288 289 /* 290 * Various states the tree map model can be in. 291 * 292 * SAVING <-> SAVED 293 * | 294 * V 295 * ERROR 296 */ 297 298 const treeMapState = (exports.treeMapState = Object.create(null)); 299 300 treeMapState.SAVING = "tree-map-state-saving"; 301 treeMapState.SAVED = "tree-map-state-saved"; 302 treeMapState.ERROR = "tree-map-state-error"; 303 304 /*** Diffing States ***********************************************************/ 305 306 /* 307 * Various states the diffing model can be in. 308 * 309 * SELECTING --> TAKING_DIFF <---> TOOK_DIFF 310 * | 311 * V 312 * ERROR 313 */ 314 const diffingState = (exports.diffingState = Object.create(null)); 315 316 // Selecting the two snapshots to diff. 317 diffingState.SELECTING = "diffing-state-selecting"; 318 319 // Currently computing the diff between the two selected snapshots. 320 diffingState.TAKING_DIFF = "diffing-state-taking-diff"; 321 322 // Have the diff between the two selected snapshots. 323 diffingState.TOOK_DIFF = "diffing-state-took-diff"; 324 325 // An error occurred while computing the diff. 326 diffingState.ERROR = "diffing-state-error"; 327 328 /*** Dominator Tree States ****************************************************/ 329 330 /* 331 * Various states the dominator tree model can be in. 332 * 333 * COMPUTING -> COMPUTED -> FETCHING -> LOADED <--> INCREMENTAL_FETCHING 334 * 335 * Any state may lead to the ERROR state, from which it can never leave. 336 */ 337 const dominatorTreeState = (exports.dominatorTreeState = Object.create(null)); 338 dominatorTreeState.COMPUTING = "dominator-tree-state-computing"; 339 dominatorTreeState.COMPUTED = "dominator-tree-state-computed"; 340 dominatorTreeState.FETCHING = "dominator-tree-state-fetching"; 341 dominatorTreeState.LOADED = "dominator-tree-state-loaded"; 342 dominatorTreeState.INCREMENTAL_FETCHING = 343 "dominator-tree-state-incremental-fetching"; 344 dominatorTreeState.ERROR = "dominator-tree-state-error"; 345 346 /*** States for Individuals Model *********************************************/ 347 348 /* 349 * Various states the individuals model can be in. 350 * 351 * COMPUTING_DOMINATOR_TREE -> FETCHING -> FETCHED 352 * 353 * Any state may lead to the ERROR state, from which it can never leave. 354 */ 355 const individualsState = (exports.individualsState = Object.create(null)); 356 individualsState.COMPUTING_DOMINATOR_TREE = 357 "individuals-state-computing-dominator-tree"; 358 individualsState.FETCHING = "individuals-state-fetching"; 359 individualsState.FETCHED = "individuals-state-fetched"; 360 individualsState.ERROR = "individuals-state-error";