blob: eebcf4d38398ad023b2125e42126f0efa8f3038e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/* import-globals-from ../shared-head.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/tools/profiler/tests/browser/shared-head.js",
this
);
const { BrowserTestUtils } = ChromeUtils.import(
"resource://testing-common/BrowserTestUtils.jsm"
);
const BASE_URL = "http://example.com/browser/tools/profiler/tests/browser/";
registerCleanupFunction(() => {
if (Services.profiler.IsActive()) {
info(
"The profiler was found to still be running at the end of the test, which means that some error likely occured. Let's stop it to prevent issues with following tests!"
);
Services.profiler.StopProfiler();
}
});
/**
* This is a helper function that will stop the profiler of the browser running
* with PID contentPid.
* This happens immediately, without waiting for any sampling to happen or
* finish. Use stopProfilerAndGetThreads (without "Now") below instead to wait
* for samples before stopping.
*
* @param {number} contentPid
* @returns {Promise}
*/
async function stopProfilerNowAndGetThreads(contentPid) {
const profile = await Services.profiler.getProfileDataAsync();
Services.profiler.StopProfiler();
const parentThread = profile.threads[0];
const contentProcess = profile.processes.find(
p => p.threads[0].pid == contentPid
);
if (!contentProcess) {
throw new Error("Could not find the content process.");
}
const contentThread = contentProcess.threads[0];
if (!parentThread) {
throw new Error("The parent thread was not found in the profile.");
}
if (!contentThread) {
throw new Error("The content thread was not found in the profile.");
}
return { parentThread, contentThread };
}
/**
* This is a helper function that will stop the profiler of the browser running
* with PID contentPid.
* As opposed to stopProfilerNowAndGetThreads (with "Now") above, the profiler
* in that PID will not stop until there is at least one periodic sample taken.
*
* @param {number} contentPid
* @returns {Promise}
*/
async function stopProfilerAndGetThreads(contentPid) {
await Services.profiler.waitOnePeriodicSampling();
return stopProfilerNowAndGetThreads(contentPid);
}
|