Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/apps/system/js/mouse2touch.js
blob: b9d6a89a2fa69a25a46669e8e50b227f0de8e190 (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
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */

'use strict';

/*
*  Mouse2Touch is a shim that listens to MouseEvent but passes
*  fake TouchEvent object to touch event handler
*
*  XXX: remove this if we are not going to support testing on
*  non-touch devices, e.g. B2G Desktop, Nightly, or,
*  make the creation of this object optional if we can reliably detect
*  touch support by evaluate (document instanceof DocumentTouch)
*
*/
var Mouse2Touch = (function m2t() {
  var Mouse2TouchEvent = {
   'mousedown': 'touchstart',
   'mousemove': 'touchmove',
   'mouseup': 'touchend'
  };

  var Touch2MouseEvent = {
   'touchstart': 'mousedown',
   'touchmove': 'mousemove',
   'touchend': 'mouseup'
  };

  var ForceOnWindow = {
   'touchmove': true,
   'touchend': true
  };

  var addEventHandler = function m2t_addEventHandlers(target,
                                                      name,
                                                      listener) {
   target = ForceOnWindow[name] ? window : target;
   name = Touch2MouseEvent[name] || name;
   target.addEventListener(name, {
     handleEvent: function m2t_handleEvent(evt) {
       if (Mouse2TouchEvent[evt.type]) {
         var original = evt;
         evt = {
           type: Mouse2TouchEvent[original.type],
           target: original.target,
           touches: [original],
           preventDefault: function() {
             original.preventDefault();
           }
         };
         evt.changedTouches = evt.touches;
       }
       return listener.handleEvent(evt);
     }
   }, true);
  };

  var removeEventHandler = function m2t_removeEventHandler(target,
                                                           name,
                                                           listener) {
   target = ForceOnWindow[name] ? window : target;
   name = Touch2MouseEvent[name] || name;
   target.removeEventListener(name, listener);
  };

  return {
    addEventHandler: addEventHandler,
    removeEventHandler: removeEventHandler
  };
})();