diff options
Diffstat (limited to 'dom/plugins/test/mochitest/test_crash_submit.xul')
-rw-r--r-- | dom/plugins/test/mochitest/test_crash_submit.xul | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/dom/plugins/test/mochitest/test_crash_submit.xul b/dom/plugins/test/mochitest/test_crash_submit.xul new file mode 100644 index 000000000..22f39384b --- /dev/null +++ b/dom/plugins/test/mochitest/test_crash_submit.xul @@ -0,0 +1,157 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" + type="text/css"?> +<window title="Basic Plugin Tests" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <script type="application/javascript" + src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" /> + <script type="application/javascript" + src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" /> + <script type="application/javascript" src="plugin-utils.js"></script> + <script type="application/javascript"> + setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED); + </script> +<body xmlns="http://www.w3.org/1999/xhtml" onload="runTests()"> +<embed id="plugin1" type="application/x-test" width="200" height="200"></embed> +</body> +<script class="testbody" type="application/javascript"> +<![CDATA[ +SimpleTest.waitForExplicitFinish(); +SimpleTest.ignoreAllUncaughtExceptions(); + +Components.utils.import("resource://gre/modules/NetUtil.jsm"); +Components.utils.import("resource://gre/modules/Services.jsm"); +Components.utils.import("resource://gre/modules/Task.jsm"); + +var crashReporter = + Components.classes["@mozilla.org/toolkit/crash-reporter;1"] + .getService(Components.interfaces.nsICrashReporter); +var oldServerURL = crashReporter.serverURL; + +const SERVER_URL = "http://example.com/browser/toolkit/crashreporter/test/browser/crashreport.sjs"; + +var testObserver = { + observe: function(subject, topic, data) { + if (data == "submitting") // not done yet + return; + is(data, "success", "report should have been submitted successfully"); + is(topic, "crash-report-status", "Checking correct topic"); + ok(subject instanceof Components.interfaces.nsIPropertyBag2, + "Subject should be a property bag"); + + ok(subject.hasKey("minidumpID"), "Should have a local crash ID"); + let crashID = subject.getPropertyAsAString("minidumpID"); + isnot(crashID, "", "Local crash ID should not be an empty string"); + + ok(subject.hasKey("serverCrashID"), "Should have a server crash ID"); + let remoteID = subject.getPropertyAsAString("serverCrashID"); + isnot(remoteID, "", "Server crash ID should not be an empty string"); + + // Verify the data. The SJS script will return the data that was POSTed + let req = new XMLHttpRequest(); + req.open("GET", SERVER_URL + "?id=" + remoteID, false); + req.send(null); + is(req.status, 200, "Server response should be 200 OK"); + let submitted = JSON.parse(req.responseText); + ok(!("Throttleable" in submitted), "Submit request should not be Throttleable"); + is(submitted.ProcessType, "plugin", "Should specify ProcessType=plugin"); + + // Cleanup + // First remove our fake submitted report + let file = Services.dirsvc.get("UAppData", Components.interfaces.nsILocalFile); + file.append("Crash Reports"); + file.append("submitted"); + file.append(remoteID + ".txt"); + file.remove(false); + + // Next unregister our observer + var os = Components.classes["@mozilla.org/observer-service;1"]. + getService(Components.interfaces.nsIObserverService); + os.removeObserver(testObserver, "crash-report-status"); + + // Then re-set MOZ_CRASHREPORTER_NO_REPORT + let env = Components.classes["@mozilla.org/process/environment;1"] + .getService(Components.interfaces.nsIEnvironment); + env.set("MOZ_CRASHREPORTER_NO_REPORT", "1"); + + // Finally re-set crashreporter URL + crashReporter.serverURL = oldServerURL; + + // Check and cleanup CrashManager. + Task.spawn(function* () { + let cm = Services.crashmanager; + let store = yield cm._getStore(); + is(store.crashesCount, 1, "Store should have only 1 item"); + + let crash = store.getCrash(crashID); + ok(!!crash, "Store should have the crash record"); + ok(crash.isOfType(cm.PROCESS_TYPE_PLUGIN, cm.CRASH_TYPE_CRASH), + "Crash type should be plugin-crash"); + is(crash.remoteID, remoteID, "Crash remoteID should match"); + + is(crash.submissions.size, 1, "Crash should have a submission"); + let submission = crash.submissions.values().next().value; + is(submission.result, cm.SUBMISSION_RESULT_OK, + "Submission should be successful"); + + store.reset(); + + SimpleTest.finish(); + }); + }, + + QueryInterface: function(iid) { + if (iid.equals(Components.interfaces.nsIObserver) || + iid.equals(Components.interfaces.nsISupportsWeakReference) || + iid.equals(Components.interfaces.nsISupports)) + return this; + throw Components.results.NS_NOINTERFACE; + } +}; + + +function onPluginCrashed(aEvent) { + ok(true, "Plugin crashed notification received"); + is(aEvent.type, "PluginCrashed", "event is correct type"); + + let submitButton = document.getAnonymousElementByAttribute(aEvent.target, + "class", + "submitButton"); + // try to submit this report + sendMouseEvent({type:'click'}, submitButton, window); +} + +function runTests() { + // the test harness will have set MOZ_CRASHREPORTER_NO_REPORT, + // ensure that we can change the setting and have our minidumps + // wind up in Crash Reports/pending + let env = Components.classes["@mozilla.org/process/environment;1"] + .getService(Components.interfaces.nsIEnvironment); + env.set("MOZ_CRASHREPORTER_NO_REPORT", ""); + + // Override the crash reporter URL to send to our fake server + crashReporter.serverURL = NetUtil.newURI(SERVER_URL); + + var os = Components.classes["@mozilla.org/observer-service;1"]. + getService(Components.interfaces.nsIObserverService); + os.addObserver(testObserver, "crash-report-status", true); + + document.addEventListener("PluginCrashed", onPluginCrashed, false); + + var pluginElement = document.getElementById("plugin1"); + try { + Task.spawn(function* () { + // Clear data in CrashManager in case previous tests caused something + // to be added. + let store = yield Services.crashmanager._getStore(); + store.reset(); + + pluginElement.crash(); + }); + } catch (e) { + } +} +]]> +</script> +</window> |