diff options
Diffstat (limited to 'dom/ipc/tests/test_CrashService_crash.html')
-rw-r--r-- | dom/ipc/tests/test_CrashService_crash.html | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/dom/ipc/tests/test_CrashService_crash.html b/dom/ipc/tests/test_CrashService_crash.html new file mode 100644 index 000000000..a1d9b938d --- /dev/null +++ b/dom/ipc/tests/test_CrashService_crash.html @@ -0,0 +1,95 @@ +<!DOCTYPE HTML> +<html> +<!-- +Ensures that content crashes are reported to the crash service +(nsICrashService and CrashManager.jsm). +--> +<head> + <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +</head> +<body> + +<script type="application/javascript;version=1.7"> +"use strict"; + +SimpleTest.waitForExplicitFinish(); +SimpleTest.requestFlakyTimeout("untriaged"); +SpecialPowers.addPermission("browser", true, document); +SpecialPowers.pushPrefEnv({'set':[ + ["dom.mozBrowserFramesEnabled", true], + ["network.disable.ipc.security", true], + ["dom.ipc.tabs.disabled", false] +]}, function () { + + var iframe = document.createElementNS('http://www.w3.org/1999/xhtml', 'iframe'); + iframe.setAttribute("remote", "true"); + SpecialPowers.wrap(iframe).mozbrowser = true; + document.documentElement.appendChild(iframe); + + SimpleTest.expectChildProcessCrash(); + + var crashMan = + SpecialPowers.Cu.import("resource://gre/modules/Services.jsm"). + Services.crashmanager; + + // First, clear the crash record store. + info("Waiting for pruneOldCrashes"); + var future = new Date(Date.now() + 1000 * 60 * 60 * 24); + crashMan.pruneOldCrashes(future).then(function () { + + var crashDateMS = Date.now(); + + // Inject a frame script that crashes the content process. + var mm = SpecialPowers.getBrowserFrameMessageManager(iframe); + mm.loadFrameScript('data:,new ' + function ContentScriptScope() { + let Cu = Components.utils; + Cu.import("resource://gre/modules/ctypes.jsm"); + let crash = function() { + let zero = new ctypes.intptr_t(8); + let badptr = ctypes.cast(zero, ctypes.PointerType(ctypes.int32_t)); + badptr.contents; + }; + privateNoteIntentionalCrash(); + crash(); + }, false); + + // Finally, poll for the new crash record. + function tryGetCrash() { + info("Waiting for getCrashes"); + crashMan.getCrashes().then(SpecialPowers.wrapCallback(function (crashes) { + if (crashes.length) { + is(crashes.length, 1, "There should be only one record"); + var crash = crashes[0]; + ok(crash.isOfType(crashMan.PROCESS_TYPE_CONTENT, + crashMan.CRASH_TYPE_CRASH), + "Record should be a content crash"); + ok(!!crash.id, "Record should have an ID"); + ok(!!crash.crashDate, "Record should have a crash date"); + var dateMS = crash.crashDate.valueOf(); + var twoMin = 1000 * 60 * 2; + ok(crashDateMS - twoMin <= dateMS && + dateMS <= crashDateMS + twoMin, + "Record's crash date should be nowish: " + + "now=" + crashDateMS + " recordDate=" + dateMS); + SimpleTest.finish(); + } + else { + setTimeout(tryGetCrash, 1000); + } + }), function (err) { + ok(false, "Error getting crashes: " + err); + SimpleTest.finish(); + }); + } + setTimeout(tryGetCrash, 1000); + + }, function () { + ok(false, "pruneOldCrashes error"); + SimpleTest.finish(); + }); +}); + +</script> +</body> +</html> |