summaryrefslogtreecommitdiffstats
path: root/tools/profiler/tests/browser/browser_test_feature_preferencereads.js
blob: ff1b869a4738e4999f5bdb315517d1eb70853a29 (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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

requestLongerTimeout(10);

function countDpiPrefReadsInThread(thread) {
  let count = 0;
  for (let payload of getPayloadsOfType(thread, "PreferenceRead")) {
    if (payload.prefName === "layout.css.dpi") {
      count++;
    }
  }
  return count;
}

async function waitForPaintAfterLoad() {
  return SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
    return new Promise(function(resolve) {
      function listener() {
        if (content.document.readyState == "complete") {
          content.requestAnimationFrame(() => content.setTimeout(resolve, 0));
        }
      }
      if (content.document.readyState != "complete") {
        content.document.addEventListener("readystatechange", listener);
      } else {
        listener();
      }
    });
  });
}

/**
 * Test the PreferenceRead feature.
 */
add_task(async function test_profile_feature_preferencereads() {
  if (!AppConstants.MOZ_GECKO_PROFILER) {
    return;
  }
  Assert.ok(
    !Services.profiler.IsActive(),
    "The profiler is not currently active"
  );

  startProfiler({ features: ["threads", "leaf", "preferencereads"] });

  const url = BASE_URL + "fixed_height.html";
  await BrowserTestUtils.withNewTab(url, async contentBrowser => {
    const contentPid = await SpecialPowers.spawn(
      contentBrowser,
      [],
      () => Services.appinfo.processID
    );

    await waitForPaintAfterLoad();

    // Check that some PreferenceRead profile markers were generated when the
    // feature is enabled.
    {
      const { contentThread } = await stopProfilerNowAndGetThreads(contentPid);

      const timesReadDpiInContent = countDpiPrefReadsInThread(contentThread);

      Assert.greater(
        timesReadDpiInContent,
        0,
        "PreferenceRead profile markers for layout.css.dpi were recorded " +
          "when the PreferenceRead feature was turned on."
      );
    }

    startProfiler({ features: ["threads", "leaf"] });
    // Now reload the tab with a clean run.
    await ContentTask.spawn(contentBrowser, null, () => {
      return new Promise(resolve => {
        addEventListener("pageshow", () => resolve(), {
          capturing: true,
          once: true,
        });
        content.location.reload();
      });
    });

    await waitForPaintAfterLoad();

    // Check that no PreferenceRead markers were recorded when the feature
    // is turned off.
    {
      const {
        parentThread,
        contentThread,
      } = await stopProfilerNowAndGetThreads(contentPid);
      Assert.equal(
        getPayloadsOfType(parentThread, "PreferenceRead").length,
        0,
        "No PreferenceRead profile markers for layout.css.dpi were recorded " +
          "when the PreferenceRead feature was turned on."
      );

      Assert.equal(
        getPayloadsOfType(contentThread, "PreferenceRead").length,
        0,
        "No PreferenceRead profile markers for layout.css.dpi were recorded " +
          "when the PreferenceRead feature was turned on."
      );
    }
  });
});