profile-viewer 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/dist/AssemblyView-codemirror-D6IBMDRW.js +3 -0
  3. data/dist/AssemblyView-codemirror-D6IBMDRW.js.map +7 -0
  4. data/dist/SourceView-codemirror-NF5HZACX.js +14 -0
  5. data/dist/SourceView-codemirror-NF5HZACX.js.map +7 -0
  6. data/dist/_headers +1 -4
  7. data/dist/chunk-46YDEKKM.js +2 -0
  8. data/dist/chunk-46YDEKKM.js.map +7 -0
  9. data/dist/chunk-6K4OT4SN.js +11 -0
  10. data/dist/chunk-6K4OT4SN.js.map +7 -0
  11. data/dist/chunk-FQFFJJVU.js +2 -0
  12. data/dist/chunk-FQFFJJVU.js.map +7 -0
  13. data/dist/chunk-JZQU3SPI.js +2 -0
  14. data/dist/chunk-JZQU3SPI.js.map +7 -0
  15. data/dist/chunk-RMHNU7HN.js +2 -0
  16. data/dist/chunk-RMHNU7HN.js.map +7 -0
  17. data/dist/contribute.json +1 -1
  18. data/dist/docs/css/vue_v4.13.1.min.css +1 -0
  19. data/dist/docs/guide-filtering-call-trees.md +12 -0
  20. data/dist/docs/guide-ui-tour-panels.md +16 -1
  21. data/dist/docs/index.html +5 -6
  22. data/dist/docs/js/docsify_v4.13.1+.min.js +1 -0
  23. data/dist/docs/js/init.js +11 -1
  24. data/dist/docs/js/search_v4.13.1+.min.js +1 -0
  25. data/dist/gecko-profiler-demangle-3UYO3F2Y.js +2 -0
  26. data/dist/gecko-profiler-demangle-3UYO3F2Y.js.map +7 -0
  27. data/dist/gz.worker-C7QSA26N.js +38 -0
  28. data/dist/index-CZ7T6DL2.css +2 -0
  29. data/dist/index-CZ7T6DL2.css.map +7 -0
  30. data/dist/index-P5VLDZC7.js +381 -0
  31. data/dist/index-P5VLDZC7.js.map +7 -0
  32. data/dist/index.html +38 -1
  33. data/dist/index_bg-FTIMKZRG.wasm +0 -0
  34. data/dist/jszip.min-JBI6ADTT.js +18 -0
  35. data/dist/jszip.min-JBI6ADTT.js.map +7 -0
  36. data/dist/locales/be/app.ftl +50 -11
  37. data/dist/locales/de/app.ftl +114 -16
  38. data/dist/locales/el/app.ftl +135 -42
  39. data/dist/locales/en-CA/app.ftl +97 -11
  40. data/dist/locales/en-GB/app.ftl +114 -16
  41. data/dist/locales/en-US/app.ftl +116 -1
  42. data/dist/locales/es-CL/app.ftl +105 -15
  43. data/dist/locales/fr/app.ftl +82 -16
  44. data/dist/locales/fur/app.ftl +35 -11
  45. data/dist/locales/fy-NL/app.ftl +114 -16
  46. data/dist/locales/ia/app.ftl +118 -19
  47. data/dist/locales/it/app.ftl +108 -16
  48. data/dist/locales/kab/app.ftl +6 -80
  49. data/dist/locales/nl/app.ftl +114 -16
  50. data/dist/locales/pt-BR/app.ftl +104 -16
  51. data/dist/locales/ru/app.ftl +116 -23
  52. data/dist/locales/sv-SE/app.ftl +114 -16
  53. data/dist/locales/tr/app.ftl +149 -13
  54. data/dist/locales/uk/app.ftl +27 -19
  55. data/dist/locales/zh-CN/app.ftl +75 -13
  56. data/dist/locales/zh-TW/app.ftl +100 -14
  57. data/dist/photon/index.css +2 -0
  58. data/dist/photon/index.css.map +7 -0
  59. data/dist/photon/index.html +856 -26
  60. data/dist/photon/index.js +1 -0
  61. data/dist/photon/index.js.map +7 -0
  62. data/dist/service-worker-compat.js +51 -1
  63. data/dist/simpleperf-UUIE7C7E.js +25 -0
  64. data/dist/simpleperf-UUIE7C7E.js.map +7 -0
  65. data/dist/sw.js +1 -1
  66. data/dist/sw.js.map +1 -1
  67. data/dist/{workbox-e3490c72.js → workbox-1ef09536.js} +2 -2
  68. data/dist/workbox-1ef09536.js.map +1 -0
  69. data/ruby-bin/profile-viewer +48 -40
  70. data/ruby-bin/profile-viewer-version.rb +1 -1
  71. metadata +56 -103
  72. data/dist/022efb839d22fa54a716.svg +0 -28
  73. data/dist/029b9e4fd0218d7b09c6.svg +0 -8
  74. data/dist/0c510afd6169a0a83f97.svg +0 -14
  75. data/dist/0d5cf282780cd1a5ec64.svg +0 -8
  76. data/dist/118632062f4755918dac.svg +0 -4
  77. data/dist/11c5dca6d97c9e10e5b7.svg +0 -9
  78. data/dist/136.ad4176dc2a8e5cf33ef3.bundle.js +0 -2
  79. data/dist/136.ad4176dc2a8e5cf33ef3.bundle.js.map +0 -1
  80. data/dist/171.37d1e1824587d8df0ae2.bundle.js +0 -2
  81. data/dist/171.37d1e1824587d8df0ae2.bundle.js.map +0 -1
  82. data/dist/18e7fdd45099134897d2.svg +0 -8
  83. data/dist/1ddbc3ce40af8c7a648b.svg +0 -6
  84. data/dist/234ed61ab185caff67e3.svg +0 -8
  85. data/dist/280.4edd20bd6228986bbf2e.bundle.js +0 -2
  86. data/dist/280.4edd20bd6228986bbf2e.bundle.js.map +0 -1
  87. data/dist/2d4b477bc424d35a0245.svg +0 -25
  88. data/dist/2e43ad991eb141fc017f.svg +0 -9
  89. data/dist/2ea5b50b7361e6de561c.svg +0 -11
  90. data/dist/2f37d1addc2d2f5b699e.module.wasm +0 -0
  91. data/dist/31fe933f3a12be1aa7f3.svg +0 -4
  92. data/dist/390aa266f451c1005f61.svg +0 -10
  93. data/dist/3a829bf1fcf02598aa4b.svg +0 -6
  94. data/dist/3c3fda7c08bcc9544c64.svg +0 -6
  95. data/dist/4260d5db8309a6f83637.svg +0 -10
  96. data/dist/4536fd0738f36c3463bc.svg +0 -1
  97. data/dist/490065792b7e903c9f3e.svg +0 -6
  98. data/dist/49da6a2153f62ef73d17.svg +0 -7
  99. data/dist/4ecb077d8715f89c0f87.svg +0 -13
  100. data/dist/524e896f487119a0b832.svg +0 -13
  101. data/dist/556.b8d3d4d402ced081615a.bundle.js +0 -2
  102. data/dist/556.b8d3d4d402ced081615a.bundle.js.map +0 -1
  103. data/dist/6bd0589a27236471fdab.svg +0 -4
  104. data/dist/6c6b49af3a86dfdd44e6.svg +0 -4
  105. data/dist/6c8063be3afa1d95c902.svg +0 -3
  106. data/dist/71730566d6c47ffdc965.svg +0 -12
  107. data/dist/7273fadce89da05535e5.svg +0 -4
  108. data/dist/731673c749e57bf6f544.svg +0 -13
  109. data/dist/76e5b29823c9fd62d90d.svg +0 -3
  110. data/dist/7853c71223701f30d495.svg +0 -19
  111. data/dist/79856ce399cb305fafb8.svg +0 -19
  112. data/dist/7c7ac3c7df370340cfd2.svg +0 -7
  113. data/dist/7e3ac9afb25cfe809520.svg +0 -1
  114. data/dist/81762b0b1aacd3686a6b.svg +0 -12
  115. data/dist/86e81402ef76d28ff55f.svg +0 -15
  116. data/dist/874.7cb94ee0732c5a2ca826.bundle.js +0 -2
  117. data/dist/874.7cb94ee0732c5a2ca826.bundle.js.map +0 -1
  118. data/dist/8846b19a497771fe0e9d.svg +0 -4
  119. data/dist/8aae7b979b04407f71a4.svg +0 -3
  120. data/dist/8b8b909e42722172d494.svg +0 -7
  121. data/dist/8dab2a6ba757bcc6e9a5.svg +0 -3
  122. data/dist/9103e94f1d34c15d44be.svg +0 -6
  123. data/dist/957.2f40be4cef3037bc352b.bundle.js +0 -3
  124. data/dist/957.2f40be4cef3037bc352b.bundle.js.LICENSE.txt +0 -19
  125. data/dist/957.2f40be4cef3037bc352b.bundle.js.map +0 -1
  126. data/dist/999.a1119c25d77e1883c1e1.bundle.js +0 -2
  127. data/dist/999.a1119c25d77e1883c1e1.bundle.js.map +0 -1
  128. data/dist/9a7bd6ec36312a2baa7e.svg +0 -1
  129. data/dist/9d858d1a3ab57f8ee2e1.svg +0 -4
  130. data/dist/9eb1fab2684d1e1f0e26.svg +0 -13
  131. data/dist/a3196e840709b18a3119.svg +0 -1
  132. data/dist/aa867391c311267af5a9.svg +0 -4
  133. data/dist/acb8393f3fb9c59b15c9.svg +0 -20
  134. data/dist/b5698a02eef37ce29146.svg +0 -10
  135. data/dist/c3432220f657733ed05f.svg +0 -10
  136. data/dist/ca2af827049e9039ef9c.svg +0 -8
  137. data/dist/d09537c705fb0878eb63.svg +0 -4
  138. data/dist/d6df0017c0241dfe86ff.svg +0 -6
  139. data/dist/d9c199b3e3e469cc5713.svg +0 -10
  140. data/dist/da1f21c60c7217745dd8.svg +0 -1
  141. data/dist/docs/gitpod.md +0 -34
  142. data/dist/docs/js/docsify_v4.12.2+.min.js +0 -1
  143. data/dist/docs/js/ga_v4.12.2.min.js +0 -1
  144. data/dist/docs/js/search_v4.12.2.min.js +0 -1
  145. data/dist/e4ed50222911c5af9a32.svg +0 -12
  146. data/dist/e70722c0fe0ac3d4227b.svg +0 -10
  147. data/dist/f8e25c2ebeb0a0725a9e.svg +0 -12
  148. data/dist/fcb532a05dd4b09c2d08.svg +0 -10
  149. data/dist/fd040fb5f4e7a515bb3c.svg +0 -15
  150. data/dist/main.6cdc9308b67c00785584.bundle.js +0 -198
  151. data/dist/main.6cdc9308b67c00785584.bundle.js.LICENSE.txt +0 -63
  152. data/dist/main.6cdc9308b67c00785584.bundle.js.map +0 -1
  153. data/dist/photon/118632062f4755918dac.svg +0 -4
  154. data/dist/photon/31fe933f3a12be1aa7f3.svg +0 -4
  155. data/dist/photon/49da6a2153f62ef73d17.svg +0 -7
  156. data/dist/photon/6bd0589a27236471fdab.svg +0 -4
  157. data/dist/photon/6c8063be3afa1d95c902.svg +0 -3
  158. data/dist/photon/76e5b29823c9fd62d90d.svg +0 -3
  159. data/dist/photon/8aae7b979b04407f71a4.svg +0 -3
  160. data/dist/photon/8dab2a6ba757bcc6e9a5.svg +0 -3
  161. data/dist/photon/9103e94f1d34c15d44be.svg +0 -6
  162. data/dist/photon/aa867391c311267af5a9.svg +0 -4
  163. data/dist/photon/main.e1d25e5ea6d5812b127b.bundle.js +0 -2
  164. data/dist/photon/main.e1d25e5ea6d5812b127b.bundle.js.map +0 -1
  165. data/dist/workbox-e3490c72.js.map +0 -1
  166. data/dist/zee-worker.js +0 -1
  167. /data/dist/{4d26f0e38c22eedde178.jpg → firefox-profiler-button-2021-05-06-ZEMGS6NI.jpg} +0 -0
  168. /data/dist/{18a5d1d99f1c65c33b71.png → perf-screenshot-2024-02-29-4YCKHIPD.png} +0 -0
  169. /data/dist/{favicon.png → res/img/favicon.png} +0 -0
  170. /data/dist/{58c5415e952fb6dddd6b.png → spinner-DC3JCQB7.png} +0 -0
@@ -0,0 +1,2 @@
1
+ import{b}from"/chunk-JZQU3SPI.js";var g=b((k,p)=>{p.exports=m;function m(e,n,i){return n<i?e<n?n:e>i?i:e:e<i?i:e>n?n:e}});function T(e,n,i,L){let r=[],l=[];for(let o=0;o<e.length;o++){let s=e.frame[o],f=e.prefix[o],c=n.func[s],a=i.source[c],t=null,u=f!==null?l[f]:null;a===L&&(t=n.line[s],t===null&&(t=i.lineNumber[c]),t!==null&&(u===null?u=new Set([t]):u.has(t)||(u=new Set(u),u.add(t)))),r.push(t),l.push(u)}return{selfLine:r,stackLines:l}}var S={totalLineHits:new Map,selfLineHits:new Map};function d(e,n){if(e===null)return S;let{selfLine:i,stackLines:L}=e,r=new Map,l=new Map;for(let o=0;o<n.length;o++){let s=n.stack[o];if(s===null)continue;let f=n.weight?n.weight[o]:1,c=L[s];if(c!==null)for(let t of c){let u=r.get(t)??0;r.set(t,u+f)}let a=i[s];if(a!==null){let t=l.get(a)??0;l.set(a,t+f)}}return{totalLineHits:r,selfLineHits:l}}function h(e,n,i,L){let r=new Map;for(let l=0;l<e.length;l++){let o=e.stack[l];if(o===null)continue;let s=n[o];if(s===-1)continue;let f=i.line[s],c=f!==null?f:L;if(c===null)continue;let a=e.weight!==null?e.weight[l]:1;r.set(c,(r.get(c)??0)+a)}return r}export{T as a,S as b,d as c,h as d,g as e};
2
+ //# sourceMappingURL=/chunk-FQFFJJVU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../node_modules/clamp/index.js", "../src/profile-logic/line-timings.ts"],
4
+ "sourcesContent": ["module.exports = clamp\n\nfunction clamp(value, min, max) {\n return min < max\n ? (value < min ? min : value > max ? max : value)\n : (value < max ? max : value > min ? min : value)\n}\n", "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\nimport type {\n FrameTable,\n FuncTable,\n StackTable,\n SamplesLikeTable,\n StackLineInfo,\n LineTimings,\n LineNumber,\n IndexIntoSourceTable,\n} from 'firefox-profiler/types';\n\n/**\n * For each stack in `stackTable`, and one specific source file, compute the\n * sets of line numbers in file that are hit by the stack.\n *\n * For each stack we answer the following question:\n * - \"Does this stack contribute to line X's self time?\"\n * Answer: result.selfLine[stack] === X\n * - \"Does this stack contribute to line X's total time?\"\n * Answer: result.stackLines[stack].has(X)\n *\n * Compute the sets of line numbers in the given file that are hit by each stack.\n * For each stack in the stack table and each line in the file, we answer the\n * question \"Does this stack contribute to line X's self time? Does it contribute\n * to line X's total time?\"\n * Each stack can only contribute to one line's self time: the line of the stack's\n * own frame.\n * But each stack can contribute to the total time of multiple lines: All the lines\n * in the file that are encountered by any of the stack's ancestor stacks.\n * E.g if functions A, B and C are all in the same file, then a stack with the call\n * path [A, B, C] will contribute to the total time of 3 lines:\n * 1. The line in function A which has the call to B,\n * 2. The line in function B which has the call to C, and\n * 3. The line in function C that is being executed at that stack (stack.frame.line).\n *\n * This last line is the stack's \"self line\".\n * If there is recursion, and the same line is present in multiple frames in the\n * same stack, the line is only counted once - the lines are stored in a set.\n *\n * The returned StackLineInfo is computed as follows:\n * selfLine[stack]:\n * For stacks whose stack.frame.func.file is the given file, this is stack.frame.line.\n * For all other stacks this is null.\n * stackLines[stack]:\n * For stacks whose stack.frame.func.file is the given file, this is the stackLines\n * of its prefix stack, plus stack.frame.line added to the set.\n * For all other stacks this is the same as the stackLines set of the stack's prefix.\n */\nexport function getStackLineInfo(\n stackTable: StackTable,\n frameTable: FrameTable,\n funcTable: FuncTable,\n sourceViewSourceIndex: IndexIntoSourceTable\n): StackLineInfo {\n // \"self line\" == \"the line which a stack's self time is contributed to\"\n const selfLineForAllStacks = [];\n // \"total lines\" == \"the set of lines whose total time this stack contributes to\"\n const totalLinesForAllStacks: Array<Set<LineNumber> | null> = [];\n\n // This loop takes advantage of the fact that the stack table is topologically ordered:\n // Prefix stacks are always visited before their descendants.\n // Each stack inherits the \"total\" lines from its parent stack, and then adds its\n // self line to that set. If the stack doesn't have a self line in the file, we just\n // re-use the prefix's set object without copying it.\n for (let stackIndex = 0; stackIndex < stackTable.length; stackIndex++) {\n const frame = stackTable.frame[stackIndex];\n const prefixStack = stackTable.prefix[stackIndex];\n const func = frameTable.func[frame];\n const sourceIndexOfThisStack = funcTable.source[func];\n\n let selfLine: LineNumber | null = null;\n let totalLines: Set<LineNumber> | null =\n prefixStack !== null ? totalLinesForAllStacks[prefixStack] : null;\n\n if (sourceIndexOfThisStack === sourceViewSourceIndex) {\n selfLine = frameTable.line[frame];\n // Fallback to func line info if frame line info is not available\n if (selfLine === null) {\n selfLine = funcTable.lineNumber[func];\n }\n if (selfLine !== null) {\n // Add this stack's line to this stack's totalLines. The rest of this stack's\n // totalLines is the same as for the parent stack.\n // We avoid creating new Set objects unless the new set is actually\n // different.\n if (totalLines === null) {\n // None of the ancestor stack nodes have hit a line in the given file.\n totalLines = new Set([selfLine]);\n } else if (!totalLines.has(selfLine)) {\n totalLines = new Set(totalLines);\n totalLines.add(selfLine);\n }\n }\n }\n\n selfLineForAllStacks.push(selfLine);\n totalLinesForAllStacks.push(totalLines);\n }\n return {\n selfLine: selfLineForAllStacks,\n stackLines: totalLinesForAllStacks,\n };\n}\n\n// A LineTimings instance without any hits.\nexport const emptyLineTimings: LineTimings = {\n totalLineHits: new Map(),\n selfLineHits: new Map(),\n};\n\n// Compute the LineTimings for the supplied samples with the help of StackLineInfo.\n// This is fast and can be done whenever the preview selection changes.\n// The slow part was the computation of the StackLineInfo, which is already done.\nexport function getLineTimings(\n stackLineInfo: StackLineInfo | null,\n samples: SamplesLikeTable\n): LineTimings {\n if (stackLineInfo === null) {\n return emptyLineTimings;\n }\n const { selfLine, stackLines } = stackLineInfo;\n const totalLineHits: Map<LineNumber, number> = new Map();\n const selfLineHits: Map<LineNumber, number> = new Map();\n\n // Iterate over all the samples, and aggregate the sample's weight into the\n // lines which are hit by the sample's stack.\n // TODO: Maybe aggregate sample count per stack first, and then visit each stack only once?\n for (let sampleIndex = 0; sampleIndex < samples.length; sampleIndex++) {\n const stackIndex = samples.stack[sampleIndex];\n if (stackIndex === null) {\n continue;\n }\n const weight = samples.weight ? samples.weight[sampleIndex] : 1;\n const setOfHitLines = stackLines[stackIndex];\n if (setOfHitLines !== null) {\n for (const line of setOfHitLines) {\n const oldHitCount = totalLineHits.get(line) ?? 0;\n totalLineHits.set(line, oldHitCount + weight);\n }\n }\n const line = selfLine[stackIndex];\n if (line !== null) {\n const oldHitCount = selfLineHits.get(line) ?? 0;\n selfLineHits.set(line, oldHitCount + weight);\n }\n }\n return { totalLineHits, selfLineHits };\n}\n\n// Returns the line numbers which are hit in a specific call node,\n// along with the total of the sample weights per line.\n// callNodeFramePerStack needs to be a mapping from stackIndex to the\n// corresponding frame in the call node of interest.\nexport function getTotalLineTimingsForCallNode(\n samples: SamplesLikeTable,\n callNodeFramePerStack: Int32Array,\n frameTable: FrameTable,\n funcLine: LineNumber | null\n): Map<LineNumber, number> {\n const totalPerLine = new Map<LineNumber, number>();\n for (let sampleIndex = 0; sampleIndex < samples.length; sampleIndex++) {\n const stack = samples.stack[sampleIndex];\n if (stack === null) {\n continue;\n }\n const callNodeFrame = callNodeFramePerStack[stack];\n if (callNodeFrame === -1) {\n // This sample does not contribute to the call node's total. Ignore.\n continue;\n }\n\n const frameLine = frameTable.line[callNodeFrame];\n const line = frameLine !== null ? frameLine : funcLine;\n if (line === null) {\n continue;\n }\n\n const sampleWeight =\n samples.weight !== null ? samples.weight[sampleIndex] : 1;\n totalPerLine.set(line, (totalPerLine.get(line) ?? 0) + sampleWeight);\n }\n\n return totalPerLine;\n}\n"],
5
+ "mappings": "kCAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAUC,EAEjB,SAASA,EAAMC,EAAOC,EAAKC,EAAK,CAC9B,OAAOD,EAAMC,EACRF,EAAQC,EAAMA,EAAMD,EAAQE,EAAMA,EAAMF,EACxCA,EAAQE,EAAMA,EAAMF,EAAQC,EAAMA,EAAMD,CAC/C,IC8CO,SAASG,EACdC,EACAC,EACAC,EACAC,EACe,CAEf,IAAMC,EAAuB,CAAC,EAExBC,EAAwD,CAAC,EAO/D,QAASC,EAAa,EAAGA,EAAaN,EAAW,OAAQM,IAAc,CACrE,IAAMC,EAAQP,EAAW,MAAMM,CAAU,EACnCE,EAAcR,EAAW,OAAOM,CAAU,EAC1CG,EAAOR,EAAW,KAAKM,CAAK,EAC5BG,EAAyBR,EAAU,OAAOO,CAAI,EAEhDE,EAA8B,KAC9BC,EACFJ,IAAgB,KAAOH,EAAuBG,CAAW,EAAI,KAE3DE,IAA2BP,IAC7BQ,EAAWV,EAAW,KAAKM,CAAK,EAE5BI,IAAa,OACfA,EAAWT,EAAU,WAAWO,CAAI,GAElCE,IAAa,OAKXC,IAAe,KAEjBA,EAAa,IAAI,IAAI,CAACD,CAAQ,CAAC,EACrBC,EAAW,IAAID,CAAQ,IACjCC,EAAa,IAAI,IAAIA,CAAU,EAC/BA,EAAW,IAAID,CAAQ,KAK7BP,EAAqB,KAAKO,CAAQ,EAClCN,EAAuB,KAAKO,CAAU,CACxC,CACA,MAAO,CACL,SAAUR,EACV,WAAYC,CACd,CACF,CAGO,IAAMQ,EAAgC,CAC3C,cAAe,IAAI,IACnB,aAAc,IAAI,GACpB,EAKO,SAASC,EACdC,EACAC,EACa,CACb,GAAID,IAAkB,KACpB,OAAOF,EAET,GAAM,CAAE,SAAAF,EAAU,WAAAM,CAAW,EAAIF,EAC3BG,EAAyC,IAAI,IAC7CC,EAAwC,IAAI,IAKlD,QAASC,EAAc,EAAGA,EAAcJ,EAAQ,OAAQI,IAAe,CACrE,IAAMd,EAAaU,EAAQ,MAAMI,CAAW,EAC5C,GAAId,IAAe,KACjB,SAEF,IAAMe,EAASL,EAAQ,OAASA,EAAQ,OAAOI,CAAW,EAAI,EACxDE,EAAgBL,EAAWX,CAAU,EAC3C,GAAIgB,IAAkB,KACpB,QAAWC,KAAQD,EAAe,CAChC,IAAME,EAAcN,EAAc,IAAIK,CAAI,GAAK,EAC/CL,EAAc,IAAIK,EAAMC,EAAcH,CAAM,CAC9C,CAEF,IAAME,EAAOZ,EAASL,CAAU,EAChC,GAAIiB,IAAS,KAAM,CACjB,IAAMC,EAAcL,EAAa,IAAII,CAAI,GAAK,EAC9CJ,EAAa,IAAII,EAAMC,EAAcH,CAAM,CAC7C,CACF,CACA,MAAO,CAAE,cAAAH,EAAe,aAAAC,CAAa,CACvC,CAMO,SAASM,EACdT,EACAU,EACAzB,EACA0B,EACyB,CACzB,IAAMC,EAAe,IAAI,IACzB,QAASR,EAAc,EAAGA,EAAcJ,EAAQ,OAAQI,IAAe,CACrE,IAAMS,EAAQb,EAAQ,MAAMI,CAAW,EACvC,GAAIS,IAAU,KACZ,SAEF,IAAMC,EAAgBJ,EAAsBG,CAAK,EACjD,GAAIC,IAAkB,GAEpB,SAGF,IAAMC,EAAY9B,EAAW,KAAK6B,CAAa,EACzCP,EAAOQ,IAAc,KAAOA,EAAYJ,EAC9C,GAAIJ,IAAS,KACX,SAGF,IAAMS,EACJhB,EAAQ,SAAW,KAAOA,EAAQ,OAAOI,CAAW,EAAI,EAC1DQ,EAAa,IAAIL,GAAOK,EAAa,IAAIL,CAAI,GAAK,GAAKS,CAAY,CACrE,CAEA,OAAOJ,CACT",
6
+ "names": ["require_clamp", "__commonJSMin", "exports", "module", "clamp", "value", "min", "max", "getStackLineInfo", "stackTable", "frameTable", "funcTable", "sourceViewSourceIndex", "selfLineForAllStacks", "totalLinesForAllStacks", "stackIndex", "frame", "prefixStack", "func", "sourceIndexOfThisStack", "selfLine", "totalLines", "emptyLineTimings", "getLineTimings", "stackLineInfo", "samples", "stackLines", "totalLineHits", "selfLineHits", "sampleIndex", "weight", "setOfHitLines", "line", "oldHitCount", "getTotalLineTimingsForCallNode", "callNodeFramePerStack", "funcLine", "totalPerLine", "stack", "callNodeFrame", "frameLine", "sampleWeight"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var g=Object.create;var e=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(b,c)=>(typeof require<"u"?require:b)[c]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var n=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports),o=(a,b)=>{for(var c in b)e(a,c,{get:b[c],enumerable:!0})},l=(a,b,c,f)=>{if(b&&typeof b=="object"||typeof b=="function")for(let d of i(b))!k.call(a,d)&&d!==c&&e(a,d,{get:()=>b[d],enumerable:!(f=h(b,d))||f.enumerable});return a};var p=(a,b,c)=>(c=a!=null?g(j(a)):{},l(b||!a||!a.__esModule?e(c,"default",{value:a,enumerable:!0}):c,a));export{m as a,n as b,o as c,p as d};
2
+ //# sourceMappingURL=/chunk-JZQU3SPI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ function b(e,t=`There was an unhandled case for the value: "${e}"`){throw new Error(t)}function f(e,...t){return Object.assign({},e,...t)}function i(e){let t=e;switch(t){case"calltree":case"stack-chart":case"marker-chart":case"network-chart":case"marker-table":case"flame-graph":case"js-tracer":return t;default:return null}}function I(e){let t=i(e);if(!t)throw new Error(`Attempted to assert that "${e}" is a valid TransformType, and it was not.`);return t}function S(e){let t=e;switch(t){case"merge-call-node":case"merge-function":case"focus-subtree":case"focus-function":case"focus-category":case"focus-self":case"collapse-resource":case"collapse-direct-recursion":case"collapse-recursion":case"collapse-function-subtree":case"drop-function":case"filter-samples":return t;default:return null}}function l(e){return Object.entries(e)}function A(e,t){let r={};for(let[n,s]of l(e))r[n]=t(s,n);return r}function w(e){return Object.values(e)}function O(e,t){if(e===null)throw new Error(t||"Expected an item to exist, and it was null.");if(e===void 0)throw new Error(t||"Expected an item to exist, and it was undefined.");return e}function C(e){return e.values().next().value}var K="orange";var H="blue";var M="grey";var L="grey";var P="profile-store",D="http://localhost:5252",k="https://localhost:5252";function F(){return{frame:[],prefix:[],category:[],subcategory:[],length:0}}function W(){return{weightType:"samples",weight:null,stack:[],time:[],length:0}}function T(){return{frame:[],prefix:[],length:0}}function p(){return{weightType:"samples",weight:null,eventDelay:[],stack:[],time:[],length:0}}function g(){return{address:[],inlineDepth:[],category:[],subcategory:[],func:[],nativeSymbol:[],innerWindowID:[],line:[],column:[],length:0}}function V(e){return{address:e.address.slice(),inlineDepth:e.inlineDepth.slice(),category:e.category.slice(),subcategory:e.subcategory.slice(),func:e.func.slice(),nativeSymbol:e.nativeSymbol.slice(),innerWindowID:e.innerWindowID.slice(),line:e.line.slice(),column:e.column.slice(),length:e.length}}function E(){return{isJS:[],relevantForJS:[],name:[],resource:[],source:[],lineNumber:[],columnNumber:[],length:0}}function U(e){return{isJS:e.isJS.slice(),relevantForJS:e.relevantForJS.slice(),name:e.name.slice(),resource:e.resource.slice(),source:e.source.slice(),lineNumber:e.lineNumber.slice(),columnNumber:e.columnNumber.slice(),length:e.length}}function B(e){return{libIndex:e.libIndex.slice(),address:e.address.slice(),name:e.name.slice(),functionSize:e.functionSize.slice(),length:e.length}}function R(){return{lib:[],name:[],host:[],type:[],length:0}}function h(){return{libIndex:[],address:[],name:[],functionSize:[],length:0}}function _(){return{data:[],name:[],startTime:[],endTime:[],phase:[],category:[],length:0}}function J(){return{time:[],className:[],typeName:[],coarseType:[],weight:[],weightType:"bytes",inNursery:[],stack:[],length:0}}function j(){return{time:[],weight:[],weightType:"bytes",stack:[],length:0}}function Y(e){return{data:e.data.slice(),name:e.name.slice(),startTime:e.startTime.slice(),endTime:e.endTime.slice(),phase:e.phase.slice(),category:e.category.slice(),length:e.length}}var $={unknown:0,library:1,addon:2,webhost:3,otherhost:4,url:5};function d(){return{id:[],name:[],baseURL:[],length:0}}function x(){return[{name:"Other",color:"grey",subcategories:["Other"]},{name:"Idle",color:"transparent",subcategories:["Other"]},{name:"Layout",color:"purple",subcategories:["Other"]},{name:"JavaScript",color:"yellow",subcategories:["Other"]},{name:"GC / CC",color:"orange",subcategories:["Other"]},{name:"Network",color:"lightblue",subcategories:["Other"]},{name:"Graphics",color:"green",subcategories:["Other"]},{name:"DOM",color:"blue",subcategories:["Other"]}]}function y(){return{uuid:[],filename:[],length:0}}function z(e){return{...{processType:"default",processStartupTime:0,processShutdownTime:null,registerTime:0,unregisterTime:null,pausedRanges:[],name:"Empty",isMainThread:!1,pid:"0",tid:0,samples:p(),markers:_()},...e}}function m(){return{stackTable:T(),frameTable:g(),funcTable:E(),resourceTable:R(),nativeSymbols:h(),sources:y(),stringArray:[]}}function X(){return{meta:{interval:1,startTime:0,abi:"",misc:"",oscpu:"",platform:"",processType:0,extensions:d(),categories:x(),product:"Firefox",stackwalk:0,toolkit:"",version:33,preprocessedProfileVersion:60,appBuildID:"",sourceURL:"",physicalCPUs:0,logicalCPUs:0,CPUName:"",symbolicated:!0,markerSchema:[]},libs:[],pages:[],shared:m(),threads:[]}}function Z(){return{prefix:new Int32Array(0),subtreeRangeEnd:new Uint32Array(0),nextSibling:new Int32Array(0),func:new Int32Array(0),category:new Int32Array(0),subcategory:new Int32Array(0),innerWindowID:new Float64Array(0),sourceFramesInlinedIntoSymbol:new Int32Array(0),depth:new Int32Array(0),maxDepth:-1,length:0}}var a=new WeakMap,o=class e{_array;_stringToIndex;constructor(t){this._array=t,this._stringToIndex=new Map;for(let r=0;r<t.length;r++)this._stringToIndex.set(t[r],r)}static withBackingArray(t){let r=a.get(t);return r===void 0&&(r=new e(t),a.set(t,r)),r}getString(t,r){if(!this.hasIndex(t)){if(r)return console.warn(`index ${t} not in StringTable`),r;throw new Error(`index ${t} not in StringTable`)}return this._array[t]}hasIndex(t){return t in this._array}hasString(t){return this._stringToIndex.has(t)}indexForString(t){let r=this._stringToIndex.get(t);return r===void 0&&(r=this._array.length,this._stringToIndex.set(t,r),this._array.push(t)),r}getBackingArray(){return this._array}};var ee="SIMPLEPERF";function te(e,t){return new TextDecoder("utf8").decode(t.slice(0,e.length))===e}export{b as a,f as b,i as c,I as d,S as e,l as f,A as g,w as h,O as i,C as j,K as k,H as l,M as m,L as n,P as o,D as p,k as q,F as r,W as s,T as t,p as u,g as v,V as w,E as x,U as y,B as z,R as A,h as B,_ as C,J as D,j as E,Y as F,$ as G,d as H,x as I,y as J,z as K,X as L,Z as M,o as N,ee as O,te as P};
2
+ //# sourceMappingURL=/chunk-RMHNU7HN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/types.ts", "../src/app-logic/constants.ts", "../src/profile-logic/data-structures.ts", "../src/utils/string-table.ts", "../src/utils/magic.ts"],
4
+ "sourcesContent": ["/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\nimport type { TabSlug } from '../app-logic/tabs-handling';\nimport type { TransformType } from 'firefox-profiler/types';\n\n/**\n * This file contains utils that help Flow understand things better. Occasionally\n * statements can be logically equivalent, but Flow infers them in a specific way. Most\n * of the time tweaks can be done by editing the type system, but occasionally functions\n * are needed to get the desired result.\n */\n\n/**\n * This function can be run as the default arm of a switch statement to ensure exhaustive\n * checking of a given type. It relies on an assumption that all cases will be handled\n * and the input to the function will be empty. This function hopefully makes that check\n * more readable.\n */\nexport function assertExhaustiveCheck(\n notValid: never,\n errorMessage: string = `There was an unhandled case for the value: \"${notValid}\"`\n): void {\n throw new Error(errorMessage);\n}\n\n/**\n * Immutably update an object through Object.assign, but retain the original\n * type information of the object. Flow will occasionally throw errors when\n * inferring what is going on with Object.assign.\n */\nexport function immutableUpdate<T>(object: T, ...rest: any[]): T {\n return Object.assign({}, object, ...rest);\n}\n\n/**\n * This function takes a string and returns either a valid TabSlug or null, this doesn't\n * throw an error so that any arbitrary string can be converted, e.g. from a URL.\n */\nexport function toValidTabSlug(tabSlug: any): TabSlug | null {\n const coercedTabSlug = tabSlug as TabSlug;\n switch (coercedTabSlug) {\n case 'calltree':\n case 'stack-chart':\n case 'marker-chart':\n case 'network-chart':\n case 'marker-table':\n case 'flame-graph':\n case 'js-tracer':\n return coercedTabSlug;\n default: {\n // The coerced type SHOULD be empty here. If in reality we get\n // here, then it's not a valid transform type, so return null.\n return null;\n }\n }\n}\n\n/**\n * This function will take an arbitrary string, and will turn it into a TabSlug\n * it will throw an error if an invalid type was passed to it.\n */\nexport function ensureIsValidTabSlug(type: string): TabSlug {\n const assertedType = toValidTabSlug(type);\n if (!assertedType) {\n throw new Error(\n `Attempted to assert that \"${type}\" is a valid TransformType, and it was not.`\n );\n }\n return assertedType;\n}\n\n/**\n * This function will take an arbitrary string, and try to convert it to a valid\n * TransformType.\n */\nexport function convertToTransformType(type: string): TransformType | null {\n // Coerce this into a TransformType even if it's not one.\n const coercedType = type as TransformType;\n switch (coercedType) {\n // Exhaustively check each TransformType. The default arm will assert that\n // we have been exhaustive.\n case 'merge-call-node':\n case 'merge-function':\n case 'focus-subtree':\n case 'focus-function':\n case 'focus-category':\n case 'focus-self':\n case 'collapse-resource':\n case 'collapse-direct-recursion':\n case 'collapse-recursion':\n case 'collapse-function-subtree':\n case 'drop-function':\n case 'filter-samples':\n return coercedType;\n default: {\n // The coerced type SHOULD be empty here. If in reality we get\n // here, then it's not a valid transform type, so return null.\n return null;\n }\n }\n}\n\n/**\n * This function coerces one type into another type.\n * This is equivalent to: (((value: A): any): B)\n */\nexport function coerce<A, B>(item: A): B {\n return item as any;\n}\n\n/**\n * It can be helpful to coerce one type that matches the shape of another.\n */\nexport function coerceMatchingShape<T>(item: Partial<T>): T {\n return item as T;\n}\n\n/**\n * This is a type-friendly version of Object.values that assumes the object has\n * a Map-like structure.\n */\nexport function objectValues<Value, Obj extends Record<string, Value>>(\n object: Obj\n): Value[] {\n return Object.values(object) as any;\n}\n\n/**\n * This is a type-friendly version of Object.entries that assumes the object has\n * a Map-like structure.\n */\nexport function objectEntries<Key extends string, Value>(object: {\n [K in Key]: Value;\n}): Array<[Key, Value]> {\n return Object.entries(object) as any;\n}\n\n/**\n * This is a type-friendly version of Object.entries that assumes the object has\n * a Map-like structure.\n */\nexport function objectMap<Return, Key extends string, Value>(\n object: { [K in Key]: Value },\n fn: (value: Value, key: Key) => Return\n): { [K in Key]: Return } {\n const result: { [K in Key]: Return } = {} as any;\n for (const [key, value] of objectEntries(object)) {\n result[key] = fn(value, key);\n }\n return result;\n}\n\nexport function getObjectValuesAsUnion<T extends Record<string, any>>(\n obj: T\n): Array<T[keyof T]> {\n return Object.values(obj);\n}\n\n/**\n * This function will take an arbitrary string, and will turn it into a TransformType\n * it will throw an error if an invalid type was passed to it.\n */\nexport function ensureIsTransformType(type: string): TransformType {\n const assertedType = convertToTransformType(type);\n if (!assertedType) {\n throw new Error(\n `Attempted to assert that \"${type}\" is a valid TransformType, and it was not.`\n );\n }\n return assertedType;\n}\n\nexport function ensureExists<T>(\n item: T | null | undefined,\n message?: string\n): T {\n if (item === null) {\n throw new Error(message || 'Expected an item to exist, and it was null.');\n }\n if (item === undefined) {\n throw new Error(\n message || 'Expected an item to exist, and it was undefined.'\n );\n }\n return item;\n}\n\n/**\n * Returns the first item from Set in a type friendly manner.\n */\nexport function getFirstItemFromSet<T>(set: Set<T>): T | undefined {\n return set.values().next().value;\n}\n", "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\nimport type { MarkerPhase } from 'firefox-profiler/types';\n\n// The current version of the Gecko profile format.\n// Please don't forget to update the gecko profile format changelog in\n// `docs-developer/CHANGELOG-formats.md`.\nexport const GECKO_PROFILE_VERSION = 33;\n\n// The current version of the \"processed\" profile format.\n// Please don't forget to update the processed profile format changelog in\n// `docs-developer/CHANGELOG-formats.md`.\nexport const PROCESSED_PROFILE_VERSION = 60;\n\n// The following are the margin sizes for the left and right of the timeline. Independent\n// components need to share these values.\nexport const TIMELINE_MARGIN_RIGHT = 15;\nexport const TIMELINE_MARGIN_LEFT = 150;\n\n// Export the value for tests, and for computing the max height of the timeline\n// for the splitter.\nexport const FULL_TRACK_SCREENSHOT_HEIGHT = 50;\n\n// The following values are for network track.\nexport const TRACK_NETWORK_ROW_HEIGHT = 5;\nexport const TRACK_NETWORK_ROW_REPEAT = 7;\nexport const TRACK_NETWORK_HEIGHT =\n TRACK_NETWORK_ROW_HEIGHT * TRACK_NETWORK_ROW_REPEAT;\n\n// The following values are for memory track.\nexport const TRACK_MEMORY_GRAPH_HEIGHT = 25;\nexport const TRACK_MEMORY_MARKERS_HEIGHT = 15;\nexport const TRACK_MEMORY_HEIGHT =\n TRACK_MEMORY_GRAPH_HEIGHT + TRACK_MEMORY_MARKERS_HEIGHT;\nexport const TRACK_MEMORY_LINE_WIDTH = 2;\nexport const TRACK_MEMORY_DEFAULT_COLOR = 'orange';\n\n// The following values are for the bandwidth track.\nexport const TRACK_BANDWIDTH_HEIGHT = 25;\nexport const TRACK_BANDWIDTH_LINE_WIDTH = 2;\nexport const TRACK_BANDWIDTH_DEFAULT_COLOR = 'blue';\n\n// The following values are for experimental event delay track.\nexport const TRACK_EVENT_DELAY_HEIGHT = 40;\nexport const TRACK_EVENT_DELAY_LINE_WIDTH = 2;\n\n// The following values are for IPC track.\nexport const TRACK_IPC_MARKERS_HEIGHT = 25;\nexport const TRACK_IPC_HEIGHT = TRACK_IPC_MARKERS_HEIGHT;\n\n// The following values are the defaults for marker tracks\nexport const TRACK_MARKER_HEIGHT = 25;\nexport const TRACK_MARKER_LINE_WIDTH = 2;\nexport const TRACK_MARKER_DEFAULT_COLOR = 'grey';\n\n// Height of the blank area in process track.\nexport const TRACK_PROCESS_BLANK_HEIGHT = 30;\n\n// Height of timeline ruler.\nexport const TIMELINE_RULER_HEIGHT = 20;\n\n// Height of the power track.\nexport const TRACK_POWER_HEIGHT = 25;\nexport const TRACK_POWER_LINE_WIDTH = 2;\nexport const TRACK_POWER_DEFAULT_COLOR = 'grey';\n\n// Height of the process cpu track.\nexport const TRACK_PROCESS_CPU_HEIGHT = 25;\nexport const TRACK_PROCESS_CPU_LINE_WIDTH = 2;\n\n// JS Tracer has very high fidelity information, and needs a more fine-grained zoom.\nexport const JS_TRACER_MAXIMUM_CHART_ZOOM = 0.001;\n\n// The following values are for the visual progress tracks.\nexport const TRACK_VISUAL_PROGRESS_HEIGHT = 40;\nexport const TRACK_VISUAL_PROGRESS_LINE_WIDTH = 2;\n\n// =============================================================================\n// Storage and server-related constants\n// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// For the 2 values GOOGLE_STORAGE_BUCKET and PROFILER_SERVER_ORIGIN, several\n// values are possible, so that you can easily switch between existing server\n// (both local or remote).\n//\n// GOOGLE_STORAGE_BUCKET\n// ---------------------\n// This defines which bucket we fetch profile data at load time.\n\n// Google storage bucket, where production profile data is stored:\nexport const GOOGLE_STORAGE_BUCKET = 'profile-store';\n\n// You can also use one of the following values instead:\n// To use the bucket used by the server deployment for the main branch:\n// export const GOOGLE_STORAGE_BUCKET = 'moz-fx-dev-firefoxprofiler-bucket';\n\n// To use the bucket developers usually use on their local working copy:\n// export const GOOGLE_STORAGE_BUCKET = 'profile-store-julien-dev';\n\n// PROFILER_SERVER_ORIGIN\n// ----------------------\n// This defines our server-side endpoint. This is currently used to publish\n// profiles and manage shortlinks.\n\n// This is the production server:\n// export const PROFILER_SERVER_ORIGIN = 'https://api.profiler.firefox.com';\n\n// This is the deployment from the main branch:\n// export const PROFILER_SERVER_ORIGIN = 'https://dev.firefoxprofiler.nonprod.cloudops.mozgcp.net';\n\n// This is your local server:\nexport const PROFILER_SERVER_ORIGIN = 'http://localhost:5252';\n\n// SYMBOL_SERVER_URL\n// -----------------\n// Can be overridden with the URL parameter `symbolServer=SERVERURL`.\n// You can change this to run a local symbol server (for example using profiler-symbol-server [1])\n// and set it to e.g. 'http://localhost:8000/'.\n//\n// [1] https://github.com/mstange/profiler-symbol-server/\n\n// This is the default server.\nexport const SYMBOL_SERVER_URL = 'https://localhost:5252';\n\n// See the MarkerPhase type for more information.\nexport const INSTANT: MarkerPhase = 0;\nexport const INTERVAL: MarkerPhase = 1;\nexport const INTERVAL_START: MarkerPhase = 2;\nexport const INTERVAL_END: MarkerPhase = 3;\n", "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\nimport {\n GECKO_PROFILE_VERSION,\n PROCESSED_PROFILE_VERSION,\n} from '../app-logic/constants';\n\nimport type {\n RawProfileSharedData,\n RawThread,\n RawSamplesTable,\n FrameTable,\n RawStackTable,\n StackTable,\n FuncTable,\n RawMarkerTable,\n JsAllocationsTable,\n UnbalancedNativeAllocationsTable,\n BalancedNativeAllocationsTable,\n ResourceTable,\n NativeSymbolTable,\n Profile,\n ExtensionTable,\n CategoryList,\n JsTracerTable,\n CallNodeTable,\n SourceTable,\n} from 'firefox-profiler/types';\n\n/**\n * This module collects all of the creation of new empty profile data structures.\n */\n\nexport function getEmptyStackTable(): StackTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n frame: [],\n prefix: [],\n category: [],\n subcategory: [],\n length: 0,\n };\n}\n\nexport function getEmptySamplesTable(): RawSamplesTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n weightType: 'samples',\n weight: null,\n stack: [],\n time: [],\n length: 0,\n };\n}\n\nexport function getEmptyRawStackTable(): RawStackTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n frame: [],\n prefix: [],\n length: 0,\n };\n}\n\n/**\n * Returns an empty samples table with eventDelay field instead of responsiveness.\n * eventDelay is a new field and it replaced responsiveness. We should still\n * account for older profiles and use both of the flavors if needed.\n */\nexport function getEmptySamplesTableWithEventDelay(): RawSamplesTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n weightType: 'samples',\n weight: null,\n eventDelay: [],\n stack: [],\n time: [],\n length: 0,\n };\n}\n\nexport function getEmptyFrameTable(): FrameTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n address: [],\n inlineDepth: [],\n category: [],\n subcategory: [],\n func: [],\n nativeSymbol: [],\n innerWindowID: [],\n line: [],\n column: [],\n length: 0,\n };\n}\n\nexport function shallowCloneFrameTable(frameTable: FrameTable): FrameTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n address: frameTable.address.slice(),\n inlineDepth: frameTable.inlineDepth.slice(),\n category: frameTable.category.slice(),\n subcategory: frameTable.subcategory.slice(),\n func: frameTable.func.slice(),\n nativeSymbol: frameTable.nativeSymbol.slice(),\n innerWindowID: frameTable.innerWindowID.slice(),\n line: frameTable.line.slice(),\n column: frameTable.column.slice(),\n length: frameTable.length,\n };\n}\n\nexport function getEmptyFuncTable(): FuncTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n isJS: [],\n relevantForJS: [],\n name: [],\n resource: [],\n source: [],\n lineNumber: [],\n columnNumber: [],\n length: 0,\n };\n}\n\nexport function shallowCloneFuncTable(funcTable: FuncTable): FuncTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n isJS: funcTable.isJS.slice(),\n relevantForJS: funcTable.relevantForJS.slice(),\n name: funcTable.name.slice(),\n resource: funcTable.resource.slice(),\n source: funcTable.source.slice(),\n lineNumber: funcTable.lineNumber.slice(),\n columnNumber: funcTable.columnNumber.slice(),\n length: funcTable.length,\n };\n}\n\nexport function shallowCloneNativeSymbolTable(\n nativeSymbols: NativeSymbolTable\n): NativeSymbolTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n libIndex: nativeSymbols.libIndex.slice(),\n address: nativeSymbols.address.slice(),\n name: nativeSymbols.name.slice(),\n functionSize: nativeSymbols.functionSize.slice(),\n length: nativeSymbols.length,\n };\n}\n\nexport function getEmptyResourceTable(): ResourceTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n lib: [],\n name: [],\n host: [],\n type: [],\n length: 0,\n };\n}\n\nexport function getEmptyNativeSymbolTable(): NativeSymbolTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n libIndex: [],\n address: [],\n name: [],\n functionSize: [],\n length: 0,\n };\n}\n\nexport function getEmptyRawMarkerTable(): RawMarkerTable {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n return {\n data: [],\n name: [],\n startTime: [],\n endTime: [],\n phase: [],\n category: [],\n length: 0,\n };\n}\n\nexport function getEmptyJsAllocationsTable(): JsAllocationsTable {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n return {\n time: [],\n className: [],\n typeName: [],\n coarseType: [],\n weight: [],\n weightType: 'bytes',\n inNursery: [],\n stack: [],\n length: 0,\n };\n}\n\n/**\n * The native allocation tables come in two varieties. Get one of the members of the\n * union.\n */\nexport function getEmptyUnbalancedNativeAllocationsTable(): UnbalancedNativeAllocationsTable {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n return {\n time: [],\n weight: [],\n weightType: 'bytes',\n stack: [],\n length: 0,\n };\n}\n\n/**\n * The native allocation tables come in two varieties. Get one of the members of the\n * union.\n */\nexport function getEmptyBalancedNativeAllocationsTable(): BalancedNativeAllocationsTable {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n return {\n time: [],\n weight: [],\n weightType: 'bytes',\n stack: [],\n memoryAddress: [],\n threadId: [],\n length: 0,\n };\n}\n\nexport function shallowCloneRawMarkerTable(\n markerTable: RawMarkerTable\n): RawMarkerTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n data: markerTable.data.slice(),\n name: markerTable.name.slice(),\n startTime: markerTable.startTime.slice(),\n endTime: markerTable.endTime.slice(),\n phase: markerTable.phase.slice(),\n category: markerTable.category.slice(),\n length: markerTable.length,\n };\n}\n\nexport const resourceTypes = {\n unknown: 0,\n library: 1,\n addon: 2,\n webhost: 3,\n otherhost: 4,\n url: 5,\n};\n\nexport function getEmptyExtensions(): ExtensionTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n id: [],\n name: [],\n baseURL: [],\n length: 0,\n };\n}\n\nexport function getDefaultCategories(): CategoryList {\n return [\n // Make sure 'Other' is at index 0, as it's used as the category for stacks when no\n // categories are provided by an imported (non-Gecko profiler) profile.\n { name: 'Other', color: 'grey', subcategories: ['Other'] },\n { name: 'Idle', color: 'transparent', subcategories: ['Other'] },\n { name: 'Layout', color: 'purple', subcategories: ['Other'] },\n { name: 'JavaScript', color: 'yellow', subcategories: ['Other'] },\n { name: 'GC / CC', color: 'orange', subcategories: ['Other'] },\n { name: 'Network', color: 'lightblue', subcategories: ['Other'] },\n { name: 'Graphics', color: 'green', subcategories: ['Other'] },\n { name: 'DOM', color: 'blue', subcategories: ['Other'] },\n ];\n}\n\nexport function getEmptyJsTracerTable(): JsTracerTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n events: [],\n timestamps: [],\n durations: [],\n line: [],\n column: [],\n length: 0,\n };\n}\n\nexport function getEmptySourceTable(): SourceTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n uuid: [],\n filename: [],\n length: 0,\n };\n}\n\nexport function getEmptyThread(overrides?: Partial<RawThread>): RawThread {\n const defaultThread: RawThread = {\n processType: 'default',\n processStartupTime: 0,\n processShutdownTime: null,\n registerTime: 0,\n unregisterTime: null,\n pausedRanges: [],\n name: 'Empty',\n isMainThread: false,\n pid: '0',\n tid: 0,\n // Creating samples with event delay since it's the new samples table.\n samples: getEmptySamplesTableWithEventDelay(),\n markers: getEmptyRawMarkerTable(),\n };\n\n return {\n ...defaultThread,\n ...overrides,\n };\n}\n\nexport function getEmptySharedData(): RawProfileSharedData {\n return {\n stackTable: getEmptyRawStackTable(),\n frameTable: getEmptyFrameTable(),\n funcTable: getEmptyFuncTable(),\n resourceTable: getEmptyResourceTable(),\n nativeSymbols: getEmptyNativeSymbolTable(),\n sources: getEmptySourceTable(),\n stringArray: [],\n };\n}\n\nexport function getEmptyProfile(): Profile {\n return {\n meta: {\n interval: 1,\n startTime: 0,\n abi: '',\n misc: '',\n oscpu: '',\n platform: '',\n processType: 0,\n extensions: getEmptyExtensions(),\n categories: getDefaultCategories(),\n product: 'Firefox',\n stackwalk: 0,\n toolkit: '',\n version: GECKO_PROFILE_VERSION,\n preprocessedProfileVersion: PROCESSED_PROFILE_VERSION,\n appBuildID: '',\n sourceURL: '',\n physicalCPUs: 0,\n logicalCPUs: 0,\n CPUName: '',\n symbolicated: true,\n markerSchema: [],\n },\n libs: [],\n pages: [],\n shared: getEmptySharedData(),\n threads: [],\n };\n}\n\nexport function getEmptyCallNodeTable(): CallNodeTable {\n return {\n // Important!\n // If modifying this structure, please update all callers of this function to ensure\n // that they are pushing on correctly to the data structure. These pushes may not\n // be caught by the type system.\n prefix: new Int32Array(0),\n subtreeRangeEnd: new Uint32Array(0),\n nextSibling: new Int32Array(0),\n func: new Int32Array(0),\n category: new Int32Array(0),\n subcategory: new Int32Array(0),\n innerWindowID: new Float64Array(0),\n sourceFramesInlinedIntoSymbol: new Int32Array(0),\n depth: new Int32Array(0),\n maxDepth: -1,\n length: 0,\n };\n}\n", "/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n\nimport type { IndexIntoStringTable } from 'firefox-profiler/types';\n\nconst _cachedTables: WeakMap<string[], StringTable> = new WeakMap();\n\n/**\n * The string table manages the storing of strings. It's used to \"intern\" strings,\n * i.e. to store only one copy of each string and to manage the mapping between\n * strings and string indexes.\n *\n * Create a StringTable using `StringTable.withBackingArray(strArray)`.\n * When strings are added, `strArray` is mutated.\n * The StringTable is append-only - strings are never removed.\n *\n * Do not mutate the underlying array manually!\n * Once you call `StringTable.withBackingArray`, only use\n * `StringTable.indexForString` to add strings. Otherwise the cached table,\n * specifically the string-to-index map, will not remain in-sync with the array\n * ontents, and future callers of `StringTable.withBackingArray` might receive\n * an out-of-sync cached StringTable.\n *\n * You can clone the underlying array if you want a new array to mutate manually.\n */\nexport class StringTable {\n _array: string[];\n _stringToIndex: Map<string, IndexIntoStringTable>;\n\n /**\n * This constructor should not be called directly (other than by\n * withBackingArray) - call withBackingArray instead.\n */\n constructor(mutatedArray: string[]) {\n this._array = mutatedArray;\n this._stringToIndex = new Map();\n for (let i = 0; i < mutatedArray.length; i++) {\n this._stringToIndex.set(mutatedArray[i], i);\n }\n }\n\n /**\n * Used to create a (new or cached) StringTable.\n *\n * When strings are added, the underlying array is mutated.\n *\n * Do not mutate the array manually! Once you call `StringTable.withBackingArray`,\n * only use `StringTable.indexForString` to add strings. Otherwise the cached\n * table (specifically the string-to-index map) will not remain in-sync with the\n * array contents, and future callers of `StringTable.withBackingArray` might\n * receive an out-of-sync StringTable.\n */\n static withBackingArray(stringArray: string[]): StringTable {\n let table = _cachedTables.get(stringArray);\n if (table === undefined) {\n table = new StringTable(stringArray);\n _cachedTables.set(stringArray, table);\n }\n return table;\n }\n\n getString(index: IndexIntoStringTable, els?: string | null): string {\n if (!this.hasIndex(index)) {\n if (els) {\n console.warn(`index ${index} not in StringTable`);\n return els;\n }\n throw new Error(`index ${index} not in StringTable`);\n }\n return this._array[index];\n }\n\n hasIndex(i: IndexIntoStringTable): boolean {\n return i in this._array;\n }\n\n hasString(s: string): boolean {\n return this._stringToIndex.has(s);\n }\n\n indexForString(s: string): IndexIntoStringTable {\n let index = this._stringToIndex.get(s);\n if (index === undefined) {\n index = this._array.length;\n this._stringToIndex.set(s, index);\n this._array.push(s);\n }\n return index;\n }\n\n /**\n * Exposes the underlying array. Do not mutate the contents.\n */\n getBackingArray(): string[] {\n return this._array;\n }\n}\n", "export const SIMPLEPERF = 'SIMPLEPERF';\n\nexport function verifyMagic(magic: string, traceBuffer: Uint8Array): boolean {\n return (\n new TextDecoder('utf8').decode(traceBuffer.slice(0, magic.length)) === magic\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["assertExhaustiveCheck", "notValid", "errorMessage", "immutableUpdate", "object", "rest", "toValidTabSlug", "tabSlug", "coercedTabSlug", "ensureIsValidTabSlug", "type", "assertedType", "convertToTransformType", "coercedType", "objectEntries", "object", "objectMap", "fn", "result", "key", "value", "getObjectValuesAsUnion", "obj", "ensureExists", "item", "message", "getFirstItemFromSet", "set", "TRACK_MEMORY_DEFAULT_COLOR", "TRACK_BANDWIDTH_DEFAULT_COLOR", "TRACK_MARKER_DEFAULT_COLOR", "TRACK_POWER_DEFAULT_COLOR", "GOOGLE_STORAGE_BUCKET", "PROFILER_SERVER_ORIGIN", "SYMBOL_SERVER_URL", "getEmptyStackTable", "getEmptySamplesTable", "getEmptyRawStackTable", "getEmptySamplesTableWithEventDelay", "getEmptyFrameTable", "shallowCloneFrameTable", "frameTable", "getEmptyFuncTable", "shallowCloneFuncTable", "funcTable", "shallowCloneNativeSymbolTable", "nativeSymbols", "getEmptyResourceTable", "getEmptyNativeSymbolTable", "getEmptyRawMarkerTable", "getEmptyJsAllocationsTable", "getEmptyUnbalancedNativeAllocationsTable", "shallowCloneRawMarkerTable", "markerTable", "resourceTypes", "getEmptyExtensions", "getDefaultCategories", "getEmptySourceTable", "getEmptyThread", "overrides", "getEmptySamplesTableWithEventDelay", "getEmptyRawMarkerTable", "getEmptySharedData", "getEmptyRawStackTable", "getEmptyFrameTable", "getEmptyFuncTable", "getEmptyResourceTable", "getEmptyNativeSymbolTable", "getEmptyProfile", "getEmptyExtensions", "getDefaultCategories", "getEmptyCallNodeTable", "_cachedTables", "StringTable", "_StringTable", "mutatedArray", "i", "stringArray", "table", "index", "els", "s", "SIMPLEPERF", "verifyMagic", "magic", "traceBuffer"]
7
+ }
data/dist/contribute.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "repository": {
5
5
  "url": "https://github.com/firefox-devtools/profiler",
6
6
  "license": "MPL2",
7
- "tests": "https://circleci.com/gh/firefox-devtools/profiler"
7
+ "tests": "https://github.com/firefox-devtools/profiler/actions"
8
8
  },
9
9
  "participate": {
10
10
  "home": "https://github.com/firefox-devtools/profiler/blob/main/CONTRIBUTING.md",
@@ -0,0 +1 @@
1
+ @import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600");*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}img.emoji{height:1.2em}img.emoji,span.emoji{vertical-align:middle}span.emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1.2em}.progress{background-color:#42b983;background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:#42b983;color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:#42b983;color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative;cursor:pointer}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:#42b983;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30;cursor:pointer}.sidebar-toggle:hover .sidebar-toggle-button{opacity:.4}.sidebar-toggle span{background-color:#42b983;background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:80%;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;min-height:100vh;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave .56s ease-in-out}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{position:relative;align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;min-height:100vh;width:100%;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;bottom:0;width:100%}section.cover .cover-main{flex:1;margin:0 16px;text-align:center;position:relative}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid #42b983;border-color:var(--theme-color,#42b983);box-sizing:border-box;color:#42b983;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:#42b983;background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:#42b983;color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid #42b983;border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code,.markdown-section output:after,.markdown-section pre{font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section code,.markdown-section pre{background-color:#f8f8f8}.markdown-section output,.markdown-section pre{margin:1.2em 0;position:relative}.markdown-section output,.markdown-section pre>code{border-radius:2px;display:block}.markdown-section output:after,.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.markdown-section code{border-radius:2px;color:#e96900;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code{font-size:.8rem}.markdown-section pre{padding:0 1.4rem;line-height:1.5rem;overflow:auto;word-wrap:normal}.markdown-section pre>code{color:#525252;font-size:.8rem;padding:2.2em 5px;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;white-space:inherit}.markdown-section output{padding:1.7rem 1.4rem;border:1px dotted #ccc}.markdown-section output>:first-child{margin-top:0}.markdown-section output>:last-child{margin-bottom:0}.markdown-section code:after,.markdown-section code:before,.markdown-section output:after,.markdown-section output:before{letter-spacing:.05rem}.markdown-section output:after,.markdown-section pre:after{color:#ccc;font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0;content:attr(data-lang)}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:#42b983;color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:#42b983;color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto}
@@ -74,6 +74,18 @@ Merging takes a call node and removes it from the call tree. Any self time for t
74
74
 
75
75
  Focusing on a function or call node removes all of the ancestor call nodes—the children call nodes remain. If a stack does not contain that function or node, then it is removed. This effectively focuses on a subtree or a set of subtrees on the call tree.
76
76
 
77
+ ### Focus on Function Self
78
+
79
+ Focus on function self is similar to focus on function, but more restrictive: it only keeps samples where the focused function is the innermost implementation-filtered frame. This helps you analyze where within a function the self time is being spent, by removing samples where the function is calling other code.
80
+
81
+ For example, if you focus-self on a JavaScript function with the JS implementation filter, you'll only see samples where that JS function has self time, and any native (C++) calls below it will be shown as descendants. This is particularly useful for:
82
+
83
+ - Finding which parts of a function are slow (by looking at the assembly or source lines)
84
+ - Understanding what engine internals are being called by a JS function (by switching implementation filter after focusing)
85
+ - Eliminating noise from code your function calls, to concentrate on the function's own execution
86
+
87
+ If the same function appears multiple times in a stack (recursion), only the innermost instance is kept as the root.
88
+
77
89
  ### Focus on Category
78
90
 
79
91
  Focusing on the nodes that belong to the same category as the selected node, thereby merging all nodes that belong to another category.
@@ -6,7 +6,9 @@ Get to know Firefox Profiler UI a bit better with a tour that highlights various
6
6
 
7
7
  ![A screenshot highlighting the panels on the lower half of the UI.](images/ui-tour-panels.png)
8
8
 
9
- The timeline lists multiple threads, while the panels provide an analysis of the currently selected thread in the timeline. The panel only uses one thread at a time by default. However it's possible to merge several threads together by using the `Ctrl` keyboard key when clicking a thread.
9
+ The timeline lists multiple threads, while the panels provide an analysis of the currently selected thread in the timeline.
10
+ The panel only uses one thread at a time by default.
11
+ However, it's possible to merge several threads together by using the `⌘`/`Ctrl` keyboard key when clicking a thread.
10
12
 
11
13
  ## The Call Tree
12
14
 
@@ -75,12 +77,25 @@ Web Developers can add their own markers using [performance.mark](https://develo
75
77
  [performance.measure](https://developer.mozilla.org/en-US/docs/Web/API/Performance/measure). Gecko Developers can look at [this comprehensive
76
78
  documentation](https://firefox-source-docs.mozilla.org/tools/profiler/markers-guide.html) to add their new markers.
77
79
 
80
+ Markers can be filtered with a comma-separated list of search terms. Each term
81
+ can be a substring to match, `key:substring` to match more specifically,
82
+ or `-key:substring` to drop anything matching. (`-substring` will not work;
83
+ negative matches require a `key`.) Valid `key` values are: `name`, `cat` (for
84
+ marker category), `type` (for markers with payload objects), and any marker
85
+ payload field key declared in the marker's schema.
86
+
87
+ Example: `DOM,cat:GC,-name:CSS` will match anything with DOM in its category,
88
+ name, type, or any field, plus anything with "GC" in its category,
89
+ but omitting markers with "CSS" anywhere in their names.
90
+
78
91
  ## The Marker Table
79
92
 
80
93
  This panel provide a table view to the same data as the marker chart. Its
81
94
  strength is that by searching it's possibly faster to display the payload
82
95
  information for several markers at once.
83
96
 
97
+ Filtering works the same as in the Marker Chart.
98
+
84
99
  ## The Network Chart
85
100
 
86
101
  ![A screenshot of the network chart](images/ui-tour-panels-network-chart.png)
data/dist/docs/index.html CHANGED
@@ -9,16 +9,15 @@
9
9
  content="Documentation related to the Firefox Profiler, a tool to record and visualize profile."
10
10
  />
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <link rel="stylesheet" href="css/vue_v4.12.2.min.css" />
12
+ <link rel="stylesheet" href="css/vue_v4.13.1.min.css" />
13
13
  <link rel="stylesheet" href="css/style-overrides.css" />
14
14
  </head>
15
15
  <body>
16
16
  <div id="app"></div>
17
17
  <script src="js/init.js"></script>
18
- <!-- This includes a fix in docsify for pages with more than 1 video.
19
- See https://github.com/docsifyjs/docsify/pull/1824 -->
20
- <script src="js/docsify_v4.12.2+.min.js"></script>
21
- <script src="js/ga_v4.12.2.min.js"></script>
22
- <script src="js/search_v4.12.2.min.js"></script>
18
+ <!-- This includes a fix in docsify for escaping HTML in search keywords.
19
+ See https://github.com/docsifyjs/docsify/pull/2586 -->
20
+ <script src="js/docsify_v4.13.1+.min.js"></script>
21
+ <script src="js/search_v4.13.1+.min.js"></script>
23
22
  </body>
24
23
  </html>