tor-browser

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

FullscreenFrame.sys.mjs (2943B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 /**
      5 * test helper JSWindowActors used by the browser_fullscreen_api_fission.js test.
      6 */
      7 
      8 export class FullscreenFrameChild extends JSWindowActorChild {
      9  actorCreated() {
     10    this.fullscreen_events = [];
     11  }
     12 
     13  changed() {
     14    return new Promise(resolve => {
     15      this.contentWindow.document.addEventListener(
     16        "fullscreenchange",
     17        () => resolve(),
     18        {
     19          once: true,
     20        }
     21      );
     22    });
     23  }
     24 
     25  requestFullscreen() {
     26    let doc = this.contentWindow.document;
     27    let button = doc.createElement("button");
     28    doc.body.appendChild(button);
     29 
     30    return new Promise(resolve => {
     31      button.onclick = () => {
     32        doc.body.requestFullscreen().then(resolve);
     33        doc.body.removeChild(button);
     34      };
     35      button.click();
     36    });
     37  }
     38 
     39  receiveMessage(msg) {
     40    switch (msg.name) {
     41      case "WaitForChange":
     42        return this.changed();
     43      case "ExitFullscreen":
     44        return this.contentWindow.document.exitFullscreen();
     45      case "RequestFullscreen":
     46        return Promise.all([this.changed(), this.requestFullscreen()]);
     47      case "CreateChild": {
     48        let child = msg.data;
     49        let iframe = this.contentWindow.document.createElement("iframe");
     50        iframe.allow = child.allow_fullscreen ? "fullscreen" : "";
     51        iframe.name = child.name;
     52 
     53        let loaded = new Promise(resolve => {
     54          iframe.addEventListener(
     55            "load",
     56            () => resolve(iframe.browsingContext),
     57            { once: true }
     58          );
     59        });
     60        iframe.src = child.url;
     61        this.contentWindow.document.body.appendChild(iframe);
     62        return loaded;
     63      }
     64      case "GetEvents":
     65        return Promise.resolve(this.fullscreen_events);
     66      case "ClearEvents":
     67        this.fullscreen_events = [];
     68        return Promise.resolve();
     69      case "GetFullscreenElement": {
     70        let document = this.contentWindow.document;
     71        let child_iframe = this.contentWindow.document.getElementsByTagName(
     72          "iframe"
     73        )
     74          ? this.contentWindow.document.getElementsByTagName("iframe")[0]
     75          : null;
     76        switch (document.fullscreenElement) {
     77          case null:
     78            return Promise.resolve("null");
     79          case document:
     80            return Promise.resolve("document");
     81          case document.body:
     82            return Promise.resolve("body");
     83          case child_iframe:
     84            return Promise.resolve("child_iframe");
     85          default:
     86            return Promise.resolve("other");
     87        }
     88      }
     89    }
     90 
     91    return Promise.reject("Unexpected Message");
     92  }
     93 
     94  async handleEvent(event) {
     95    switch (event.type) {
     96      case "fullscreenchange":
     97        this.fullscreen_events.push(true);
     98        break;
     99      case "fullscreenerror":
    100        this.fullscreen_events.push(false);
    101        break;
    102    }
    103  }
    104 }