summaryrefslogtreecommitdiffstats
path: root/docshell/test/chrome/DocShellHelpers.sys.mjs
blob: 5f4eee87249ccc23e32e283d9f4e77b29ce970a5 (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
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */

export class DocShellHelpersParent extends JSWindowActorParent {
  static eventListener;

  // These static variables should be set when registering the actor
  // (currently doPageNavigation in docshell_helpers.js).
  static eventsToListenFor;
  static observers;

  constructor() {
    super();
  }
  receiveMessage({ name, data }) {
    if (name == "docshell_helpers:event") {
      let { event, originalTargetIsHTMLDocument } = data;

      if (this.constructor.eventsToListenFor.includes(event.type)) {
        this.constructor.eventListener(event, originalTargetIsHTMLDocument);
      }
    } else if (name == "docshell_helpers:observe") {
      let { topic } = data;

      this.constructor.observers.get(topic).call();
    }
  }
}

export class DocShellHelpersChild extends JSWindowActorChild {
  constructor() {
    super();
  }
  receiveMessage({ name, data }) {
    if (name == "docshell_helpers:preventBFCache") {
      // Add an RTCPeerConnection to prevent the page from being bfcached.
      let win = this.contentWindow;
      win.blockBFCache = new win.RTCPeerConnection();
    }
  }
  handleEvent(event) {
    if (
      Document.isInstance(event.originalTarget) &&
      event.originalTarget.isInitialDocument
    ) {
      dump(`TEST: ignoring a ${event.type} event for an initial about:blank\n`);
      return;
    }

    this.sendAsyncMessage("docshell_helpers:event", {
      event: {
        type: event.type,
        persisted: event.persisted,
        originalTarget: {
          title: event.originalTarget.title,
          location: event.originalTarget.location.href,
          visibilityState: event.originalTarget.visibilityState,
          hidden: event.originalTarget.hidden,
        },
      },
      originalTargetIsHTMLDocument: HTMLDocument.isInstance(
        event.originalTarget
      ),
    });
  }
  observe(subject, topic) {
    if (Window.isInstance(subject) && subject.document.isInitialDocument) {
      dump(`TEST: ignoring a topic notification for an initial about:blank\n`);
      return;
    }

    this.sendAsyncMessage("docshell_helpers:observe", { topic });
  }
}