fune/toolkit/components/perfmonitoring/tests/browser/browser_webpagePerformanceAlerts.js
Andrew Halberstadt d2109610fb Bug 1385352 - Enable 'mozilla/no-arbitrary-setTimeout' eslint rule on browser-chrome tests, r=standard8
MozReview-Commit-ID: 5lO0uAjHMsw

--HG--
extra : rebase_source : 8607b3964da207a6076c79b6f1d75b40503cdd7d
2017-08-10 14:48:21 -04:00

114 lines
5.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* eslint-disable mozilla/no-arbitrary-setTimeout */
"use strict";
/**
* Tests for PerformanceWatcher watching slow web pages.
*/
/**
* Simulate a slow webpage.
*/
function WebpageBurner() {
CPUBurner.call(this, "http://example.com/browser/toolkit/components/perfmonitoring/tests/browser/browser_compartments.html?test=" + Math.random(), 300000);
}
WebpageBurner.prototype = Object.create(CPUBurner.prototype);
WebpageBurner.prototype.promiseBurnContentCPU = function() {
return promiseContentResponse(this._browser, "test-performance-watcher:burn-content-cpu", {});
};
function WebpageListener(windowId, accept) {
info(`Creating WebpageListener for ${windowId}`);
AlertListener.call(this, accept, {
register: () => PerformanceWatcher.addPerformanceListener({windowId}, this.listener),
unregister: () => PerformanceWatcher.removePerformanceListener({windowId}, this.listener)
});
}
WebpageListener.prototype = Object.create(AlertListener.prototype);
add_task(async function init() {
// Get rid of buffering.
let service = Cc["@mozilla.org/toolkit/performance-stats-service;1"].getService(
Ci.nsIPerformanceStatsService);
let oldDelay = service.jankAlertBufferingDelay;
service.jankAlertBufferingDelay = 0 /* ms */;
registerCleanupFunction(() => {
info("Cleanup");
service.jankAlertBufferingDelay = oldDelay;
});
});
add_task(async function test_open_window_then_watch_it() {
let burner = new WebpageBurner();
await burner.promiseInitialized;
await burner.promiseBurnContentCPU();
info(`Check that burning CPU triggers the real listener, but not the fake listener`);
let realListener = new WebpageListener(burner.windowId, (group, details) => {
info(`test: realListener for ${burner.tab.linkedBrowser.outerWindowID}: ${group}, ${details}\n`);
Assert.equal(group.windowId, burner.windowId, "We should not receive data meant for another group");
return details;
}); // This listener should be triggered.
info(`Creating fake burner`);
let otherTab = BrowserTestUtils.addTab(gBrowser);
await BrowserTestUtils.browserLoaded(otherTab.linkedBrowser);
info(`Check that burning CPU triggers the real listener, but not the fake listener`);
let fakeListener = new WebpageListener(otherTab.linkedBrowser.outerWindowID, group => group.windowId == burner.windowId); // This listener should never be triggered.
let universalListener = new WebpageListener(0, alerts =>
alerts.find(alert => alert.source.windowId == burner.windowId)
);
// Waiting a little listeners are buffered.
await new Promise(resolve => setTimeout(resolve, 100));
await burner.run("promiseBurnContentCPU", 20, realListener);
Assert.ok(realListener.triggered, `1. The real listener was triggered`);
Assert.ok(universalListener.triggered, `1. The universal listener was triggered`);
Assert.ok(!fakeListener.triggered, `1. The fake listener was not triggered`);
if (realListener.result) {
Assert.ok(realListener.result.highestJank >= 300, `1. jank is at least 300ms (${realListener.result.highestJank}ms)`);
}
info(`Attempting to remove a performance listener incorrectly, check that this does not hurt our real listener`);
Assert.throws(() => PerformanceWatcher.removePerformanceListener({windowId: burner.windowId}, () => {}),
/No listener for target/, "should throw an error for a different listener");
Assert.throws(() => PerformanceWatcher.removePerformanceListener({windowId: burner.windowId + "-unbound-id-" + Math.random()}, realListener.listener),
/No listener for target/, "should throw an error for a different window id");
// Waiting a little listeners are buffered.
await new Promise(resolve => setTimeout(resolve, 100));
await burner.run("promiseBurnContentCPU", 20, realListener);
// Waiting a little listeners are buffered.
await new Promise(resolve => setTimeout(resolve, 100));
Assert.ok(realListener.triggered, `2. The real listener was triggered`);
Assert.ok(universalListener.triggered, `2. The universal listener was triggered`);
Assert.ok(!fakeListener.triggered, `2. The fake listener was not triggered`);
if (realListener.result) {
Assert.ok(realListener.result.highestJank >= 300, `2. jank is at least 300ms (${realListener.jank}ms)`);
}
info(`Attempting to remove correctly, check if the listener is still triggered`);
// Waiting a little listeners are buffered.
await new Promise(resolve => setTimeout(resolve, 100));
realListener.unregister();
// Waiting a little listeners are buffered.
await new Promise(resolve => setTimeout(resolve, 100));
await burner.run("promiseBurnContentCPU", 3, realListener);
Assert.ok(!realListener.triggered, `3. After being unregistered, the real listener was not triggered`);
Assert.ok(universalListener.triggered, `3. The universal listener is still triggered`);
universalListener.unregister();
// Waiting a little listeners are buffered.
await new Promise(resolve => setTimeout(resolve, 100));
await burner.run("promiseBurnContentCPU", 3, realListener);
Assert.ok(!universalListener.triggered, `4. After being unregistered, the universal listener is not triggered`);
fakeListener.unregister();
burner.dispose();
gBrowser.removeTab(otherTab);
});