summaryrefslogtreecommitdiffstats
path: root/browser/modules/test/browser_ProcessHangNotifications.js
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /browser/modules/test/browser_ProcessHangNotifications.js
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'browser/modules/test/browser_ProcessHangNotifications.js')
-rw-r--r--browser/modules/test/browser_ProcessHangNotifications.js189
1 files changed, 189 insertions, 0 deletions
diff --git a/browser/modules/test/browser_ProcessHangNotifications.js b/browser/modules/test/browser_ProcessHangNotifications.js
new file mode 100644
index 000000000..597be611a
--- /dev/null
+++ b/browser/modules/test/browser_ProcessHangNotifications.js
@@ -0,0 +1,189 @@
+
+Cu.import("resource://gre/modules/UpdateUtils.jsm");
+
+function getNotificationBox(aWindow) {
+ return aWindow.document.getElementById("high-priority-global-notificationbox");
+}
+
+function promiseNotificationShown(aWindow, aName) {
+ return new Promise((resolve) => {
+ let notification = getNotificationBox(aWindow);
+ notification.addEventListener("AlertActive", function active() {
+ notification.removeEventListener("AlertActive", active, true);
+ is(notification.allNotifications.length, 1, "Notification Displayed.");
+ resolve(notification);
+ });
+ });
+}
+
+function promiseReportCallMade(aValue) {
+ return new Promise((resolve) => {
+ let old = gTestHangReport.testCallback;
+ gTestHangReport.testCallback = function (val) {
+ gTestHangReport.testCallback = old;
+ is(aValue, val, "was the correct method call made on the hang report object?");
+ resolve();
+ };
+ });
+}
+
+function pushPrefs(...aPrefs) {
+ return new Promise((resolve) => {
+ SpecialPowers.pushPrefEnv({"set": aPrefs}, resolve);
+ resolve();
+ });
+}
+
+function popPrefs() {
+ return new Promise((resolve) => {
+ SpecialPowers.popPrefEnv(resolve);
+ resolve();
+ });
+}
+
+let gTestHangReport = {
+ SLOW_SCRIPT: 1,
+ PLUGIN_HANG: 2,
+
+ TEST_CALLBACK_CANCELED: 1,
+ TEST_CALLBACK_TERMSCRIPT: 2,
+ TEST_CALLBACK_TERMPLUGIN: 3,
+
+ _hangType: 1,
+ _tcb: function (aCallbackType) {},
+
+ get hangType() {
+ return this._hangType;
+ },
+
+ set hangType(aValue) {
+ this._hangType = aValue;
+ },
+
+ set testCallback(aValue) {
+ this._tcb = aValue;
+ },
+
+ QueryInterface: function (aIID) {
+ if (aIID.equals(Components.interfaces.nsIHangReport) ||
+ aIID.equals(Components.interfaces.nsISupports))
+ return this;
+ throw Components.results.NS_NOINTERFACE;
+ },
+
+ userCanceled: function () {
+ this._tcb(this.TEST_CALLBACK_CANCELED);
+ },
+
+ terminateScript: function () {
+ this._tcb(this.TEST_CALLBACK_TERMSCRIPT);
+ },
+
+ terminatePlugin: function () {
+ this._tcb(this.TEST_CALLBACK_TERMPLUGIN);
+ },
+
+ isReportForBrowser: function(aFrameLoader) {
+ return true;
+ }
+};
+
+// on dev edition we add a button for js debugging of hung scripts.
+let buttonCount = (UpdateUtils.UpdateChannel == "aurora" ? 3 : 2);
+
+/**
+ * Test if hang reports receive a terminate script callback when the user selects
+ * stop in response to a script hang.
+ */
+
+add_task(function* terminateScriptTest() {
+ let promise = promiseNotificationShown(window, "process-hang");
+ Services.obs.notifyObservers(gTestHangReport, "process-hang-report", null);
+ let notification = yield promise;
+
+ let buttons = notification.currentNotification.getElementsByTagName("button");
+ // Fails on aurora on-push builds, bug 1232204
+ // is(buttons.length, buttonCount, "proper number of buttons");
+
+ // Click the "Stop It" button, we should get a terminate script callback
+ gTestHangReport.hangType = gTestHangReport.SLOW_SCRIPT;
+ promise = promiseReportCallMade(gTestHangReport.TEST_CALLBACK_TERMSCRIPT);
+ buttons[0].click();
+ yield promise;
+});
+
+/**
+ * Test if hang reports receive user canceled callbacks after a user selects wait
+ * and the browser frees up from a script hang on its own.
+ */
+
+add_task(function* waitForScriptTest() {
+ let promise = promiseNotificationShown(window, "process-hang");
+ Services.obs.notifyObservers(gTestHangReport, "process-hang-report", null);
+ let notification = yield promise;
+
+ let buttons = notification.currentNotification.getElementsByTagName("button");
+ // Fails on aurora on-push builds, bug 1232204
+ // is(buttons.length, buttonCount, "proper number of buttons");
+
+ yield pushPrefs(["browser.hangNotification.waitPeriod", 1000]);
+
+ function nocbcheck() {
+ ok(false, "received a callback?");
+ }
+ let oldcb = gTestHangReport.testCallback;
+ gTestHangReport.testCallback = nocbcheck;
+ // Click the "Wait" button this time, we shouldn't get a callback at all.
+ buttons[1].click();
+ gTestHangReport.testCallback = oldcb;
+
+ // send another hang pulse, we should not get a notification here
+ Services.obs.notifyObservers(gTestHangReport, "process-hang-report", null);
+ is(notification.currentNotification, null, "no notification should be visible");
+
+ gTestHangReport.testCallback = function() {};
+ Services.obs.notifyObservers(gTestHangReport, "clear-hang-report", null);
+ gTestHangReport.testCallback = oldcb;
+
+ yield popPrefs();
+});
+
+/**
+ * Test if hang reports receive user canceled callbacks after the content
+ * process stops sending hang notifications.
+ */
+
+add_task(function* hangGoesAwayTest() {
+ yield pushPrefs(["browser.hangNotification.expiration", 1000]);
+
+ let promise = promiseNotificationShown(window, "process-hang");
+ Services.obs.notifyObservers(gTestHangReport, "process-hang-report", null);
+ yield promise;
+
+ promise = promiseReportCallMade(gTestHangReport.TEST_CALLBACK_CANCELED);
+ Services.obs.notifyObservers(gTestHangReport, "clear-hang-report", null);
+ yield promise;
+
+ yield popPrefs();
+});
+
+/**
+ * Tests if hang reports receive a terminate plugin callback when the user selects
+ * stop in response to a plugin hang.
+ */
+
+add_task(function* terminatePluginTest() {
+ let promise = promiseNotificationShown(window, "process-hang");
+ Services.obs.notifyObservers(gTestHangReport, "process-hang-report", null);
+ let notification = yield promise;
+
+ let buttons = notification.currentNotification.getElementsByTagName("button");
+ // Fails on aurora on-push builds, bug 1232204
+ // is(buttons.length, buttonCount, "proper number of buttons");
+
+ // Click the "Stop It" button, we should get a terminate script callback
+ gTestHangReport.hangType = gTestHangReport.PLUGIN_HANG;
+ promise = promiseReportCallMade(gTestHangReport.TEST_CALLBACK_TERMPLUGIN);
+ buttons[0].click();
+ yield promise;
+});