summaryrefslogtreecommitdiffstats
path: root/dom/push/test/test_error_reporting.html
blob: 9564cd51018b62e3bf968b99b0b0d08fabc5cc04 (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
<!DOCTYPE HTML>
<html>
<!--
Bug 1246341: Report message delivery failures to the Push server.

Any copyright is dedicated to the Public Domain.
http://creativecommons.org/licenses/publicdomain/

-->
<head>
  <title>Test for Bug 1246341</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
  <script type="text/javascript" src="/tests/dom/push/test/test_utils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1246341">Mozilla Bug 1246341</a>
<p id="display"></p>
<div id="content" style="display: none">

</div>
<pre id="test">
</pre>

<script class="testbody" type="text/javascript">

  var pushNotifier = SpecialPowers.Cc["@mozilla.org/push/Notifier;1"]
                                  .getService(SpecialPowers.Ci.nsIPushNotifier);

  var reporters = new Map();

  var registration;
  add_task(function* start() {
    yield setupPrefsAndReplaceService({
      reportDeliveryError(messageId, reason) {
        ok(reporters.has(messageId),
          'Unexpected error reported for message ' + messageId);
        var resolve = reporters.get(messageId);
        reporters.delete(messageId);
        resolve(reason);
      },
    });
    yield setPushPermission(true);

    var url = "error_worker.js" + "?" + (Math.random());
    registration = yield navigator.serviceWorker.register(url, {scope: "."});
    yield waitForActive(registration);
  });

  var controlledFrame;
  add_task(function* createControlledIFrame() {
    controlledFrame = yield injectControlledFrame();
  });

  var idCounter = 1;
  function waitForDeliveryError(request) {
    return new Promise(resolve => {
      var data = new TextEncoder("utf-8").encode(JSON.stringify(request));
      var principal = SpecialPowers.wrap(document).nodePrincipal;

      let messageId = "message-" + (idCounter++);
      reporters.set(messageId, resolve);
      pushNotifier.notifyPushWithData(registration.scope, principal, messageId,
                                      data.length, data);
    });
  }

  add_task(function* reportDeliveryErrors() {
    var reason = yield waitForDeliveryError({ type: "exception" });
    is(reason, SpecialPowers.Ci.nsIPushErrorReporter.DELIVERY_UNCAUGHT_EXCEPTION,
      "Should report uncaught exceptions");

    reason = yield waitForDeliveryError({ type: "rejection" });
    is(reason, SpecialPowers.Ci.nsIPushErrorReporter.DELIVERY_UNHANDLED_REJECTION,
      "Should report unhandled rejections");
  });

  add_task(function* reportDecryptionError() {
    var message = yield new Promise(resolve => {
      var consoleService = SpecialPowers.Cc["@mozilla.org/consoleservice;1"]
        .getService(SpecialPowers.Ci.nsIConsoleService);

      var listener = SpecialPowers.wrapCallbackObject({
        QueryInterface(iid) {
          if (!SpecialPowers.Ci.nsISupports.equals(iid) &&
              !SpecialPowers.Ci.nsIConsoleListener.equals(iid)) {
            throw SpecialPowers.Cr.NS_ERROR_NO_INTERFACE;
          }
          return this;
        },

        observe(message) {
          let error = message;
          try {
            error.QueryInterface(SpecialPowers.Ci.nsIScriptError);
          } catch (error) {
            return;
          }
          if (message.innerWindowID == controlledFrame.innerWindowId()) {
            consoleService.unregisterListener(listener);
            resolve(error);
          }
        },
      });
      consoleService.registerListener(listener);

      var principal = SpecialPowers.wrap(document).nodePrincipal;
      pushNotifier.notifyError(registration.scope, principal, "Push error",
        SpecialPowers.Ci.nsIScriptError.errorFlag);
    });

    is(message.sourceName, registration.scope,
      "Should use the qualified scope URL as the source");
    is(message.errorMessage, "Push error",
      "Should report the given error string");
  });

  add_task(function* unsubscribe() {
    controlledFrame.remove();
  });

  add_task(function* unregister() {
    yield registration.unregister();
  });

</script>
</body>
</html>