summaryrefslogtreecommitdiffstats
path: root/dom/plugins/test/mochitest/test_crash_submit.xul
blob: 53b42b25c1de85ee4ca61cb60abccabb0b8cffc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?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");

    // 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() {
  // 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>