gecko/b2g/chrome/content/touch.js
Philipp von Weitershausen bfa9dba1b0 Bug 699876 - Import the initial b2g/ directory. r=cjones
--HG--
rename : mobile/xul/LICENSE => b2g/LICENSE
rename : mobile/xul/Makefile.in => b2g/Makefile.in
rename : mobile/xul/app/Makefile.in => b2g/app/Makefile.in
rename : mobile/xul/app/macbuild/Contents/Info.plist.in => b2g/app/macbuild/Contents/Info.plist.in
rename : mobile/xul/app/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in => b2g/app/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in
rename : mobile/xul/app/nsBrowserApp.cpp => b2g/app/nsBrowserApp.cpp
rename : mobile/xul/branding/official/Makefile.in => b2g/branding/official/Makefile.in
rename : mobile/xul/branding/official/android-resources.mn => b2g/branding/official/android-resources.mn
rename : mobile/xul/branding/official/configure.sh => b2g/branding/official/configure.sh
rename : mobile/xul/branding/official/content/Makefile.in => b2g/branding/official/content/Makefile.in
rename : mobile/xul/branding/official/content/about.png => b2g/branding/official/content/about.png
rename : mobile/xul/branding/official/content/favicon32.png => b2g/branding/official/content/favicon32.png
rename : mobile/xul/branding/official/content/jar.mn => b2g/branding/official/content/jar.mn
rename : mobile/xul/branding/official/content/logo.png => b2g/branding/official/content/logo.png
rename : mobile/xul/branding/official/content/logoWordmark.png => b2g/branding/official/content/logoWordmark.png
rename : mobile/xul/branding/official/content/splash.png => b2g/branding/official/content/splash.png
rename : mobile/xul/branding/official/locales/Makefile.in => b2g/branding/official/locales/Makefile.in
rename : mobile/xul/branding/official/locales/en-US/brand.dtd => b2g/branding/official/locales/en-US/brand.dtd
rename : mobile/xul/branding/official/locales/en-US/brand.properties => b2g/branding/official/locales/en-US/brand.properties
rename : mobile/xul/branding/official/locales/jar.mn => b2g/branding/official/locales/jar.mn
rename : mobile/xul/branding/unofficial/Makefile.in => b2g/branding/unofficial/Makefile.in
rename : mobile/xul/branding/unofficial/android-resources.mn => b2g/branding/unofficial/android-resources.mn
rename : mobile/xul/branding/unofficial/configure.sh => b2g/branding/unofficial/configure.sh
rename : mobile/xul/branding/unofficial/content/Makefile.in => b2g/branding/unofficial/content/Makefile.in
rename : mobile/xul/branding/unofficial/content/about.png => b2g/branding/unofficial/content/about.png
rename : mobile/xul/branding/unofficial/content/favicon32.png => b2g/branding/unofficial/content/favicon32.png
rename : mobile/xul/branding/unofficial/content/jar.mn => b2g/branding/unofficial/content/jar.mn
rename : mobile/xul/branding/unofficial/content/logo.png => b2g/branding/unofficial/content/logo.png
rename : mobile/xul/branding/unofficial/content/logoWordmark.png => b2g/branding/unofficial/content/logoWordmark.png
rename : mobile/xul/branding/unofficial/content/splash.png => b2g/branding/unofficial/content/splash.png
rename : mobile/xul/branding/unofficial/locales/Makefile.in => b2g/branding/unofficial/locales/Makefile.in
rename : mobile/xul/branding/unofficial/locales/en-US/brand.dtd => b2g/branding/unofficial/locales/en-US/brand.dtd
rename : mobile/xul/branding/unofficial/locales/en-US/brand.properties => b2g/branding/unofficial/locales/en-US/brand.properties
rename : mobile/xul/branding/unofficial/locales/jar.mn => b2g/branding/unofficial/locales/jar.mn
rename : mobile/xul/build.mk => b2g/build.mk
rename : mobile/xul/chrome/Makefile.in => b2g/chrome/Makefile.in
rename : mobile/xul/chrome/content/commandUtil.js => b2g/chrome/content/commandUtil.js
rename : mobile/xul/chrome/content/netError.xhtml => b2g/chrome/content/netError.xhtml
rename : mobile/xul/chrome/jar.mn => b2g/chrome/jar.mn
rename : mobile/xul/confvars.sh => b2g/confvars.sh
rename : mobile/xul/installer/Makefile.in => b2g/installer/Makefile.in
rename : mobile/xul/installer/package-manifest.in => b2g/installer/package-manifest.in
rename : mobile/xul/installer/removed-files.in => b2g/installer/removed-files.in
rename : mobile/xul/locales/Makefile.in => b2g/locales/Makefile.in
rename : mobile/xul/locales/all-locales => b2g/locales/all-locales
rename : mobile/xul/locales/en-US/chrome/about.dtd => b2g/locales/en-US/chrome/about.dtd
rename : mobile/xul/locales/en-US/chrome/aboutCertError.dtd => b2g/locales/en-US/chrome/aboutCertError.dtd
rename : mobile/xul/locales/en-US/chrome/notification.dtd => b2g/locales/en-US/chrome/notification.dtd
rename : mobile/xul/locales/en-US/chrome/overrides/appstrings.properties => b2g/locales/en-US/chrome/overrides/appstrings.properties
rename : mobile/xul/locales/en-US/chrome/overrides/netError.dtd => b2g/locales/en-US/chrome/overrides/netError.dtd
rename : mobile/xul/locales/en-US/chrome/overrides/passwordmgr.properties => b2g/locales/en-US/chrome/overrides/passwordmgr.properties
rename : mobile/xul/locales/en-US/chrome/phishing.dtd => b2g/locales/en-US/chrome/phishing.dtd
rename : mobile/xul/locales/en-US/chrome/webapps.dtd => b2g/locales/en-US/chrome/webapps.dtd
rename : mobile/xul/locales/en-US/crashreporter/crashreporter-override.ini => b2g/locales/en-US/crashreporter/crashreporter-override.ini
rename : mobile/xul/locales/en-US/defines.inc => b2g/locales/en-US/defines.inc
rename : mobile/xul/locales/en-US/installer/setup.ini => b2g/locales/en-US/installer/setup.ini
rename : mobile/xul/locales/en-US/updater/updater.ini => b2g/locales/en-US/updater/updater.ini
rename : mobile/xul/locales/filter.py => b2g/locales/filter.py
rename : mobile/xul/locales/generic/install.rdf => b2g/locales/generic/install.rdf
rename : mobile/xul/locales/jar.mn => b2g/locales/jar.mn
rename : mobile/xul/locales/l10n.ini => b2g/locales/l10n.ini
rename : mobile/xul/makefiles.sh => b2g/makefiles.sh
2011-12-07 07:52:26 +08:00

241 lines
8.1 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is B2G.
*
* The Initial Developer of the Original Code is
* the Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
(function touchEventHandler() {
let debugging = false;
function debug(str) {
if (debugging)
dump(str + '\n');
};
let contextMenuTimeout = 0;
// This guard is used to not re-enter the events processing loop for
// self dispatched events
let ignoreEvents = false;
// During a 'touchstart' and the first 'touchmove' mouse events can be
// prevented for the current touch sequence.
let canPreventMouseEvents = false;
// Used to track the first mousemove and to cancel click dispatc if it's not
// true.
let isNewTouchAction = false;
// If this is set to true all mouse events will be cancelled by calling
// both evt.preventDefault() and evt.stopPropagation().
// This will not prevent a contextmenu event to be fired.
// This can be turned on if canPreventMouseEvents is true and the consumer
// application call evt.preventDefault();
let preventMouseEvents = false;
let TouchEventHandler = {
events: ['mousedown', 'mousemove', 'mouseup', 'click', 'unload'],
start: function teh_start() {
this.events.forEach((function(evt) {
shell.home.addEventListener(evt, this, true);
}).bind(this));
},
stop: function teh_stop() {
this.events.forEach((function(evt) {
shell.home.removeEventListener(evt, this, true);
}).bind(this));
},
handleEvent: function teh_handleEvent(evt) {
if (evt.button || ignoreEvents)
return;
let eventTarget = this.target;
let type = '';
switch (evt.type) {
case 'mousedown':
debug('mousedown:');
this.target = evt.target;
this.timestamp = evt.timeStamp;
evt.target.setCapture(false);
preventMouseEvents = false;
canPreventMouseEvents = true;
isNewTouchAction = true;
contextMenuTimeout =
this.sendContextMenu(evt.target, evt.pageX, evt.pageY, 2000);
this.startX = evt.pageX;
this.startY = evt.pageY;
type = 'touchstart';
break;
case 'mousemove':
if (!eventTarget)
return;
// On device a mousemove event if fired right after the mousedown
// because of the size of the finger, so let's ignore what happens
// below 5ms
if (evt.timeStamp - this.timestamp < 30)
break;
if (isNewTouchAction) {
canPreventMouseEvents = true;
isNewTouchAction = false;
}
if (Math.abs(this.startX - evt.pageX) > 15 ||
Math.abs(this.startY - evt.pageY) > 15)
window.clearTimeout(contextMenuTimeout);
type = 'touchmove';
break;
case 'mouseup':
if (!eventTarget)
return;
debug('mouseup:');
window.clearTimeout(contextMenuTimeout);
eventTarget.ownerDocument.releaseCapture();
this.target = null;
type = 'touchend';
break;
case 'unload':
if (!eventTarget)
return;
window.clearTimeout(contextMenuTimeout);
eventTarget.ownerDocument.releaseCapture();
this.target = null;
TouchEventHandler.stop();
return;
case 'click':
if (!isNewTouchAction) {
debug('click: cancel');
evt.preventDefault();
evt.stopPropagation();
} else {
// Mouse events has been cancelled so dispatch a sequence
// of events to where touchend has been fired
if (preventMouseEvents) {
let target = evt.target;
ignoreEvents = true;
try {
this.fireMouseEvent('mousemove', evt);
this.fireMouseEvent('mousedown', evt);
this.fireMouseEvent('mouseup', evt);
} catch (e) {
alert(e);
}
evt.preventDefault();
evt.stopPropagation();
ignoreEvents = false;
}
debug('click: fire');
}
return;
}
let target = eventTarget || this.target;
if (target && type) {
let touchEvent = this.sendTouchEvent(evt, target, type);
if (touchEvent.getPreventDefault() && canPreventMouseEvents)
preventMouseEvents = true;
}
if (preventMouseEvents) {
evt.preventDefault();
evt.stopPropagation();
if (type != 'touchmove')
debug('cancelled (fire ' + type + ')');
}
},
fireMouseEvent: function teh_fireMouseEvent(type, evt) {
debug(type + ': fire');
let content = evt.target.ownerDocument.defaultView;
var utils = content.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils);
utils.sendMouseEvent(type, evt.pageX, evt.pageY, 0, 1, 0, true);
},
sendContextMenu: function teh_sendContextMenu(target, x, y, delay) {
let doc = target.ownerDocument;
let evt = doc.createEvent('MouseEvent');
evt.initMouseEvent('contextmenu', true, true, doc.defaultView,
0, x, y, x, y, false, false, false, false,
0, null);
let timeout = window.setTimeout((function contextMenu() {
debug('fire context-menu');
target.dispatchEvent(evt);
if (!evt.getPreventDefault())
return;
doc.releaseCapture();
this.target = null;
isNewTouchAction = false;
}).bind(this), delay);
return timeout;
},
sendTouchEvent: function teh_sendTouchEvent(evt, target, name) {
let touchEvent = document.createEvent('touchevent');
let point = document.createTouch(window, target, 0,
evt.pageX, evt.pageY,
evt.screenX, evt.screenY,
evt.clientX, evt.clientY,
1, 1, 0, 0);
let touches = document.createTouchList(point);
let targetTouches = touches;
let changedTouches = touches;
touchEvent.initTouchEvent(name, true, true, window, 0,
false, false, false, false,
touches, targetTouches, changedTouches);
target.dispatchEvent(touchEvent);
return touchEvent;
}
};
window.addEventListener('ContentStart', function touchStart(evt) {
window.removeEventListener('ContentStart', touchStart);
TouchEventHandler.start();
});
})();