summaryrefslogtreecommitdiffstats
path: root/dom/tests/mochitest/pointerlock/file_screenClientXYConst.html
blob: 31bd232a577e02d900e123cb99234b9eca1713c7 (plain)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=633602
-->
<head>
  <title>Bug 633602 - constantXY.html</title>
  <script src="/tests/SimpleTest/SimpleTest.js">
  </script>
  <script src="/tests/SimpleTest/EventUtils.js"></script>
  <script type="application/javascript" src="pointerlock_utils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
  <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=633602">
    Mozilla Bug 633602
  </a>
  <div id="div"></div>
  <script type="application/javascript">
      /*
       * Test for Bug 633602
       * Confirm that screenX/Y and clientX/Y are constants when the pointer
       * is locked.
       */

      SimpleTest.waitForExplicitFinish();
      SimpleTest.requestFlakyTimeout("We may need to wait for window's moving");

      var div
        , divRect
        , unLockedCoords
        , lockedCoords
        , mouseMoveIntervalID
        , isUnlocked = false
        , isLocked = false;

      function runTests () {
        ok(isUnlocked, "Pointer should be unlocked");
        ok(isLocked, "Pointer should be locked");

        // Confirm that pointer coords are constant while locked
        is(unLockedCoords.clientX, lockedCoords.clientX,
           "clientX should be equal to where the mouse was originaly locked");
        is(unLockedCoords.clientY, lockedCoords.clientY,
           "clientY should be equal to where the mouse was originaly locked");
        is(unLockedCoords.screenX, lockedCoords.screenX,
           "screenX should be equal to where the mouse was originaly locked");
        is(unLockedCoords.screenY, lockedCoords.screenY,
           "screenY should be equal to where the mouse was originaly locked");
      }

      function moveUnlocked(e) {
        info("Got mousemove via moveUnlocked");
        clearInterval(mouseMoveIntervalID);
        var firstCall = !unLockedCoords;
        if (!firstCall) {
          todo(false, "mousemove is fired twice.");
        }

        unLockedCoords = {
          screenX: e.screenX,
          screenY: e.screenY,
          clientX: e.clientX,
          clientY: e.clientY
        };

        if (!firstCall) {
          return;
        }

        isUnlocked = !document.pointerLockElement;
        div.requestPointerLock();
      }

      function moveLocked(e) {
        info("Got mousemove via moveLocked");
        clearInterval(mouseMoveIntervalID);
        div.removeEventListener("mousemove", moveLocked);

        isLocked = !!document.pointerLockElement;
        lockedCoords = {
          screenX: e.screenX,
          screenY: e.screenY,
          clientX: e.clientX,
          clientY: e.clientY
        };

        addFullscreenChangeContinuation("exit", function() {
          info("Got fullscreenchange for exiting");
          runTests();
          SimpleTest.finish();
        });
        document.exitFullscreen();
      }

      document.addEventListener("pointerlockchange", function (e) {
        if (document.pointerLockElement === div) {
          info("Got pointerlockchange for entering");
          div.removeEventListener("mousemove", moveUnlocked);
          div.addEventListener("mousemove", moveLocked);
          divRect = div.getBoundingClientRect();
          // Bug 1295815
          // Retrigger synthesizeNativeMouseEvent until it actually happens.
          mouseMoveIntervalID = setInterval(() => {
            synthesizeNativeMouseEvent({
              type: "mousemove",
              target: div,
              offsetX: (divRect.width / 4) * 3,
              offsetY: (divRect.height / 4) * 3,
            });
          }, 100);
        } else {
          info("Got pointerlockchange for exiting");
        }
      });

      function start() {
        div = document.getElementById("div");
        info("Requesting fullscreen on parent");
        addFullscreenChangeContinuation("enter", async () => {
          info("Got fullscreenchange for entering");
          await promiseNativeMouseEvent({
            type: "mousemove",
            target: div,
            offsetX: 0,
            offsetY: 0,
          });
          div.addEventListener("mousemove", moveUnlocked);
          // Bug 1295815
          // Retrigger synthesizeNativeMouseEvent until it actually happens.
          mouseMoveIntervalID = setInterval(() => {
            synthesizeNativeMouseEvent({
              type: "mousemove",
              target: div,
              atCenter: true,
            });
          }, 100);
        });
        div.requestFullscreen();
      }
  </script>
</body>
</html>