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>