Index: third_party/polymer/v0_8/components-chromium/polymer/src/lib/gestures-extracted.js |
diff --git a/third_party/polymer/v0_8/components-chromium/polymer/src/lib/gestures-extracted.js b/third_party/polymer/v0_8/components-chromium/polymer/src/lib/gestures-extracted.js |
deleted file mode 100644 |
index 6eb6f7dd9f37c7e02f96117423cf4d43b88bcf88..0000000000000000000000000000000000000000 |
--- a/third_party/polymer/v0_8/components-chromium/polymer/src/lib/gestures-extracted.js |
+++ /dev/null |
@@ -1,274 +0,0 @@ |
- |
- |
-(function(scope) { |
- |
- 'use strict'; |
- |
- var async = scope.Base.async; |
- |
- var Gestures = { |
- gestures: {}, |
- |
- // automate the event listeners for the native events |
- // TODO(dfreedm): add a way to remove handlers. |
- add: function(evType, node, handler) { |
- // listen for events in order to "recognize" this event |
- var g = this.gestures[evType]; |
- var gn = '_' + evType; |
- var info = {started: false, abortTrack: false, oneshot: false}; |
- if (g && !node[gn]) { |
- if (g.touchaction) { |
- this._setupTouchAction(node, g.touchaction, info); |
- } |
- for (var i = 0, n, sn, fn; i < g.deps.length; i++) { |
- n = g.deps[i]; |
- fn = g[n].bind(g, info); |
- sn = '_' + evType + '-' + n; |
- // store the handler on the node for future removal |
- node[sn] = fn; |
- node.addEventListener(n, fn); |
- } |
- node[gn] = 0; |
- } |
- // listen for the gesture event |
- node[gn]++; |
- node.addEventListener(evType, handler); |
- }, |
- |
- remove: function(evType, node, handler) { |
- var g = this.gestures[evType]; |
- var gn = '_' + evType; |
- if (g && node[gn]) { |
- for (var i = 0, n, sn, fn; i < g.deps.length; i++) { |
- n = g.deps[i]; |
- sn = '_' + evType + '-' + n; |
- fn = node[sn]; |
- if (fn){ |
- node.removeEventListener(n, fn); |
- // remove stored handler to allow GC |
- node[sn] = undefined; |
- } |
- } |
- node[gn] = node[gn] ? (node[gn] - 1) : 0; |
- node.removeEventListener(evType, handler); |
- } |
- }, |
- |
- register: function(recog) { |
- this.gestures[recog.name] = recog; |
- }, |
- |
- // touch will make synthetic mouse events |
- // preventDefault on touchend will cancel them, |
- // but this breaks <input> focus and link clicks |
- // Disabling "mouse" handlers for 500ms is enough |
- |
- _cancelFunction: null, |
- |
- cancelNextClick: function(timeout) { |
- if (!this._cancelFunction) { |
- timeout = timeout || 500; |
- var self = this; |
- var reset = function() { |
- var cfn = self._cancelFunction; |
- if (cfn) { |
- clearTimeout(cfn.id); |
- document.removeEventListener('click', cfn, true); |
- self._cancelFunction = null; |
- } |
- }; |
- var canceller = function(e) { |
- e.tapPrevented = true; |
- reset(); |
- }; |
- canceller.id = setTimeout(reset, timeout); |
- this._cancelFunction = canceller; |
- document.addEventListener('click', canceller, true); |
- } |
- }, |
- |
- // try to use the native touch-action, if it exists |
- _hasNativeTA: typeof document.head.style.touchAction === 'string', |
- |
- // set scrolling direction on node to check later on first move |
- // must call this before adding event listeners! |
- setTouchAction: function(node, value) { |
- if (this._hasNativeTA) { |
- node.style.touchAction = value; |
- } |
- node.touchAction = value; |
- }, |
- |
- _setupTouchAction: function(node, value, info) { |
- // reuse custom value on node if set |
- var ta = node.touchAction; |
- value = ta || value; |
- // set an anchor point to see how far first move is |
- node.addEventListener('touchstart', function(e) { |
- var t = e.changedTouches[0]; |
- info.initialTouch = {x: t.clientX, y: t.clientY}; |
- info.abortTrack = false; |
- info.oneshot = false; |
- }); |
- node.addEventListener('touchmove', function(e) { |
- // only run this once |
- if (info.oneshot) { |
- return; |
- } |
- info.oneshot = true; |
- // "none" means always track |
- if (value === 'none') { |
- return; |
- } |
- // "auto" is default, always scroll |
- // bail-out if touch-action did its job |
- // the touchevent is non-cancelable if the page/area is scrolling |
- if (value === 'auto' || !value || (ta && !e.cancelable)) { |
- info.abortTrack = true; |
- return; |
- } |
- // check first move direction |
- // unfortunately, we can only make the decision in the first move, |
- // so we have to use whatever values are available. |
- // Typically, this can be a really small amount, :( |
- var t = e.changedTouches[0]; |
- var x = t.clientX, y = t.clientY; |
- var dx = Math.abs(info.initialTouch.x - x); |
- var dy = Math.abs(info.initialTouch.y - y); |
- // scroll in x axis, abort track if we move more in x direction |
- if (value === 'pan-x') { |
- info.abortTrack = dx >= dy; |
- // scroll in y axis, abort track if we move more in y direction |
- } else if (value === 'pan-y') { |
- info.abortTrack = dy >= dx; |
- } |
- }); |
- }, |
- |
- fire: function(target, type, detail, bubbles, cancelable) { |
- return target.dispatchEvent( |
- new CustomEvent(type, { |
- detail: detail, |
- bubbles: bubbles, |
- cancelable: cancelable |
- }) |
- ); |
- } |
- |
- }; |
- |
- Gestures.register({ |
- name: 'track', |
- touchaction: 'none', |
- deps: ['mousedown', 'touchmove', 'touchend'], |
- |
- mousedown: function(info, e) { |
- var t = e.currentTarget; |
- var self = this; |
- var movefn = function movefn(e, up) { |
- if (!info.tracking && !up) { |
- // set up tap prevention |
- Gestures.cancelNextClick(); |
- } |
- // first move is 'start', subsequent moves are 'move', mouseup is 'end' |
- var state = up ? 'end' : (!info.started ? 'start' : 'move'); |
- info.started = true; |
- self.fire(t, e, state); |
- e.preventDefault(); |
- }; |
- var upfn = function upfn(e) { |
- // call mousemove function with 'end' state |
- movefn(e, true); |
- info.started = false; |
- // remove the temporary listeners |
- document.removeEventListener('mousemove', movefn); |
- document.removeEventListener('mouseup', upfn); |
- }; |
- // add temporary document listeners as mouse retargets |
- document.addEventListener('mousemove', movefn); |
- document.addEventListener('mouseup', upfn); |
- }, |
- |
- touchmove: function(info, e) { |
- var t = e.currentTarget; |
- var ct = e.changedTouches[0]; |
- // if track was aborted, stop tracking |
- if (info.abortTrack) { |
- return; |
- } |
- e.preventDefault(); |
- // the first track event is sent after some hysteresis with touchmove. |
- // Use `started` state variable to differentiate the "first" move from |
- // the rest to make track.state == 'start' |
- // first move is 'start', subsequent moves are 'move' |
- var state = !info.started ? 'start' : 'move'; |
- info.started = true; |
- this.fire(t, ct, state); |
- }, |
- |
- touchend: function(info, e) { |
- var t = e.currentTarget; |
- var ct = e.changedTouches[0]; |
- // only trackend if track was started and not aborted |
- if (info.started && !info.abortTrack) { |
- // reset started state on up |
- info.started = false; |
- var ne = this.fire(t, ct, 'end'); |
- // iff tracking, always prevent tap |
- e.tapPrevented = true; |
- } |
- }, |
- |
- fire: function(target, touch, state) { |
- return Gestures.fire(target, 'track', { |
- state: state, |
- x: touch.clientX, |
- y: touch.clientY |
- }); |
- } |
- |
- }); |
- |
- // dispatch a *bubbling* "tap" only at the node that is the target of the |
- // generating event. |
- // dispatch *synchronously* so that we can implement prevention of native |
- // actions like links being followed. |
- // |
- // TODO(dfreedm): a tap should not occur when there's too much movement. |
- // Right now, a tap can occur when a touchend happens very far from the |
- // generating touch. |
- // This *should* obviate the need for tapPrevented via track. |
- Gestures.register({ |
- name: 'tap', |
- deps: ['click', 'touchend'], |
- |
- click: function(info, e) { |
- this.forward(e); |
- }, |
- |
- touchend: function(info, e) { |
- Gestures.cancelNextClick(); |
- this.forward(e); |
- }, |
- |
- forward: function(e) { |
- // prevent taps from being generated from events that have been |
- // canceled (e.g. via cancelNextClick) or already handled via |
- // a listener lower in the tree. |
- if (!e.tapPrevented) { |
- e.tapPrevented = true; |
- this.fire(e.target); |
- } |
- }, |
- |
- // fire a bubbling event from the generating target. |
- fire: function(target) { |
- Gestures.fire(target, 'tap', {}, true); |
- } |
- |
- }); |
- |
- scope.Gestures = Gestures; |
- |
-})(Polymer); |
- |