summaryrefslogtreecommitdiffstats
path: root/dom/events/test/test_bug336682.js
blob: c7ca96c435bfcd9a6cd390cff006bb58e16102b0 (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
/*
 * Helper functions for online/offline events tests.
 *
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */
var gState = 0;
/**
 * After all the on/offline handlers run,
 * gState is expected to be equal to MAX_STATE.
 */
var MAX_STATE;

function trace(text) {
  var t = text.replace(/&/g, "&" + "amp;").replace(/</g, "&" + "lt;") + "<br>";
  //document.getElementById("display").innerHTML += t;
}

/**
 * Returns a handler function for an online/offline event. The returned handler
 * ensures the passed event object has expected properties and that the handler
 * is called at the right moment (according to the gState variable).
 * @param nameTemplate The string identifying the hanlder. '%1' in that
 *                     string will be replaced with the event name.
 * @param eventName 'online' or 'offline'
 * @param expectedStates an array listing the possible values of gState at the
 *                       moment the handler is called. The handler increases
 *                       gState by one before checking if it's listed in
 *                       expectedStates.
 */
function makeHandler(nameTemplate, eventName, expectedStates) {
  return function(e) {
    var name = nameTemplate.replace(/%1/, eventName);
    ++gState;
    trace(name + ": gState=" + gState);
    ok(
      expectedStates.includes(gState),
      "handlers called in the right order: " +
        name +
        " is called, " +
        "gState=" +
        gState +
        ", expectedStates=" +
        expectedStates
    );
    ok(e.constructor == Event, "event should be an Event");
    ok(e.type == eventName, "event type should be " + eventName);
    ok(!e.bubbles, "event should not bubble");
    ok(!e.cancelable, "event should not be cancelable");
    ok(e.target == window, "target should be the window");
  };
}

function doTest() {
  var iosvc = SpecialPowers.Cc["@mozilla.org/network/io-service;1"].getService(
    SpecialPowers.Ci.nsIIOService
  );
  iosvc.manageOfflineStatus = false;
  iosvc.offline = false;
  ok(
    navigator.onLine,
    "navigator.onLine should be true, since we've just " +
      "set nsIIOService.offline to false"
  );

  gState = 0;

  trace("setting iosvc.offline = true");
  iosvc.offline = true;
  trace("done setting iosvc.offline = true");
  ok(
    !navigator.onLine,
    "navigator.onLine should be false when iosvc.offline == true"
  );
  ok(
    gState == window.MAX_STATE,
    "offline event: all registered handlers should have been invoked, " +
      "actual: " +
      gState
  );

  gState = 0;
  trace("setting iosvc.offline = false");
  iosvc.offline = false;
  trace("done setting iosvc.offline = false");
  ok(
    navigator.onLine,
    "navigator.onLine should be true when iosvc.offline == false"
  );
  ok(
    gState == window.MAX_STATE,
    "online event: all registered handlers should have been invoked, " +
      "actual: " +
      gState
  );
}