blob: f03a0ade430c3e9c551c94139e76b9013acdb4bf [file] [log] [blame]
// Copyright 2013 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Utilities to abstract mouse and touch events.
*/
goog.provide('goog.labs.events.touch');
goog.provide('goog.labs.events.touch.TouchData');
goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.events.EventType');
goog.require('goog.string');
/**
* Description the geometry and target of an event.
*
* @typedef {{
* clientX: number,
* clientY: number,
* screenX: number,
* screenY: number,
* target: EventTarget
* }}
*/
goog.labs.events.touch.TouchData;
/**
* Takes a mouse or touch event and returns the relevent geometry and target
* data.
* @param {!Event} e A mouse or touch event.
* @return {!goog.labs.events.touch.TouchData}
*/
goog.labs.events.touch.getTouchData = function(e) {
var source = e;
goog.asserts.assert(
goog.string.startsWith(e.type, 'touch') ||
goog.string.startsWith(e.type, 'mouse'),
'Event must be mouse or touch event.');
if (goog.string.startsWith(e.type, 'touch')) {
goog.asserts.assert(
goog.array.contains([
goog.events.EventType.TOUCHCANCEL,
goog.events.EventType.TOUCHEND,
goog.events.EventType.TOUCHMOVE,
goog.events.EventType.TOUCHSTART
], e.type),
'Touch event not of valid type.');
// If the event is end or cancel, take the first changed touch,
// otherwise the first target touch.
source = (e.type == goog.events.EventType.TOUCHEND ||
e.type == goog.events.EventType.TOUCHCANCEL) ?
e.changedTouches[0] : e.targetTouches[0];
}
return {
clientX: source['clientX'],
clientY: source['clientY'],
screenX: source['screenX'],
screenY: source['screenY'],
target: source['target']
};
};