summaryrefslogtreecommitdiffstats
path: root/docshell/test/browser/Bug422543Child.sys.mjs
blob: 524ac33ffd3ce384ff847fdd7fe85b34de01aa21 (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
class SHistoryListener {
  constructor() {
    this.retval = true;
    this.last = "initial";
  }

  OnHistoryNewEntry(aNewURI) {
    this.last = "newentry";
  }

  OnHistoryGotoIndex() {
    this.last = "gotoindex";
  }

  OnHistoryPurge() {
    this.last = "purge";
  }

  OnHistoryReload() {
    this.last = "reload";
    return this.retval;
  }

  OnHistoryReplaceEntry() {}
}
SHistoryListener.prototype.QueryInterface = ChromeUtils.generateQI([
  "nsISHistoryListener",
  "nsISupportsWeakReference",
]);

let listeners;

export class Bug422543Child extends JSWindowActorChild {
  constructor() {
    super();
  }

  actorCreated() {
    if (listeners) {
      return;
    }

    this.shistory = this.docShell.nsIWebNavigation.sessionHistory;
    listeners = [new SHistoryListener(), new SHistoryListener()];

    for (let listener of listeners) {
      this.shistory.legacySHistory.addSHistoryListener(listener);
    }
  }

  cleanup() {
    for (let listener of listeners) {
      this.shistory.legacySHistory.removeSHistoryListener(listener);
    }
    this.shistory = null;
    listeners = null;
    return {};
  }

  getListenerStatus() {
    return listeners.map(l => l.last);
  }

  resetListeners() {
    for (let listener of listeners) {
      listener.last = "initial";
    }

    return {};
  }

  notifyReload() {
    let history = this.shistory.legacySHistory;
    let rval = history.notifyOnHistoryReload();
    return { rval };
  }

  setRetval({ num, val }) {
    listeners[num].retval = val;
    return {};
  }

  receiveMessage(msg) {
    switch (msg.name) {
      case "cleanup":
        return this.cleanup();
      case "getListenerStatus":
        return this.getListenerStatus();
      case "notifyReload":
        return this.notifyReload();
      case "resetListeners":
        return this.resetListeners();
      case "setRetval":
        return this.setRetval(msg.data);
    }
    return null;
  }
}