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 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
  
     | 
    
      <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Bug 1284788</title>
  <script src="/tests/SimpleTest/EventUtils.js"></script>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="pointerlock_utils.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
  <style>
    #block1, #block2, #block3 {
      background: blue;
      width: 50px; height: 50px;
      margin: 10px;
    }
  </style>
</head>
<body>
  <div id="block1"></div>
  <div id="block2"></div>
  <div id="block3"></div>
  <div id="test">
    <script>
      SimpleTest.waitForExplicitFinish();
      SimpleTest.requestFlakyTimeout("For changing pointer lock element not in a valid user event handler");
      var block1 = document.getElementById("block1");
      var block2 = document.getElementById("block2");
      var block3 = document.getElementById("block3");
      class ClickTester {
        constructor(target) {
          this._target = target;
          this._callback = null;
          document.addEventListener("click", this);
        }
        synthesize(callback) {
          ok(!this._callback, "No callback should have been hooked");
          this._callback = callback;
          synthesizeMouseAtCenter(this._target, {}, window);
        }
        handleEvent(e) {
          ok(!!this._callback, "Should have hooked a callback");
          var callback = this._callback;
          this._callback = null;
          callback(e);
        }
      };
      var tester = new ClickTester(block3);
      // It would be called in handler of load event in pointerlock_utils.js
      function start() {
        tester.synthesize(firstClick);
      }
      function firstClick(e) {
        is(e.target, block3, "Click is triggered inside block3");
        document.addEventListener("pointerlockchange", lockedPointerOnBlock1);
        block1.requestPointerLock();
      }
      function lockedPointerOnBlock1() {
        document.removeEventListener("pointerlockchange", lockedPointerOnBlock1);
        is(document.pointerLockElement, block1, "Pointer should be locked on #block1");
        SimpleTest.executeSoon(() => {
          tester.synthesize(secondClick);
        });
      }
      function secondClick(e) {
        is(e.target, block1, "Event should be redirected to block1");
        // Use 2s to ensure that we never consider this as an extension of user input.
        setTimeout(() => {
          document.addEventListener("pointerlockchange", lockedPointerOnBlock2);
          block2.requestPointerLock();
        }, 2000);
      }
      function lockedPointerOnBlock2() {
        document.removeEventListener("pointerlockchange", lockedPointerOnBlock2);
        is(document.pointerLockElement, block2, "Pointer should be locked on #block2");
        SimpleTest.executeSoon(() => {
          tester.synthesize(thirdClick);
        });
      }
      function thirdClick(e) {
        is(e.target, block2, "Event should be redirected to block2");
        // Use 2s to ensure that we never consider this as an extension of user input.
        setTimeout(() => {
          document.addEventListener("pointerlockchange", lockedPointerOnBlock1Again);
          block1.requestPointerLock();
        }, 2000);
      }
      function lockedPointerOnBlock1Again() {
        document.removeEventListener("pointerlockchange", lockedPointerOnBlock1Again);
        is(document.pointerLockElement, block1, "Pointer should be locked on #block1 again");
        SimpleTest.executeSoon(() => {
          tester.synthesize(fourthClick);
        });
      }
      function fourthClick(e) {
        is(e.target, block1, "Event should be redirected to block1 again");
        document.addEventListener("pointerlockchange", () => SimpleTest.finish());
        document.exitPointerLock();
      }
    </script>
  </div>
</body>
</html>
 
     |