summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/pepper/3rdparty/pepper.js/mouse_lock.js
blob: fc25df1cbf0dabfc0cb29ab2a362ae612e9683f6 (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
// Copyright (c) 2013 Google Inc. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(function() {

  var MouseLock_LockMouse = function(instance, callback) {
    var res = resources.resolve(instance, INSTANCE_RESOURCE);
    if (res === undefined) {
      return;
    }
    // TODO why does targeting the enclosing element cause difficulty?
    var target = res.element;
    var cb_func = glue.getCompletionCallback(callback);

    var makeCallback = function(return_code) {
      return function(event) {
        cb_func(return_code);
        return true;
      };
    };

    if('webkitRequestPointerLock' in target) {
      // TODO(grosse): Figure out how to handle the callbacks properly
      target.addEventListener('webkitpointerlockchange', makeCallback(ppapi.PP_OK));
      target.addEventListener('webkitpointerlockerror', makeCallback(ppapi.PP_ERROR_FAILED));
      target.webkitRequestPointerLock();
    } else {
      // Note: This may not work as Firefox currently requires fullscreen before requesting pointer lock
      target.addEventListener('mozpointerlockchange', makeCallback(ppapi.PP_OK));
      target.addEventListener('mozpointerlockerror', makeCallback(ppapi.PP_ERROR_FAILED));
      target.mozRequestPointerLock();
    }
  };

  var MouseLock_UnlockMouse = function(instance) {
    throw "MouseLock_UnlockMouse not implemented";
  };


  registerInterface("PPB_MouseLock;1.0", [
    MouseLock_LockMouse,
    MouseLock_UnlockMouse,
  ], function() {
    var b = document.body;
    return b.webkitRequestPointerLock || b.mozRequestPointerLock;
  });

  var FullScreen_IsFullscreen = function(instance) {
    var res = resources.resolve(instance, INSTANCE_RESOURCE);
    if (res === undefined) {
      return 0;
    }
    var element = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
    return element === res.element ? 1 : 0;
  };

  var FullScreen_SetFullscreen = function(instance, fullscreen) {
    var res = resources.resolve(instance, INSTANCE_RESOURCE);
    if (res == undefined) {
      return 0;
    }
    var element = res.element;

    if (fullscreen) {
      if (element.requestFullscreen) {
        element.requestFullscreen();
      } else if (element.mozRequestFullScreen) {
        element.mozRequestFullScreen();
      } else if (element.webkitRequestFullscreen) {
        element.webkitRequestFullscreen();
      } else if (element.msRequestFullscreen) {
        element.msRequestFullscreen();
      }
    } else {
      if (document.cancelFullscreen) {
        document.cancelFullscreen();
      } else if (document.mozCancelFullScreen) {
        document.mozCancelFullScreen();
      } else if (document.webkitCancelFullScreen) {
        document.webkitCancelFullScreen();
      } else if (document.msExitFullscreen) {
        document.msExitFullscreen();
      }
    }

    return 1;
  };


  var FullScreen_GetScreenSize = function() {
    throw "FullScreen_GetScreenSize not implemented";
  };

  registerInterface("PPB_Fullscreen;1.0", [
    FullScreen_IsFullscreen,
    FullScreen_SetFullscreen,
    FullScreen_GetScreenSize
  ], function() {
    var b = document.body;
    return b.requestFullscreen || b.mozRequestFullScreen || b.webkitRequestFullscreen || b.msRequestFullscreen;
  });

})();