tor-browser

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

file_fullscreen-prefixed.html (5259B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4  <meta charset="UTF-8">
      5  <title>Test for Bug 743198</title>
      6  <script src="/tests/SimpleTest/EventUtils.js"></script>
      7  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      8 </head>
      9 <body>
     10  <div id="fullscreen"></div>
     11 <script>
     12 
     13 function ok(condition, msg) {
     14  opener.ok(condition, "[prefixed] " + msg);
     15 }
     16 
     17 function is(a, b, msg) {
     18  opener.is(a, b, "[prefixed] " + msg);
     19 }
     20 
     21 function info(msg) {
     22  opener.info("[prefixed] " + msg);
     23 }
     24 
     25 SimpleTest.requestFlakyTimeout(
     26  "need to wait for a while to confirm no unexpected event is dispatched");
     27 
     28 let div = document.getElementById("fullscreen");
     29 let unattachedDiv = document.createElement('div');
     30 
     31 const NO_EVENT_HANDLER = 0;
     32 const PREFIXED_EVENT_ONLY = 1;
     33 const PREFIXED_AND_UNPREFIXED_EVENT = 2;
     34 
     35 class TestCase {
     36  constructor(num, handlersOnWindow, handlersOnDocument) {
     37    this.number = num;
     38    this.handlersType = new Map([[window, handlersOnWindow],
     39                                 [document, handlersOnDocument]]);
     40  }
     41 
     42  static checkState(inFullscreen, msg) {
     43    var emptyOrNot = inFullscreen ? "" : "not ";
     44    info(`Check fullscreen state ${msg}`);
     45    is(document.mozFullScreen, inFullscreen,
     46       `Should ${emptyOrNot}be in fullscreen`);
     47    is(document.fullscreenElement, inFullscreen ? div : null,
     48       `Fullscreen element should be ${inFullscreen ? "div" : "null"}`);
     49    is(document.mozFullScreenElement, document.fullscreenElement,
     50       "document.mozFullScreenElement should be identical to fullscreenElement");
     51    is(div.matches(":fullscreen"), inFullscreen,
     52       `Fullscreen element should ${emptyOrNot}match :fullscreen pseudo class`);
     53    is(div.matches(":-moz-full-screen"), inFullscreen,
     54       `Fullscreen element should ${emptyOrNot}match :-moz-full-screen pseudo class`);
     55  }
     56 
     57  changeListeners(action, eventType, handler) {
     58    let method = `${action}EventListener`;
     59    for (let [target, type] of this.handlersType.entries()) {
     60      if (type == PREFIXED_EVENT_ONLY) {
     61        target[method](`moz${eventType}`, handler);
     62      } else if (type == PREFIXED_AND_UNPREFIXED_EVENT) {
     63        target[method](eventType, handler);
     64        target[method](`moz${eventType}`, handler);
     65      } else if (type != NO_EVENT_HANDLER) {
     66        ok(false, `Unknown handlers type ${type}`);
     67      }
     68    }
     69  }
     70 
     71  doTest(actionCallback, eventType, inFullscreen, msg) {
     72    return new Promise(resolve => {
     73      let timeout = 0;
     74      let expectEvent = new Map();
     75      for (let [target] of this.handlersType) {
     76        expectEvent.set(target, this.handlersType != NO_EVENT_HANDLER);
     77      }
     78      let handleEvent = evt => {
     79        let target = evt.currentTarget;
     80        let type = this.handlersType.get(target);
     81        if (type == PREFIXED_EVENT_ONLY) {
     82          is(evt.type, `moz${eventType}`,
     83             `Should get prefixed event on ${target}`);
     84        } else if (type == PREFIXED_AND_UNPREFIXED_EVENT) {
     85          is(evt.type, eventType,
     86             `Should only get unprefixed event on ${target}`);
     87        } else {
     88          ok(false, `No event should be triggered on ${target}`);
     89        }
     90        // Ensure we receive each event exactly once.
     91        if (expectEvent.get(target)) {
     92          expectEvent.set(target, false);
     93        } else {
     94          ok(false, `Got an unexpected ${evt.type} event on ${target}`);
     95        }
     96        if (!timeout) {
     97          timeout = setTimeout(() => {
     98            this.changeListeners("remove", eventType, handleEvent);
     99            TestCase.checkState(inFullscreen,
    100                                `${msg} in test case ${this.number}`);
    101            resolve();
    102          });
    103        }
    104      };
    105      this.changeListeners("add", eventType, handleEvent);
    106      SimpleTest.waitForFocus(() => actionCallback());
    107    });
    108  }
    109 
    110  test() {
    111    return new Promise(resolve => {
    112      Promise.resolve().then(() => {
    113        return this.doTest(() => div.mozRequestFullScreen(),
    114                           "fullscreenchange", true, "after request");
    115      }).then(() => {
    116        return this.doTest(() => document.mozCancelFullScreen(),
    117                           "fullscreenchange", false, "after exit");
    118      }).then(() => {
    119        return this.doTest(() => unattachedDiv.mozRequestFullScreen(),
    120                           "fullscreenerror", false, "after failed request");
    121      }).then(resolve);
    122    });
    123  }
    124 }
    125 
    126 let gTestcases = [
    127  new TestCase(1, PREFIXED_EVENT_ONLY,           NO_EVENT_HANDLER),
    128  new TestCase(2, PREFIXED_AND_UNPREFIXED_EVENT, NO_EVENT_HANDLER),
    129  new TestCase(3, NO_EVENT_HANDLER,              PREFIXED_EVENT_ONLY),
    130  new TestCase(4, PREFIXED_EVENT_ONLY,           PREFIXED_EVENT_ONLY),
    131  new TestCase(5, PREFIXED_AND_UNPREFIXED_EVENT, PREFIXED_EVENT_ONLY),
    132  new TestCase(6, NO_EVENT_HANDLER,              PREFIXED_AND_UNPREFIXED_EVENT),
    133  new TestCase(7, PREFIXED_EVENT_ONLY,           PREFIXED_AND_UNPREFIXED_EVENT),
    134  new TestCase(8, PREFIXED_AND_UNPREFIXED_EVENT, PREFIXED_AND_UNPREFIXED_EVENT),
    135  ];
    136 
    137 function begin() {
    138  TestCase.checkState(false, "at the beginning");
    139  runNextTestCase();
    140 }
    141 
    142 function runNextTestCase() {
    143  let testcase = gTestcases.shift();
    144  if (!testcase) {
    145    opener.nextTest();
    146    return;
    147  }
    148  testcase.test().then(runNextTestCase);
    149 }
    150 
    151 </script>
    152 </body>
    153 </html>