browsertime 19.3.1 → 21.0.0

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 (225) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +9 -8
  3. package/bin/browsertime.js +9 -3
  4. package/browserscripts/pageinfo/interactionToNextPaintInfo.js +170 -143
  5. package/browserscripts/timings/interactionToNextPaint.js +49 -137
  6. package/lib/chrome/webdriver/setupChromiumOptions.js +0 -9
  7. package/lib/core/engine/collector.js +11 -0
  8. package/lib/core/engine/command/actions.js +52 -0
  9. package/lib/core/engine/command/addText.js +48 -30
  10. package/lib/core/engine/command/android.js +43 -4
  11. package/lib/core/engine/command/cache.js +39 -2
  12. package/lib/core/engine/command/chromeDevToolsProtocol.js +51 -1
  13. package/lib/core/engine/command/chromeTrace.js +34 -0
  14. package/lib/core/engine/command/click.js +102 -52
  15. package/lib/core/engine/command/debug.js +19 -2
  16. package/lib/core/engine/command/element.js +66 -0
  17. package/lib/core/engine/command/geckoProfiler.js +41 -1
  18. package/lib/core/engine/command/javaScript.js +43 -20
  19. package/lib/core/engine/command/measure.js +151 -19
  20. package/lib/core/engine/command/meta.js +17 -0
  21. package/lib/core/engine/command/mouse/clickAndHold.js +56 -29
  22. package/lib/core/engine/command/mouse/contextClick.js +30 -11
  23. package/lib/core/engine/command/mouse/doubleClick.js +35 -11
  24. package/lib/core/engine/command/mouse/mouseMove.js +38 -16
  25. package/lib/core/engine/command/mouse/singleClick.js +187 -12
  26. package/lib/core/engine/command/navigation.js +31 -3
  27. package/lib/core/engine/command/screenshot.js +33 -0
  28. package/lib/core/engine/command/scroll.js +35 -13
  29. package/lib/core/engine/command/select.js +55 -36
  30. package/lib/core/engine/command/set.js +51 -36
  31. package/lib/core/engine/command/stopWatch.js +30 -9
  32. package/lib/core/engine/command/switch.js +49 -11
  33. package/lib/core/engine/command/wait.js +50 -25
  34. package/lib/core/engine/commands.js +267 -0
  35. package/lib/core/engine/context.js +81 -0
  36. package/lib/core/engine/index.js +6 -2
  37. package/lib/core/engine/iteration.js +20 -102
  38. package/lib/firefox/geckoProfiler.js +49 -1
  39. package/lib/firefox/webdriver/builder.js +35 -12
  40. package/lib/firefox/webdriver/firefox.js +1 -1
  41. package/lib/support/cli.js +35 -15
  42. package/lib/support/engineUtils.js +13 -1
  43. package/lib/support/statistics.js +11 -1
  44. package/lib/support/userTiming.js +2 -2
  45. package/package.json +17 -8
  46. package/types/android/index.d.ts +70 -0
  47. package/types/android/index.d.ts.map +1 -0
  48. package/types/chrome/parseCpuTrace.d.ts +21 -0
  49. package/types/chrome/parseCpuTrace.d.ts.map +1 -0
  50. package/types/chrome/traceCategoriesParser.d.ts +2 -0
  51. package/types/chrome/traceCategoriesParser.d.ts.map +1 -0
  52. package/types/chrome/webdriver/traceUtilities.d.ts +8 -0
  53. package/types/chrome/webdriver/traceUtilities.d.ts.map +1 -0
  54. package/types/core/engine/command/action.d.ts +73 -0
  55. package/types/core/engine/command/action.d.ts.map +1 -0
  56. package/types/core/engine/command/actions.d.ts +38 -0
  57. package/types/core/engine/command/actions.d.ts.map +1 -0
  58. package/types/core/engine/command/addText.d.ts +68 -0
  59. package/types/core/engine/command/addText.d.ts.map +1 -0
  60. package/types/core/engine/command/android.d.ts +39 -0
  61. package/types/core/engine/command/android.d.ts.map +1 -0
  62. package/types/core/engine/command/cache.d.ts +53 -0
  63. package/types/core/engine/command/cache.d.ts.map +1 -0
  64. package/types/core/engine/command/chromeDevToolsProtocol.d.ts +61 -0
  65. package/types/core/engine/command/chromeDevToolsProtocol.d.ts.map +1 -0
  66. package/types/core/engine/command/chromeTrace.d.ts +45 -0
  67. package/types/core/engine/command/chromeTrace.d.ts.map +1 -0
  68. package/types/core/engine/command/click.d.ts +151 -0
  69. package/types/core/engine/command/click.d.ts.map +1 -0
  70. package/types/core/engine/command/debug.d.ts +28 -0
  71. package/types/core/engine/command/debug.d.ts.map +1 -0
  72. package/types/core/engine/command/element.d.ts +49 -0
  73. package/types/core/engine/command/element.d.ts.map +1 -0
  74. package/types/core/engine/command/geckoProfiler.d.ts +46 -0
  75. package/types/core/engine/command/geckoProfiler.d.ts.map +1 -0
  76. package/types/core/engine/command/javaScript.d.ts +63 -0
  77. package/types/core/engine/command/javaScript.d.ts.map +1 -0
  78. package/types/core/engine/command/measure.d.ts +194 -0
  79. package/types/core/engine/command/measure.d.ts.map +1 -0
  80. package/types/core/engine/command/meta.d.ts +23 -0
  81. package/types/core/engine/command/meta.d.ts.map +1 -0
  82. package/types/core/engine/command/mouse/clickAndHold.d.ts +82 -0
  83. package/types/core/engine/command/mouse/clickAndHold.d.ts.map +1 -0
  84. package/types/core/engine/command/mouse/contextClick.d.ts +44 -0
  85. package/types/core/engine/command/mouse/contextClick.d.ts.map +1 -0
  86. package/types/core/engine/command/mouse/doubleClick.d.ts +51 -0
  87. package/types/core/engine/command/mouse/doubleClick.d.ts.map +1 -0
  88. package/types/core/engine/command/mouse/index.d.ts +6 -0
  89. package/types/core/engine/command/mouse/index.d.ts.map +1 -0
  90. package/types/core/engine/command/mouse/mouseMove.d.ts +56 -0
  91. package/types/core/engine/command/mouse/mouseMove.d.ts.map +1 -0
  92. package/types/core/engine/command/mouse/singleClick.d.ts +115 -0
  93. package/types/core/engine/command/mouse/singleClick.d.ts.map +1 -0
  94. package/types/core/engine/command/navigation.d.ts +45 -0
  95. package/types/core/engine/command/navigation.d.ts.map +1 -0
  96. package/types/core/engine/command/screenshot.d.ts +33 -0
  97. package/types/core/engine/command/screenshot.d.ts.map +1 -0
  98. package/types/core/engine/command/scroll.d.ts +52 -0
  99. package/types/core/engine/command/scroll.d.ts.map +1 -0
  100. package/types/core/engine/command/select.d.ts +81 -0
  101. package/types/core/engine/command/select.d.ts.map +1 -0
  102. package/types/core/engine/command/set.d.ts +74 -0
  103. package/types/core/engine/command/set.d.ts.map +1 -0
  104. package/types/core/engine/command/stopWatch.d.ts +49 -0
  105. package/types/core/engine/command/stopWatch.d.ts.map +1 -0
  106. package/types/core/engine/command/switch.d.ts +77 -0
  107. package/types/core/engine/command/switch.d.ts.map +1 -0
  108. package/types/core/engine/command/util/lcpHighlightScript.d.ts +2 -0
  109. package/types/core/engine/command/util/lcpHighlightScript.d.ts.map +1 -0
  110. package/types/core/engine/command/util/lsHighlightScript.d.ts +2 -0
  111. package/types/core/engine/command/util/lsHighlightScript.d.ts.map +1 -0
  112. package/types/core/engine/command/wait.d.ts +74 -0
  113. package/types/core/engine/command/wait.d.ts.map +1 -0
  114. package/types/core/engine/commands.d.ts +161 -0
  115. package/types/core/engine/commands.d.ts.map +1 -0
  116. package/types/core/engine/context.d.ts +87 -0
  117. package/types/core/engine/context.d.ts.map +1 -0
  118. package/types/firefox/geckoProfiler.d.ts +11 -0
  119. package/types/firefox/geckoProfiler.d.ts.map +1 -0
  120. package/types/firefox/settings/geckoProfilerDefaults.d.ts +8 -0
  121. package/types/firefox/settings/geckoProfilerDefaults.d.ts.map +1 -0
  122. package/types/scripting.d.ts +2 -0
  123. package/types/support/engineUtils.d.ts +5 -0
  124. package/types/support/engineUtils.d.ts.map +1 -0
  125. package/types/support/errors.d.ts +15 -0
  126. package/types/support/errors.d.ts.map +1 -0
  127. package/types/support/fileUtil.d.ts +10 -0
  128. package/types/support/fileUtil.d.ts.map +1 -0
  129. package/types/support/filters.d.ts +7 -0
  130. package/types/support/filters.d.ts.map +1 -0
  131. package/types/support/getViewPort.d.ts +2 -0
  132. package/types/support/getViewPort.d.ts.map +1 -0
  133. package/types/support/pathToFolder.d.ts +2 -0
  134. package/types/support/pathToFolder.d.ts.map +1 -0
  135. package/types/support/storageManager.d.ts +17 -0
  136. package/types/support/storageManager.d.ts.map +1 -0
  137. package/types/support/tcpdump.d.ts +10 -0
  138. package/types/support/tcpdump.d.ts.map +1 -0
  139. package/types/support/userTiming.d.ts +2 -0
  140. package/types/support/userTiming.d.ts.map +1 -0
  141. package/types/support/util.d.ts +6 -0
  142. package/types/support/util.d.ts.map +1 -0
  143. package/types/video/defaults.d.ts +7 -0
  144. package/types/video/defaults.d.ts.map +1 -0
  145. package/types/video/postprocessing/finetune/addTextToVideo.d.ts +2 -0
  146. package/types/video/postprocessing/finetune/addTextToVideo.d.ts.map +1 -0
  147. package/types/video/postprocessing/finetune/convertFps.d.ts +2 -0
  148. package/types/video/postprocessing/finetune/convertFps.d.ts.map +1 -0
  149. package/types/video/postprocessing/finetune/getFont.d.ts +2 -0
  150. package/types/video/postprocessing/finetune/getFont.d.ts.map +1 -0
  151. package/types/video/postprocessing/finetune/getTimingMetrics.d.ts +2 -0
  152. package/types/video/postprocessing/finetune/getTimingMetrics.d.ts.map +1 -0
  153. package/types/video/postprocessing/finetune/index.d.ts +2 -0
  154. package/types/video/postprocessing/finetune/index.d.ts.map +1 -0
  155. package/types/video/postprocessing/finetune/removeOrange.d.ts +2 -0
  156. package/types/video/postprocessing/finetune/removeOrange.d.ts.map +1 -0
  157. package/types/video/postprocessing/visualmetrics/extraMetrics.d.ts +5 -0
  158. package/types/video/postprocessing/visualmetrics/extraMetrics.d.ts.map +1 -0
  159. package/types/video/postprocessing/visualmetrics/getVideoMetrics.d.ts +5 -0
  160. package/types/video/postprocessing/visualmetrics/getVideoMetrics.d.ts.map +1 -0
  161. package/types/video/postprocessing/visualmetrics/visualMetrics.d.ts +3 -0
  162. package/types/video/postprocessing/visualmetrics/visualMetrics.d.ts.map +1 -0
  163. package/types/video/screenRecording/android/recorder.d.ts +11 -0
  164. package/types/video/screenRecording/android/recorder.d.ts.map +1 -0
  165. package/types/video/screenRecording/desktop/convert.d.ts +2 -0
  166. package/types/video/screenRecording/desktop/convert.d.ts.map +1 -0
  167. package/types/video/screenRecording/desktop/desktopRecorder.d.ts +28 -0
  168. package/types/video/screenRecording/desktop/desktopRecorder.d.ts.map +1 -0
  169. package/types/video/screenRecording/desktop/ffmpegRecorder.d.ts +17 -0
  170. package/types/video/screenRecording/desktop/ffmpegRecorder.d.ts.map +1 -0
  171. package/types/video/screenRecording/desktop/osx/getSPDisplaysDataType.d.ts +2 -0
  172. package/types/video/screenRecording/desktop/osx/getSPDisplaysDataType.d.ts.map +1 -0
  173. package/types/video/screenRecording/desktop/osx/getScreen.d.ts +2 -0
  174. package/types/video/screenRecording/desktop/osx/getScreen.d.ts.map +1 -0
  175. package/types/video/screenRecording/firefox/firefoxWindowRecorder.d.ts +13 -0
  176. package/types/video/screenRecording/firefox/firefoxWindowRecorder.d.ts.map +1 -0
  177. package/types/video/screenRecording/ios/convertToMp4.d.ts +2 -0
  178. package/types/video/screenRecording/ios/convertToMp4.d.ts.map +1 -0
  179. package/types/video/screenRecording/ios/iosRecorder.d.ts +14 -0
  180. package/types/video/screenRecording/ios/iosRecorder.d.ts.map +1 -0
  181. package/types/video/screenRecording/iosSimulator/convertToMp4.d.ts +2 -0
  182. package/types/video/screenRecording/iosSimulator/convertToMp4.d.ts.map +1 -0
  183. package/types/video/screenRecording/iosSimulator/recorder.d.ts +9 -0
  184. package/types/video/screenRecording/iosSimulator/recorder.d.ts.map +1 -0
  185. package/types/video/screenRecording/recorder.d.ts +7 -0
  186. package/types/video/screenRecording/recorder.d.ts.map +1 -0
  187. package/types/video/screenRecording/setOrangeBackground.d.ts +2 -0
  188. package/types/video/screenRecording/setOrangeBackground.d.ts.map +1 -0
  189. package/types/video/video.d.ts +41 -0
  190. package/types/video/video.d.ts.map +1 -0
  191. package/CONTRIBUTING.md +0 -24
  192. package/browsersupport/firefox-profile/cert9.db +0 -0
  193. package/browsersupport/firefox-profile/chrome/userChrome.css +0 -4
  194. package/browsersupport/firefox-profile/key4.db +0 -0
  195. package/docs/examples/README.md +0 -9
  196. package/docs/examples/advance.md +0 -12
  197. package/docs/examples/android.md +0 -54
  198. package/docs/examples/basic.md +0 -36
  199. package/docs/examples/chrome.md +0 -28
  200. package/docs/examples/firefox.md +0 -10
  201. package/docs/issues.md +0 -18
  202. package/docs/new-style-script-objects.md +0 -38
  203. package/docs/sequence-diagrams/loadAndWait.wsd +0 -24
  204. package/docs/sequence-diagrams/run.wsd +0 -24
  205. package/vendor/mac/x86/qvh +0 -0
  206. package/visualmetrics/__init__.py +0 -1
  207. package/visualmetrics/test_data/ms_000000.png +0 -0
  208. package/visualmetrics/test_data/ms_000920.png +0 -0
  209. package/visualmetrics/test_data/ms_001000.png +0 -0
  210. package/visualmetrics/test_data/ms_001080.png +0 -0
  211. package/visualmetrics/test_data/ms_001200.png +0 -0
  212. package/visualmetrics/test_data/ms_001240.png +0 -0
  213. package/visualmetrics/test_data/ms_001280.png +0 -0
  214. package/visualmetrics/test_data/ms_001360.png +0 -0
  215. package/visualmetrics/test_data/ms_001400.png +0 -0
  216. package/visualmetrics/test_data/ms_001520.png +0 -0
  217. package/visualmetrics/test_data/ms_002040.png +0 -0
  218. package/visualmetrics/test_data/ms_002600.png +0 -0
  219. package/visualmetrics/test_data/ms_003160.png +0 -0
  220. package/visualmetrics/test_data/ms_003720.png +0 -0
  221. package/visualmetrics/test_data/ms_004280.png +0 -0
  222. package/visualmetrics/test_data/ms_004880.png +0 -0
  223. package/visualmetrics/test_data/ms_005440.png +0 -0
  224. package/visualmetrics/test_data/ms_006000.png +0 -0
  225. package/visualmetrics/test_visualmetrics.py +0 -34
@@ -0,0 +1,87 @@
1
+ /**
2
+ * @typedef {Object} Logger
3
+ * @property {function(string): void} trace - Function to log trace messages.
4
+ * @property {function(string): void} verbose - Function to log verbose messages.
5
+ * @property {function(string): void} info - Function to log info messages.
6
+ * @property {function(string): void} warn - Function to log warning messages.
7
+ * @property {function(string): void} error - Function to log error messages.
8
+ * @property {function(string): void} critical - Function to log critical messages.
9
+ */
10
+ /**
11
+ * @typedef {typeof import('selenium-webdriver')} WebDriverClass
12
+ * @typedef {import('selenium-webdriver').WebDriver} WebDriverInstance
13
+ */
14
+ /**
15
+ * Class representing the context of a Browsertime run.
16
+ * @hideconstructor
17
+ * @class
18
+ */
19
+ export class Context {
20
+ constructor(options: any, result: any, log: any, storageManager: any, index: any, webdriver: any, instantiatedDriver: any);
21
+ /**
22
+ * This is the yargs object you get from the cli. If you add --my.id you can get that using options.my.id.
23
+ * @type {Object}
24
+ */
25
+ options: any;
26
+ /**
27
+ * Here the result from each run is stored.
28
+ * @type {Object}
29
+ */
30
+ result: any;
31
+ /**
32
+ * @type {Logger}
33
+ */
34
+ log: Logger;
35
+ /**
36
+ * The index of the iteration.
37
+ * @type {number}
38
+ */
39
+ index: number;
40
+ /**
41
+ * Storage manager to save things to disk.
42
+ * @type {import('../../support/storageManager.js').StorageManager}
43
+ */
44
+ storageManager: import('../../support/storageManager.js').StorageManager;
45
+ /**
46
+ * @type {Object}
47
+ */
48
+ taskData: any;
49
+ /**
50
+ * Get raw Selenium functionality.
51
+ * @see https://www.selenium.dev/selenium/docs/api/javascript/module/selenium-webdriver/index.html
52
+ * @type {{webdriver: WebDriverClass, driver: WebDriverInstance}}
53
+ */
54
+ selenium: {
55
+ webdriver: typeof import("selenium-webdriver");
56
+ driver: import("selenium-webdriver").WebDriver;
57
+ };
58
+ }
59
+ export type Logger = {
60
+ /**
61
+ * - Function to log trace messages.
62
+ */
63
+ trace: (arg0: string) => void;
64
+ /**
65
+ * - Function to log verbose messages.
66
+ */
67
+ verbose: (arg0: string) => void;
68
+ /**
69
+ * - Function to log info messages.
70
+ */
71
+ info: (arg0: string) => void;
72
+ /**
73
+ * - Function to log warning messages.
74
+ */
75
+ warn: (arg0: string) => void;
76
+ /**
77
+ * - Function to log error messages.
78
+ */
79
+ error: (arg0: string) => void;
80
+ /**
81
+ * - Function to log critical messages.
82
+ */
83
+ critical: (arg0: string) => void;
84
+ };
85
+ export type WebDriverClass = typeof import('selenium-webdriver');
86
+ export type WebDriverInstance = import('selenium-webdriver').WebDriver;
87
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../lib/core/engine/context.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AAEH;;;;GAIG;AACH;IACE,2HA0DC;IAjDC;;;OAGG;IACH,aAAsB;IAEtB;;;OAGG;IACH,YAAoB;IAEpB;;OAEG;IACH,KAFU,MAAM,CAEF;IAEd;;;OAGG;IACH,OAFU,MAAM,CAEE;IAElB;;;OAGG;IACH,gBAFU,OAAO,iCAAiC,EAAE,cAAc,CAE9B;IAEpC;;OAEG;IACH,cAAkB;IAElB;;;;OAIG;IACH;;;MASC;CAEJ;;;;;kBA9EsB,MAAM,KAAG,IAAI;;;;oBACb,MAAM,KAAG,IAAI;;;;iBACb,MAAM,KAAG,IAAI;;;;iBACb,MAAM,KAAG,IAAI;;;;kBACb,MAAM,KAAG,IAAI;;;;qBACb,MAAM,KAAG,IAAI;;6BAIvB,cAAc,oBAAoB,CAAC;gCACnC,OAAO,oBAAoB,EAAE,SAAS"}
@@ -0,0 +1,11 @@
1
+ export class GeckoProfiler {
2
+ constructor(runner: any, storageManager: any, options: any);
3
+ runner: any;
4
+ storageManager: any;
5
+ firefoxConfig: any;
6
+ options: any;
7
+ start(): Promise<any>;
8
+ stop(index: any, url: any, result: any): Promise<void>;
9
+ addMetaData(): void;
10
+ }
11
+ //# sourceMappingURL=geckoProfiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geckoProfiler.d.ts","sourceRoot":"","sources":["../../lib/firefox/geckoProfiler.js"],"names":[],"mappings":"AAmDA;IACE,4DAKC;IAJC,YAAoB;IACpB,oBAAoC;IACpC,mBAAoC;IACpC,aAAsB;IAGxB,sBA2FC;IAED,uDAgGC;IAED,oBAAgB;CACjB"}
@@ -0,0 +1,8 @@
1
+ export namespace geckoProfilerDefaults {
2
+ let features: string;
3
+ let threads: string;
4
+ let desktopSamplingInterval: number;
5
+ let androidSamplingInterval: number;
6
+ let bufferSize: number;
7
+ }
8
+ //# sourceMappingURL=geckoProfilerDefaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geckoProfilerDefaults.d.ts","sourceRoot":"","sources":["../../../lib/firefox/settings/geckoProfilerDefaults.js"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { Context as BrowsertimeContext } from './core/engine/context';
2
+ export { Commands as BrowsertimeCommands } from './core/engine/commands';
@@ -0,0 +1,5 @@
1
+ export function loadPrePostScripts(scripts: any, options: any): Promise<any[]>;
2
+ export function loadPageCompleteScript(script: any): Promise<any>;
3
+ export function loadScript(script: any, options: any, throwError: any): Promise<any>;
4
+ export function timestamp(): string;
5
+ //# sourceMappingURL=engineUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineUtils.d.ts","sourceRoot":"","sources":["../../lib/support/engineUtils.js"],"names":[],"mappings":"AAgFA,+EAOC;AAED,kEAKC;AAED,qFAKC;AACD,oCAEC"}
@@ -0,0 +1,15 @@
1
+ export class BrowsertimeError extends Error {
2
+ constructor(message: any, extra: any);
3
+ extra: any;
4
+ }
5
+ export class BrowserError extends BrowsertimeError {
6
+ }
7
+ export class UrlLoadError extends BrowsertimeError {
8
+ constructor(message: any, url: any, extra: any);
9
+ url: any;
10
+ }
11
+ export class TimeoutError extends BrowsertimeError {
12
+ constructor(message: any, url: any, extra: any);
13
+ url: any;
14
+ }
15
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../lib/support/errors.js"],"names":[],"mappings":"AAAA;IACE,sCAIC;IAFC,WAAwB;CAG3B;AAED;CAIC;AAED;IACE,gDAGC;IADC,SAAc;CAEjB;AAED;IACE,gDAGC;IADC,SAAc;CAEjB"}
@@ -0,0 +1,10 @@
1
+ export function rename(old: any, newName: any): Promise<void>;
2
+ export function copyFileSync(source: any, destination: any): void;
3
+ export function removeFileSync(fileName: any): Promise<void>;
4
+ export function copyFile(source: any, destination: any): Promise<void>;
5
+ export function removeFile(fileName: any): Promise<void>;
6
+ export function readFile(fileName: any): Promise<Buffer>;
7
+ export function removeDirAndFiles(dirName: any): Promise<void>;
8
+ export function removeByType(dir: any, type: any): Promise<void>;
9
+ export function findFiles(dir: any, filter: any): Promise<string[]>;
10
+ //# sourceMappingURL=fileUtil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUtil.d.ts","sourceRoot":"","sources":["../../lib/support/fileUtil.js"],"names":[],"mappings":"AAwBA,8DAEC;AAED,kEAEC;AAED,6DAEC;AAED,uEAEC;AACD,yDAEC;AACD,yDAEC;AACD,+DAqBC;AACD,iEAUC;AACD,oEAMC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Filters to use with Array.prototype.filter, e.g. ['/a/path', '/another/path'].filter(onlyFiles)
3
+ */
4
+ export function onlyWithExtension(extension: any): (filepath: any) => boolean;
5
+ export function onlyFiles(filepath: any): Promise<boolean>;
6
+ export function onlyDirectories(filepath: any): Promise<boolean>;
7
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../lib/support/filters.js"],"names":[],"mappings":"AAKA;;GAEG;AACH,8EAEC;AACD,2DAGC;AACD,iEAGC"}
@@ -0,0 +1,2 @@
1
+ export function getViewPort(options: any): any;
2
+ //# sourceMappingURL=getViewPort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getViewPort.d.ts","sourceRoot":"","sources":["../../lib/support/getViewPort.js"],"names":[],"mappings":"AA+BA,+CAkCC"}
@@ -0,0 +1,2 @@
1
+ export function pathToFolder(url: any, options: any): string;
2
+ //# sourceMappingURL=pathToFolder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathToFolder.d.ts","sourceRoot":"","sources":["../../lib/support/pathToFolder.js"],"names":[],"mappings":"AAWA,6DAwDC"}
@@ -0,0 +1,17 @@
1
+ export class StorageManager {
2
+ constructor(url: any, { resultDir, prettyPrint }?: {
3
+ resultDir: any;
4
+ prettyPrint?: boolean;
5
+ });
6
+ baseDir: string;
7
+ jsonIndentation: number;
8
+ createDataDir(): Promise<string>;
9
+ createSubDataDir(...name: any[]): Promise<string>;
10
+ rm(filename: any): Promise<void>;
11
+ writeData(filename: any, data: any, subdir: any): Promise<string>;
12
+ writeJson(filename: any, json: any, shouldGzip: any): Promise<string>;
13
+ readData(filename: any, subdir: any): Promise<string | Buffer>;
14
+ gzip(inputFile: any, outputFile: any, removeInput: any): Promise<any>;
15
+ get directory(): string;
16
+ }
17
+ //# sourceMappingURL=storageManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storageManager.d.ts","sourceRoot":"","sources":["../../lib/support/storageManager.js"],"names":[],"mappings":"AAmDA;IACE;;;OAKC;IAJC,gBAEyD;IACzD,wBAA0C;IAG5C,iCAGC;IAED,kDAIC;IAED,iCAEC;IAED,kEASC;IAED,sEAQC;IAED,+DAcC;IAED,sEAmBC;IAED,wBAEC;CACF"}
@@ -0,0 +1,10 @@
1
+ export class TCPDump {
2
+ constructor(directory: any, options: any);
3
+ baseDir: any;
4
+ options: any;
5
+ start(iteration: any): Promise<void>;
6
+ tcpdumpProcess: import("execa").ExecaChildProcess<string>;
7
+ stop(): Promise<import("execa").ExecaReturnValue<string>>;
8
+ mv(url: any, iteration: any): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=tcpdump.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcpdump.d.ts","sourceRoot":"","sources":["../../lib/support/tcpdump.js"],"names":[],"mappings":"AAKA;IACE,0CAGC;IAFC,aAAwB;IACxB,aAAsB;IAExB,qCAsBC;IADC,0DAA+C;IAEjD,0DAEC;IAED,4CAQC;CACF"}
@@ -0,0 +1,2 @@
1
+ export function filterAllowlisted(userTimings: any, allowlistRegex: any): void;
2
+ //# sourceMappingURL=userTiming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userTiming.d.ts","sourceRoot":"","sources":["../../lib/support/userTiming.js"],"names":[],"mappings":"AAAA,+EAMC"}
@@ -0,0 +1,6 @@
1
+ export function formatMetric(name: any, metric: any, multiple: any, inMs: any, extras: any): string;
2
+ export function logResultLogLine(results: any): void;
3
+ export function toArray(arrayLike: any): any[];
4
+ export function jsonifyVisualProgress(visualProgress: any): any;
5
+ export function adjustVisualProgressTimestamps(visualProgress: any, profilerStartTime: any, recordingStartTime: any): any;
6
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../lib/support/util.js"],"names":[],"mappings":"AAIA,oGAeC;AACD,qDA0LC;AACD,+CAQC;AACD,gEAeC;AACD,0HAWC"}
@@ -0,0 +1,7 @@
1
+ export const framerate: 30;
2
+ export const crf: 23;
3
+ export const xvfbDisplay: 99;
4
+ export const addTimer: true;
5
+ export const convert: true;
6
+ export const threads: 0;
7
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../lib/video/defaults.js"],"names":[],"mappings":"AAAA,2BAA4B;AAC5B,qBAAsB;AACtB,6BAA8B;AAC9B,4BAA6B;AAC7B,2BAA4B;AAC5B,wBAAyB"}
@@ -0,0 +1,2 @@
1
+ export function addTextToVideo(inputFile: any, outputFile: any, videoMetrics: any, timingMetrics: any, options: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ //# sourceMappingURL=addTextToVideo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addTextToVideo.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/finetune/addTextToVideo.js"],"names":[],"mappings":"AAgBA,wKAiCC"}
@@ -0,0 +1,2 @@
1
+ export function convert(source: any, destination: any, framerate: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ //# sourceMappingURL=convertFps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertFps.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/finetune/convertFps.js"],"names":[],"mappings":"AAIA,0HAWC"}
@@ -0,0 +1,2 @@
1
+ export function getFont(options: any): string;
2
+ //# sourceMappingURL=getFont.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFont.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/finetune/getFont.js"],"names":[],"mappings":"AACA,8CA6BC"}
@@ -0,0 +1,2 @@
1
+ export function getTimingMetrics(videoMetrics: any, timingMetrics: any, options: any): string;
2
+ //# sourceMappingURL=getTimingMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTimingMetrics.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/finetune/getTimingMetrics.js"],"names":[],"mappings":"AAgCA,8FAsDC"}
@@ -0,0 +1,2 @@
1
+ export function finetuneVideo(videoDir: any, videoPath: any, index: any, videoMetrics: any, timingMetrics: any, options: any): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/finetune/index.js"],"names":[],"mappings":"AAmBA,6IAmEC"}
@@ -0,0 +1,2 @@
1
+ export function removeOrange(inputFile: any, outputFile: any, newStart: any, visualMetrics: any, options: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ //# sourceMappingURL=removeOrange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeOrange.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/finetune/removeOrange.js"],"names":[],"mappings":"AAIA,kKAkBC"}
@@ -0,0 +1,5 @@
1
+ export function extraMetrics(metrics: any): {
2
+ videoRecordingStart: any;
3
+ visualMetrics: any;
4
+ };
5
+ //# sourceMappingURL=extraMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraMetrics.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/visualmetrics/extraMetrics.js"],"names":[],"mappings":"AAAA;;;EA8CC"}
@@ -0,0 +1,5 @@
1
+ export function getVideoMetrics(videoDir: any, filmstripDir: any, videoPath: any, index: any, visualElements: any, storageManager: any, pageNumber: any, visitedPageNumber: any, options: any): Promise<{
2
+ videoRecordingStart: any;
3
+ visualMetrics: any;
4
+ }>;
5
+ //# sourceMappingURL=getVideoMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVideoMetrics.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/visualmetrics/getVideoMetrics.js"],"names":[],"mappings":"AAMA;;;GA+CC"}
@@ -0,0 +1,3 @@
1
+ export function checkDependencies(options: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ export function run(videoPath: any, imageDirPath: any, elementsFile: any, videoDir: any, index: any, pageNumber: any, visitedPageNumber: any, options: any): Promise<any>;
3
+ //# sourceMappingURL=visualMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualMetrics.d.ts","sourceRoot":"","sources":["../../../../lib/video/postprocessing/visualmetrics/visualMetrics.js"],"names":[],"mappings":"AAsCA,mGAEC;AACD,0KAiHC"}
@@ -0,0 +1,11 @@
1
+ export class AndroidRecorder {
2
+ constructor(options: any);
3
+ waitTime: any;
4
+ framerate: any;
5
+ options: any;
6
+ start(): Promise<any>;
7
+ android: Android;
8
+ stop(destination: any): Promise<any>;
9
+ }
10
+ import { Android } from '../../../android/index.js';
11
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/android/recorder.js"],"names":[],"mappings":"AAUA;IACE,0BAIC;IAHC,cAAsE;IACtE,eAAiE;IACjE,aAAsB;IAGxB,sBAGC;IAFC,iBAAwC;IAI1C,qCAgBC;CACF;wBAlCuB,2BAA2B"}
@@ -0,0 +1,2 @@
1
+ export function convert(source: any, destination: any, crf: any, threads: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/desktop/convert.js"],"names":[],"mappings":"AAIA,kIAwBC"}
@@ -0,0 +1,28 @@
1
+ export class DesktopRecorder {
2
+ constructor(options: any);
3
+ display: any;
4
+ framerate: any;
5
+ nice: any;
6
+ crf: any;
7
+ convert: any;
8
+ threads: any;
9
+ viewPort: any;
10
+ taskset: any;
11
+ origin: string;
12
+ offset: {
13
+ x: number;
14
+ y: number;
15
+ };
16
+ options: any;
17
+ start(file: any): Promise<{
18
+ filePath: any;
19
+ ffmpegProcess: any;
20
+ }>;
21
+ filePath: any;
22
+ recording: Promise<{
23
+ filePath: any;
24
+ ffmpegProcess: any;
25
+ }>;
26
+ stop(destination: any): Promise<void>;
27
+ }
28
+ //# sourceMappingURL=desktopRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktopRecorder.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/desktop/desktopRecorder.js"],"names":[],"mappings":"AAkBA;IACE,0BAYC;IAXC,aAA8D;IAC9D,eAAkE;IAClE,UAA+C;IAC/C,SAAgD;IAChD,aAA4D;IAC5D,aAA4D;IAC5D,cAAoC;IACpC,aAAkD;IAClD,eAAmB;IACnB;;;MAA4B;IAC5B,aAAsB;IAGxB;;;OAiBC;IAhBC,cAAoB;IAEpB;;;OAWE;IAKJ,sCA8BC;CACF"}
@@ -0,0 +1,17 @@
1
+ export function start({ display, origin, size, filePath, offset, framerate, crf, nice, threads, taskset }: {
2
+ display: any;
3
+ origin: any;
4
+ size: any;
5
+ filePath: any;
6
+ offset: any;
7
+ framerate: any;
8
+ crf: any;
9
+ nice: any;
10
+ threads: any;
11
+ taskset: any;
12
+ }): Promise<{
13
+ filePath: any;
14
+ ffmpegProcess: any;
15
+ }>;
16
+ export function stop(recording: any): Promise<any>;
17
+ //# sourceMappingURL=ffmpegRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ffmpegRecorder.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/desktop/ffmpegRecorder.js"],"names":[],"mappings":"AAsIA;;;;;;;;;;;;;;GAiCC;AACD,mDAaC"}
@@ -0,0 +1,2 @@
1
+ export function getSPDisplaysDataType(): Promise<string>;
2
+ //# sourceMappingURL=getSPDisplaysDataType.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getSPDisplaysDataType.d.ts","sourceRoot":"","sources":["../../../../../lib/video/screenRecording/desktop/osx/getSPDisplaysDataType.js"],"names":[],"mappings":"AAEA,yDAKC"}
@@ -0,0 +1,2 @@
1
+ export function getScreenOnOSX(): Promise<string>;
2
+ //# sourceMappingURL=getScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getScreen.d.ts","sourceRoot":"","sources":["../../../../../lib/video/screenRecording/desktop/osx/getScreen.js"],"names":[],"mappings":"AAIA,kDA0BC"}
@@ -0,0 +1,13 @@
1
+ export class FirefoxWindowRecorder {
2
+ constructor(options: any, browser: any, baseDir: any);
3
+ options: any;
4
+ browser: any;
5
+ baseDir: any;
6
+ recordingStartTime: any;
7
+ timeToFirstFrame: number;
8
+ start(): Promise<any>;
9
+ android: Android;
10
+ stop(destination: any): Promise<void>;
11
+ }
12
+ import { Android } from '../../../android/index.js';
13
+ //# sourceMappingURL=firefoxWindowRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firefoxWindowRecorder.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/firefox/firefoxWindowRecorder.js"],"names":[],"mappings":"AAqJA;IACE,sDAMC;IALC,aAAsB;IACtB,aAAsB;IACtB,aAAsB;IACtB,wBAAmC;IACnC,yBAAiC;IAGnC,sBAYC;IARG,iBAAwC;IAU5C,sCAgCC;CACF;wBAjM4C,2BAA2B"}
@@ -0,0 +1,2 @@
1
+ export function convert(source: any, destination: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ //# sourceMappingURL=convertToMp4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertToMp4.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/ios/convertToMp4.js"],"names":[],"mappings":"AAIA,0GAiBC"}
@@ -0,0 +1,14 @@
1
+ export class IOSRecorder {
2
+ static activate(): Promise<NodeJS.WriteStream & {
3
+ fd: 1;
4
+ }>;
5
+ constructor(options: any, baseDir: any);
6
+ options: any;
7
+ uuid: any;
8
+ tmpVideo: string;
9
+ tmpSound: string;
10
+ start(): Promise<void>;
11
+ qvhProcessProcess: import("execa").ExecaChildProcess<string>;
12
+ stop(destination: any): Promise<import("execa").ExecaReturnValue<string>>;
13
+ }
14
+ //# sourceMappingURL=iosRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iosRecorder.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/ios/iosRecorder.js"],"names":[],"mappings":"AAeA;IAQE;;OAMC;IAbD,wCAKC;IAJC,aAAsB;IACtB,UAAqC;IACrC,iBAAyC;IACzC,iBAAwC;IAW1C,uBAqBC;IAlBC,6DAQC;IAYH,0EAaC;CACF"}
@@ -0,0 +1,2 @@
1
+ export function convert(source: any, destination: any): Promise<import("execa").ExecaReturnValue<string>>;
2
+ //# sourceMappingURL=convertToMp4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertToMp4.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/iosSimulator/convertToMp4.js"],"names":[],"mappings":"AAIA,0GAiBC"}
@@ -0,0 +1,9 @@
1
+ export class IOSSimulatorRecorder {
2
+ constructor(options: any, baseDir: any);
3
+ options: any;
4
+ tmpVideo: string;
5
+ start(): Promise<void>;
6
+ xcrunProcess: import("execa").ExecaChildProcess<string>;
7
+ stop(destination: any): Promise<import("execa").ExecaReturnValue<string>>;
8
+ }
9
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../../../lib/video/screenRecording/iosSimulator/recorder.js"],"names":[],"mappings":"AAUA;IACE,wCAGC;IAFC,aAAsB;IACtB,iBAA6C;IAG/C,uBAUC;IAPC,wDAMC;IAGH,0EAWC;CACF"}
@@ -0,0 +1,7 @@
1
+ export function getRecorder(options: any, browser: any, baseDir: any): AndroidRecorder | DesktopRecorder | FirefoxWindowRecorder | IOSSimulatorRecorder | IOSRecorder;
2
+ import { AndroidRecorder } from './android/recorder.js';
3
+ import { DesktopRecorder } from './desktop/desktopRecorder.js';
4
+ import { FirefoxWindowRecorder } from './firefox/firefoxWindowRecorder.js';
5
+ import { IOSSimulatorRecorder } from './iosSimulator/recorder.js';
6
+ import { IOSRecorder } from './ios/iosRecorder.js';
7
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../../../lib/video/screenRecording/recorder.js"],"names":[],"mappings":"AAOA,sKA0BC;gCAhC+B,uBAAuB;gCACvB,8BAA8B;sCACxB,oCAAoC;qCACrC,4BAA4B;4BACrC,sBAAsB"}
@@ -0,0 +1,2 @@
1
+ export function setOrangeBackground(driver: any): Promise<any>;
2
+ //# sourceMappingURL=setOrangeBackground.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setOrangeBackground.d.ts","sourceRoot":"","sources":["../../../lib/video/screenRecording/setOrangeBackground.js"],"names":[],"mappings":"AAGA,+DAyBC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Create a new Video that handles everything with the video
3
+ * @class
4
+ */
5
+ export class Video {
6
+ constructor(storageManager: any, options: any, browser: any);
7
+ options: any;
8
+ storageManager: any;
9
+ tmpDir: any;
10
+ recorder: import("./screenRecording/android/recorder.js").AndroidRecorder | import("./screenRecording/desktop/desktopRecorder.js").DesktopRecorder | import("./screenRecording/firefox/firefoxWindowRecorder.js").FirefoxWindowRecorder | import("./screenRecording/iosSimulator/recorder.js").IOSSimulatorRecorder | import("./screenRecording/ios/iosRecorder.js").IOSRecorder;
11
+ isRecording: boolean;
12
+ setupDirs(index: any, url: any): Promise<void>;
13
+ index: any;
14
+ videoDir: any;
15
+ filmstripDir: any;
16
+ /**
17
+ * Start recoding a video.
18
+ * @returns {Promise} Promise object that represents when the video started
19
+ */
20
+ record(pageNumber: any, index: any, visitedPageNumber: any): Promise<any>;
21
+ pageNumber: any;
22
+ visitedPageNumber: any;
23
+ /**
24
+ * Stop recording the video.
25
+ * @returns {Promise} Promise object that represents when the video stopped
26
+ */
27
+ stop(url: any): Promise<any>;
28
+ videoPath: string;
29
+ cleanup(): Promise<void>;
30
+ /**
31
+ Post process video: get visual metrics, finetune the video and remove it
32
+ if you don't want it
33
+ */
34
+ postProcessing(timingMetrics: any, visualElements: any): Promise<{
35
+ videoRecordingStart: any;
36
+ visualMetrics: any;
37
+ }>;
38
+ getRecordingStartTime(): any;
39
+ getTimeToFirstFrame(): any;
40
+ }
41
+ //# sourceMappingURL=video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../lib/video/video.js"],"names":[],"mappings":"AAQA;;;GAGG;AACH;IACE,6DAMC;IALC,aAAsB;IACtB,oBAAoC;IACpC,YAAsC;IACtC,iXAA0D;IAC1D,qBAAwB;IAG1B,+CAeC;IAbC,WAAkB;IAElB,cAEC;IAMD,kBAEC;IAGH;;;OAGG;IACH,0EAUC;IATC,gBAA4B;IAE5B,uBAA0C;IAS5C;;;OAGG;IACH,6BAUC;IARC,kBAKC;IAKH,yBAUC;IAED;;;OAGG;IACH;;;OA0BC;IAED,6BAEC;IAED,2BAEC;CACF"}
package/CONTRIBUTING.md DELETED
@@ -1,24 +0,0 @@
1
- # How to contribute
2
- Browser Time (it's browser time!) needs help from the users so please contribute!
3
-
4
- ## Making changes
5
- If you want help out, that's great! Check the issue list and see if there's something there you want to do and drop Peter a note so we know and we can help you get into the project.
6
- - Create a new branch for your change
7
- - Make commits of logical units and write an informative message
8
- - Make sure you have added the tests needed for your change
9
- - Run all the tests to make sure you haven't broken anything else (it happens to the best!)
10
-
11
- ## Add a defect
12
- First, check the defect/bug list https://github.com/sitespeedio/browsertime/issues?q=is%3Aissue+is%3Aopen+label%3Abug to make sure that it hasn't been filed yet.
13
-
14
- If you find a defect, please file a bug report and follow the instructions in https://www.sitespeed.io/documentation/sitespeed.io/bug-report/
15
-
16
- If you have the skills & the time, it is perfect if you send a pull request with a fix, that helps me alot!
17
-
18
- ## Add a change request/new functionality request
19
- If you have an idea or something that you want Browser Time to handle, add an issue and lets discuss it there. Ideas/changes/requests are very very welcome!
20
-
21
-
22
- Thanks for your support & time!
23
-
24
- Peter