Bug 1333126: plugin crash tests now wait properly for crash handling; r=gsvelto

MozReview-Commit-ID: 70AvBYhCKnE

--HG--
extra : rebase_source : 78ff19d2bf6d119a3d6d488fa198a5f6731dcf5e
This commit is contained in:
Carl Corcoran 2017-08-18 11:25:05 +02:00
parent bbf7c0b952
commit ca2d011a97
2 changed files with 38 additions and 0 deletions

View File

@ -1,4 +1,5 @@
Cu.import("resource://gre/modules/CrashSubmit.jsm", this);
Cu.import("resource://gre/modules/PromiseUtils.jsm");
const SERVER_URL = "http://example.com/browser/toolkit/crashreporter/test/browser/crashreport.sjs";
@ -6,6 +7,8 @@ var gTestRoot = getRootDirectory(gTestPath).replace("chrome://mochitests/content
var gTestBrowser = null;
var config = {};
let gRegisteredCrashObserver = null;
add_task(async function() {
// The test harness sets MOZ_CRASHREPORTER_NO_REPORT, which disables plugin
// crash reports. This test needs them enabled. The test also needs a mock
@ -27,6 +30,9 @@ add_task(async function() {
registerCleanupFunction(async function() {
Services.prefs.clearUserPref("dom.ipc.plugins.timeoutSecs");
if (gRegisteredCrashObserver !== null) {
Services.obs.removeObserver(gRegisteredCrashObserver, "plugin-crashed");
}
env.set("MOZ_CRASHREPORTER_NO_REPORT", noReport);
env.set("MOZ_CRASHREPORTER_URL", serverUrl);
env = null;
@ -113,6 +119,25 @@ add_task(async function() {
});
add_task(async function() {
// Since this test doesn't actually submit a crash report, we can't await
// on crashReportStatus. This ensures the crash handling mechanism is
// completely finished before exiting the test.
let crashObserverDeferred = PromiseUtils.defer();
gRegisteredCrashObserver = (subject, topic, data) => {
if (topic != "plugin-crashed") {
return;
}
let propBag = subject.QueryInterface(Ci.nsIPropertyBag2);
let minidumpID = propBag.getPropertyAsAString("pluginDumpID");
Services.crashmanager.ensureCrashIsPresent(minidumpID).then(() => {
crashObserverDeferred.resolve();
});
};
Services.obs.addObserver(gRegisteredCrashObserver, "plugin-crashed");
config = {
shouldSubmissionUIBeVisible: false,
comment: "",
@ -141,6 +166,8 @@ add_task(async function() {
Assert.equal(!!pleaseSubmit && content.getComputedStyle(pleaseSubmit).display == "block",
aConfig.shouldSubmissionUIBeVisible, "Plugin crash UI should not be visible");
});
await crashObserverDeferred.promise;
});
function promisePluginCrashed() {

View File

@ -1,6 +1,8 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
Cu.import("resource://gre/modules/PromiseUtils.jsm");
/**
* With e10s, plugins must run in their own process. This means we have
* three processes at a minimum when we're running a plugin:
@ -79,6 +81,9 @@ function preparePlugin(browser, pluginFallbackState) {
});
}
// Allows tests to ensure crash handling is completely finished before exiting.
let crashObserverDeferred = PromiseUtils.defer();
add_task(async function setup() {
// Bypass click-to-play
setTestPluginEnabledState(Ci.nsIPluginTag.STATE_ENABLED);
@ -108,6 +113,10 @@ add_task(async function setup() {
pluginDumpFile.remove(false);
extraFile.remove(false);
// Resolve and replace the deferred object so the next test can wait on it
crashObserverDeferred.resolve();
crashObserverDeferred = PromiseUtils.defer();
});
};
@ -183,6 +192,7 @@ add_task(async function testChromeHearsPluginCrashFirst() {
"Should have been showing crash report UI");
});
await BrowserTestUtils.closeWindow(win);
await crashObserverDeferred.promise;
});
/**
@ -253,4 +263,5 @@ add_task(async function testContentHearsCrashFirst() {
});
await BrowserTestUtils.closeWindow(win);
await crashObserverDeferred.promise;
});