tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DocShellHelpers.sys.mjs (2217B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 export class DocShellHelpersParent extends JSWindowActorParent {
      5  static eventListener;
      6 
      7  // These static variables should be set when registering the actor
      8  // (currently doPageNavigation in docshell_helpers.js).
      9  static eventsToListenFor;
     10  static observers;
     11 
     12  constructor() {
     13    super();
     14  }
     15  receiveMessage({ name, data }) {
     16    if (name == "docshell_helpers:event") {
     17      let { event, originalTargetIsHTMLDocument } = data;
     18 
     19      if (this.constructor.eventsToListenFor.includes(event.type)) {
     20        this.constructor.eventListener(event, originalTargetIsHTMLDocument);
     21      }
     22    } else if (name == "docshell_helpers:observe") {
     23      let { topic } = data;
     24 
     25      this.constructor.observers.get(topic).call();
     26    }
     27  }
     28 }
     29 
     30 export class DocShellHelpersChild extends JSWindowActorChild {
     31  constructor() {
     32    super();
     33  }
     34  receiveMessage({ name }) {
     35    if (name == "docshell_helpers:preventBFCache") {
     36      // Add an RTCPeerConnection to prevent the page from being bfcached.
     37      let win = this.contentWindow;
     38      win.blockBFCache = new win.RTCPeerConnection();
     39    }
     40  }
     41  handleEvent(event) {
     42    if (
     43      Document.isInstance(event.originalTarget) &&
     44      event.originalTarget.isInitialDocument
     45    ) {
     46      dump(`TEST: ignoring a ${event.type} event for an initial about:blank\n`);
     47      return;
     48    }
     49 
     50    this.sendAsyncMessage("docshell_helpers:event", {
     51      event: {
     52        type: event.type,
     53        persisted: event.persisted,
     54        originalTarget: {
     55          title: event.originalTarget.title,
     56          location: event.originalTarget.location.href,
     57          visibilityState: event.originalTarget.visibilityState,
     58          hidden: event.originalTarget.hidden,
     59        },
     60      },
     61      originalTargetIsHTMLDocument: HTMLDocument.isInstance(
     62        event.originalTarget
     63      ),
     64    });
     65  }
     66  observe(subject, topic) {
     67    if (Window.isInstance(subject) && subject.document.isInitialDocument) {
     68      dump(`TEST: ignoring a topic notification for an initial about:blank\n`);
     69      return;
     70    }
     71 
     72    this.sendAsyncMessage("docshell_helpers:observe", { topic });
     73  }
     74 }