jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/371508 )

Change subject: Update jQuery Mobile to 1.5 (alpha)
......................................................................


Update jQuery Mobile to 1.5 (alpha)

Downloaded from http://jquerymobile.com/download-builder/ with two modules:
* Core / Virtual Mouse (vmouse) Bindings
* Events / Touch

Local hacks:
* Replaced all .bind() calls with .on() to avoid jQuery Migrate warnings
* Replaced all .unbind() calls with .off() to avoid jQuery Migrate warnings

Bug: T165816
Bug: T174545
Change-Id: Icdcaf49c583f2f1380656cd0a0b6333ace0f1c53
---
M resources/libraries/jquery.mobile.custom.js
1 file changed, 434 insertions(+), 339 deletions(-)

Approvals:
  jenkins-bot: Verified
  Isarra: Looks good to me, approved



diff --git a/resources/libraries/jquery.mobile.custom.js 
b/resources/libraries/jquery.mobile.custom.js
index bb1353f..f97ad4b 100644
--- a/resources/libraries/jquery.mobile.custom.js
+++ b/resources/libraries/jquery.mobile.custom.js
@@ -1,12 +1,12 @@
-// Custom hacks:
-// * Replaced .bind() calls with .on() for compatibility with jQuery 3
-// * Replaced .unbind() calls with .off() for compatibility with jQuery 3
+// Local hacks:
+// * Replaced all .bind() calls with .on() to avoid jQuery Migrate warnings
+// * Replaced all .unbind() calls with .off() to avoid jQuery Migrate warnings
 
 /*
-* jQuery Mobile v1.4.5
+* jQuery Mobile v1.5.0-alpha.1
 * http://jquerymobile.com
 *
-* Copyright 2010, 2014 jQuery Foundation, Inc. and other contributors
+* Copyright jQuery Foundation, Inc. and other contributors
 * Released under the MIT license.
 * http://jquery.org/license
 *
@@ -23,7 +23,21 @@
                // Browser globals
                factory( root.jQuery, root, doc );
        }
-}( this, document, function ( jQuery, window, document, undefined ) {// This 
plugin is an experiment for abstracting away the touch and mouse
+}( this, document, function ( jQuery, window, document, undefined ) {/*!
+ * jQuery Mobile Virtual Mouse @VERSION
+ * http://jquerymobile.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Virtual Mouse (vmouse) Bindings
+//>>group: Core
+//>>description: Normalizes touch/mouse events.
+//>>docs: http://api.jquerymobile.com/?s=vmouse
+
+// This plugin is an experiment for abstracting away the touch and mouse
 // events so that developers don't have to worry about which method of input
 // the device their document is loaded on supports.
 //
@@ -38,14 +52,26 @@
 // The current version exposes the following virtual events to jQuery bind 
methods:
 // "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel"
 
-(function( $, window, document, undefined ) {
+( function( factory ) {
+       if ( typeof define === "function" && define.amd ) {
+
+               // AMD. Register as an anonymous module.
+               define( 'vmouse',[ "jquery" ], factory );
+       } else {
+
+               // Browser globals
+               factory( jQuery );
+       }
+} )( function( $ ) {
 
 var dataPropertyName = "virtualMouseBindings",
        touchTargetPropertyName = "virtualTouchID",
-       virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick 
vmouseout vmousecancel".split( " " ),
        touchEventProps = "clientX clientY pageX pageY screenX screenY".split( 
" " ),
+       virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick 
vmouseout vmousecancel".split( " " ),
+       generalProps = ( "altKey bubbles cancelable ctrlKey currentTarget 
detail eventPhase " +
+               "metaKey relatedTarget shiftKey target timeStamp view which" 
).split( " " ),
        mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
-       mouseEventProps = $.event.props.concat( mouseHookProps ),
+       mouseEventProps = generalProps.concat( mouseHookProps ),
        activeDocHandlers = {},
        resetTimerID = 0,
        startX = 0,
@@ -63,7 +89,8 @@
 $.vmouse = {
        moveDistanceThreshold: 10,
        clickDistanceThreshold: 10,
-       resetTimerDuration: 1500
+       resetTimerDuration: 1500,
+       maximumTimeBetweenTouches: 100
 };
 
 function getNativeEvent( event ) {
@@ -83,7 +110,7 @@
        event.type = eventType;
 
        oe = event.originalEvent;
-       props = $.event.props;
+       props = generalProps;
 
        // addresses separation of $.event.props in to $.event.mouseHook.props 
and Issue 3280
        // https://github.com/jquery/jquery-mobile/issues/3280
@@ -95,7 +122,7 @@
        // this would happen if we could call $.event.fix instead of $.Event
        // but we don't have a way to force an event to be fixed multiple times
        if ( oe ) {
-               for ( i = props.length, prop; i; ) {
+               for ( i = props.length; i; ) {
                        prop = props[ --i ];
                        event[ prop ] = oe[ prop ];
                }
@@ -103,18 +130,18 @@
 
        // make sure that if the mouse and click virtual events are generated
        // without a .which one is defined
-       if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ) {
+       if ( t.search( /mouse(down|up)|click/ ) > -1 && !event.which ) {
                event.which = 1;
        }
 
-       if ( t.search(/^touch/) !== -1 ) {
+       if ( t.search( /^touch/ ) !== -1 ) {
                ne = getNativeEvent( oe );
                t = ne.touches;
                ct = ne.changedTouches;
-               touch = ( t && t.length ) ? t[0] : ( ( ct && ct.length ) ? ct[ 
0 ] : undefined );
+               touch = ( t && t.length ) ? t[ 0 ] : ( ( ct && ct.length ) ? 
ct[ 0 ] : undefined );
 
                if ( touch ) {
-                       for ( j = 0, len = touchEventProps.length; j < len; 
j++) {
+                       for ( j = 0, len = touchEventProps.length; j < len; j++ 
) {
                                prop = touchEventProps[ j ];
                                event[ prop ] = touch[ prop ];
                        }
@@ -133,7 +160,7 @@
 
                b = $.data( element, dataPropertyName );
 
-               for (  k in b ) {
+               for ( k in b ) {
                        if ( b[ k ] ) {
                                flags[ k ] = flags.hasVirtualBinding = true;
                        }
@@ -181,6 +208,13 @@
        enableTouchBindings();
 }
 
+function clearResetTimer() {
+       if ( resetTimerID ) {
+               clearTimeout( resetTimerID );
+               resetTimerID = 0;
+       }
+}
+
 function startResetTimer() {
        clearResetTimer();
        resetTimerID = setTimeout( function() {
@@ -189,22 +223,15 @@
        }, $.vmouse.resetTimerDuration );
 }
 
-function clearResetTimer() {
-       if ( resetTimerID ) {
-               clearTimeout( resetTimerID );
-               resetTimerID = 0;
-       }
-}
-
 function triggerVirtualEvent( eventType, event, flags ) {
        var ve;
 
        if ( ( flags && flags[ eventType ] ) ||
-                               ( !flags && 
getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
+                       ( !flags && getClosestElementWithVirtualBinding( 
event.target, eventType ) ) ) {
 
                ve = createVirtualEvent( event, eventType );
 
-               $( event.target).trigger( ve );
+               $( event.target ).trigger( ve );
        }
 
        return ve;
@@ -213,6 +240,22 @@
 function mouseEventCallback( event ) {
        var touchID = $.data( event.target, touchTargetPropertyName ),
                ve;
+
+       // It is unexpected if a click event is received before a touchend
+       // or touchmove event, however this is a known behavior in Mobile
+       // Safari when Mobile VoiceOver (as of iOS 8) is enabled and the user
+       // double taps to activate a link element. In these cases if a touch
+       // event is not received within the maximum time between touches,
+       // re-enable mouse bindings and call the mouse event handler again.
+       if ( event.type === "click" && $.data( event.target, "lastTouchType" ) 
=== "touchstart" ) {
+               setTimeout( function() {
+                       if ( $.data( event.target, "lastTouchType" ) === 
"touchstart" ) {
+                               enableMouseBindings();
+                               delete $.data( event.target ).lastTouchType;
+                               mouseEventCallback( event );
+                       }
+               }, $.vmouse.maximumTimeBetweenTouches );
+       }
 
        if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) 
) {
                ve = triggerVirtualEvent( "v" + event.type, event );
@@ -239,6 +282,8 @@
 
                target = event.target;
                flags = getVirtualBindingFlags( target );
+
+               $.data( event.target, "lastTouchType", event.type );
 
                if ( flags.hasVirtualBinding ) {
 
@@ -269,6 +314,8 @@
                triggerVirtualEvent( "vmousecancel", event, 
getVirtualBindingFlags( event.target ) );
        }
 
+       $.data( event.target, "lastTouchType", event.type );
+
        didScroll = true;
        startResetTimer();
 }
@@ -283,9 +330,11 @@
                moveThreshold = $.vmouse.moveDistanceThreshold,
                flags = getVirtualBindingFlags( event.target );
 
-               didScroll = didScroll ||
-                       ( Math.abs( t.pageX - startX ) > moveThreshold ||
-                               Math.abs( t.pageY - startY ) > moveThreshold );
+       $.data( event.target, "lastTouchType", event.type );
+
+       didScroll = didScroll ||
+               ( Math.abs( t.pageX - startX ) > moveThreshold ||
+               Math.abs( t.pageY - startY ) > moveThreshold );
 
        if ( didScroll && !didCancel ) {
                triggerVirtualEvent( "vmousecancel", event, flags );
@@ -296,11 +345,12 @@
 }
 
 function handleTouchEnd( event ) {
-       if ( blockTouchTriggers ) {
+       if ( blockTouchTriggers || $.data( event.target, "lastTouchType" ) === 
undefined ) {
                return;
        }
 
        disableTouchBindings();
+       delete $.data( event.target ).lastTouchType;
 
        var flags = getVirtualBindingFlags( event.target ),
                ve, t;
@@ -314,18 +364,18 @@
                        // touch. This means we need to rely on coordinates for 
blocking
                        // any click that is generated.
                        t = getNativeEvent( event ).changedTouches[ 0 ];
-                       clickBlockList.push({
+                       clickBlockList.push( {
                                touchID: lastTouchID,
                                x: t.clientX,
                                y: t.clientY
-                       });
+                       } );
 
                        // Prevent any mouse events that follow from triggering
                        // virtual event notifications.
                        blockMouseTriggers = true;
                }
        }
-       triggerVirtualEvent( "vmouseout", event, flags);
+       triggerVirtualEvent( "vmouseout", event, flags );
        didScroll = false;
 
        startResetTimer();
@@ -345,13 +395,14 @@
        return false;
 }
 
-function dummyMouseHandler() {}
+function dummyMouseHandler() {
+}
 
 function getSpecialEventObject( eventType ) {
        var realType = eventType.substr( 1 );
 
        return {
-               setup: function(/* data, namespace */) {
+               setup: function( /* data, namespace */ ) {
                        // If this is the first virtual mouse binding for this 
element,
                        // add a bindings object to its data.
 
@@ -384,7 +435,7 @@
                                // If this is the first virtual mouse binding 
for the document,
                                // register our touchstart handler on the 
document.
 
-                               activeDocHandlers[ "touchstart" ] = ( 
activeDocHandlers[ "touchstart" ] || 0) + 1;
+                               activeDocHandlers[ "touchstart" ] = ( 
activeDocHandlers[ "touchstart" ] || 0 ) + 1;
 
                                if ( activeDocHandlers[ "touchstart" ] === 1 ) {
                                        $document.on( "touchstart", 
handleTouchStart )
@@ -406,11 +457,11 @@
                        }
                },
 
-               teardown: function(/* data, namespace */) {
+               teardown: function( /* data, namespace */ ) {
                        // If this is the last virtual binding for this 
eventType,
                        // remove its global handler from the document.
 
-                       --activeDocHandlers[ eventType ];
+                       --activeDocHandlers[eventType];
 
                        if ( !activeDocHandlers[ eventType ] ) {
                                $document.off( realType, mouseEventCallback );
@@ -420,7 +471,7 @@
                                // If this is the last virtual mouse binding in 
existence,
                                // remove our document touchstart listener.
 
-                               --activeDocHandlers[ "touchstart" ];
+                               --activeDocHandlers["touchstart"];
 
                                if ( !activeDocHandlers[ "touchstart" ] ) {
                                        $document.off( "touchstart", 
handleTouchStart )
@@ -511,7 +562,7 @@
                                        touchID = 0;
 
                                        if ( ( ele === target && Math.abs( o.x 
- x ) < threshold && Math.abs( o.y - y ) < threshold ) ||
-                                                               $.data( ele, 
touchTargetPropertyName ) === o.touchID ) {
+                                                       $.data( ele, 
touchTargetPropertyName ) === o.touchID ) {
                                                // XXX: We may want to consider 
removing matches from the block list
                                                //      instead of waiting for 
the reset timer to fire.
                                                e.preventDefault();
@@ -522,347 +573,391 @@
                                ele = ele.parentNode;
                        }
                }
-       }, true);
+       }, true );
 }
-})( jQuery, window, document );
+} );
 
-(function( $ ) {
-       $.mobile = {};
-}( jQuery ));
+/*!
+ * jQuery Mobile Namespace @VERSION
+ * http://jquerymobile.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
 
-       (function( $, undefined ) {
-               var support = {
-                       touch: "ontouchend" in document
-               };
+//>>label: Namespace
+//>>group: Core
+//>>description: The mobile namespace on the jQuery object
 
-               $.mobile.support = $.mobile.support || {};
-               $.extend( $.support, support );
-               $.extend( $.mobile.support, support );
-       }( jQuery ));
+( function( factory ) {
+       if ( typeof define === "function" && define.amd ) {
 
+               // AMD. Register as an anonymous module.
+               define( 'ns',[ "jquery" ], factory );
+       } else {
 
-(function( $, window, undefined ) {
-       var $document = $( document ),
-               supportTouch = $.mobile.support.touch,
-               scrollEvent = "touchmove scroll",
-               touchStartEvent = supportTouch ? "touchstart" : "mousedown",
-               touchStopEvent = supportTouch ? "touchend" : "mouseup",
-               touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
-
-       // setup new event shortcuts
-       $.each( ( "touchstart touchmove touchend " +
-               "tap taphold " +
-               "swipe swipeleft swiperight " +
-               "scrollstart scrollstop" ).split( " " ), function( i, name ) {
-
-               $.fn[ name ] = function( fn ) {
-                       return fn ? this.on( name, fn ) : this.trigger( name );
-               };
-
-               // jQuery < 1.8
-               if ( $.attrFn ) {
-                       $.attrFn[ name ] = true;
-               }
-       });
-
-       function triggerCustomEvent( obj, eventType, event, bubble ) {
-               var originalType = event.type;
-               event.type = eventType;
-               if ( bubble ) {
-                       $.event.trigger( event, undefined, obj );
-               } else {
-                       $.event.dispatch.call( obj, event );
-               }
-               event.type = originalType;
+               // Browser globals
+               factory( jQuery );
        }
+} )( function( $ ) {
 
-       // also handles scrollstop
-       $.event.special.scrollstart = {
+$.mobile = { version: "@VERSION" };
 
-               enabled: true,
-               setup: function() {
+return $.mobile;
+} );
 
-                       var thisObject = this,
-                               $this = $( thisObject ),
-                               scrolling,
-                               timer;
+/*!
+ * jQuery Mobile Touch Support Test @VERSION
+ * http://jquerymobile.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
 
-                       function trigger( event, state ) {
-                               scrolling = state;
-                               triggerCustomEvent( thisObject, scrolling ? 
"scrollstart" : "scrollstop", event );
-                       }
+//>>label: Touch support test
+//>>group: Core
+//>>description: Touch feature test
 
-                       // iPhone triggers scroll after a small delay; use 
touchmove instead
-                       $this.on( scrollEvent, function( event ) {
+( function( factory ) {
+       if ( typeof define === "function" && define.amd ) {
 
-                               if ( !$.event.special.scrollstart.enabled ) {
-                                       return;
-                               }
+               // AMD. Register as an anonymous module.
+               define( 'support/touch',[
+                       "jquery",
+                       "../ns" ], factory );
+       } else {
 
-                               if ( !scrolling ) {
-                                       trigger( event, true );
-                               }
+               // Browser globals
+               factory( jQuery );
+       }
+} )( function( $ ) {
 
-                               clearTimeout( timer );
-                               timer = setTimeout( function() {
-                                       trigger( event, false );
-                               }, 50 );
-                       });
-               },
-               teardown: function() {
-                       $( this ).off( scrollEvent );
-               }
+var support = {
+       touch: "ontouchend" in document
+};
+
+$.mobile.support = $.mobile.support || {};
+$.extend( $.support, support );
+$.extend( $.mobile.support, support );
+
+return $.support;
+} );
+
+/*!
+ * jQuery Mobile Touch Events @VERSION
+ * http://jquerymobile.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Touch
+//>>group: Events
+//>>description: Touch events including: touchstart, touchmove, touchend, tap, 
taphold, swipe, swipeleft, swiperight
+
+( function( factory ) {
+       if ( typeof define === "function" && define.amd ) {
+
+               // AMD. Register as an anonymous module.
+               define( 'events/touch',[
+                       "jquery",
+                       "../vmouse",
+                       "../support/touch" ], factory );
+       } else {
+
+               // Browser globals
+               factory( jQuery );
+       }
+} )( function( $ ) {
+var $document = $( document ),
+       supportTouch = $.mobile.support.touch,
+       touchStartEvent = supportTouch ? "touchstart" : "mousedown",
+       touchStopEvent = supportTouch ? "touchend" : "mouseup",
+       touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
+
+// setup new event shortcuts
+$.each( ( "touchstart touchmove touchend " +
+"tap taphold " +
+"swipe swipeleft swiperight" ).split( " " ), function( i, name ) {
+
+       $.fn[ name ] = function( fn ) {
+               return fn ? this.on( name, fn ) : this.trigger( name );
        };
 
-       // also handles taphold
-       $.event.special.tap = {
-               tapholdThreshold: 750,
-               emitTapOnTaphold: true,
-               setup: function() {
-                       var thisObject = this,
-                               $this = $( thisObject ),
-                               isTaphold = false;
+       // jQuery < 1.8
+       if ( $.attrFn ) {
+               $.attrFn[ name ] = true;
+       }
+} );
 
-                       $this.on( "vmousedown", function( event ) {
-                               isTaphold = false;
-                               if ( event.which && event.which !== 1 ) {
-                                       return false;
-                               }
+function triggerCustomEvent( obj, eventType, event, bubble ) {
+       var originalType = event.type;
+       event.type = eventType;
+       if ( bubble ) {
+               $.event.trigger( event, undefined, obj );
+       } else {
+               $.event.dispatch.call( obj, event );
+       }
+       event.type = originalType;
+}
 
-                               var origTarget = event.target,
-                                       timer;
+// also handles taphold
+$.event.special.tap = {
+       tapholdThreshold: 750,
+       emitTapOnTaphold: true,
+       setup: function() {
+               var thisObject = this,
+                       $this = $( thisObject ),
+                       isTaphold = false;
 
-                               function clearTapTimer() {
-                                       clearTimeout( timer );
-                               }
-
-                               function clearTapHandlers() {
-                                       clearTapTimer();
-
-                                       $this.off( "vclick", clickHandler )
-                                               .off( "vmouseup", clearTapTimer 
);
-                                       $document.off( "vmousecancel", 
clearTapHandlers );
-                               }
-
-                               function clickHandler( event ) {
-                                       clearTapHandlers();
-
-                                       // ONLY trigger a 'tap' event if the 
start target is
-                                       // the same as the stop target.
-                                       if ( !isTaphold && origTarget === 
event.target ) {
-                                               triggerCustomEvent( thisObject, 
"tap", event );
-                                       } else if ( isTaphold ) {
-                                               event.preventDefault();
-                                       }
-                               }
-
-                               $this.on( "vmouseup", clearTapTimer )
-                                       .on( "vclick", clickHandler );
-                               $document.on( "vmousecancel", clearTapHandlers 
);
-
-                               timer = setTimeout( function() {
-                                       if ( 
!$.event.special.tap.emitTapOnTaphold ) {
-                                               isTaphold = true;
-                                       }
-                                       triggerCustomEvent( thisObject, 
"taphold", $.Event( "taphold", { target: origTarget } ) );
-                               }, $.event.special.tap.tapholdThreshold );
-                       });
-               },
-               teardown: function() {
-                       $( this ).off( "vmousedown" ).off( "vclick" ).off( 
"vmouseup" );
-                       $document.off( "vmousecancel" );
-               }
-       };
-
-       // Also handles swipeleft, swiperight
-       $.event.special.swipe = {
-
-               // More than this horizontal displacement, and we will suppress 
scrolling.
-               scrollSupressionThreshold: 30,
-
-               // More time than this, and it isn't a swipe.
-               durationThreshold: 1000,
-
-               // Swipe horizontal displacement must be more than this.
-               horizontalDistanceThreshold: 30,
-
-               // Swipe vertical displacement must be less than this.
-               verticalDistanceThreshold: 30,
-
-               getLocation: function ( event ) {
-                       var winPageX = window.pageXOffset,
-                               winPageY = window.pageYOffset,
-                               x = event.clientX,
-                               y = event.clientY;
-
-                       if ( event.pageY === 0 && Math.floor( y ) > Math.floor( 
event.pageY ) ||
-                               event.pageX === 0 && Math.floor( x ) > 
Math.floor( event.pageX ) ) {
-
-                               // iOS4 clientX/clientY have the value that 
should have been
-                               // in pageX/pageY. While pageX/page/ have the 
value 0
-                               x = x - winPageX;
-                               y = y - winPageY;
-                       } else if ( y < ( event.pageY - winPageY) || x < ( 
event.pageX - winPageX ) ) {
-
-                               // Some Android browsers have totally bogus 
values for clientX/Y
-                               // when scrolling/zooming a page. Detectable 
since clientX/clientY
-                               // should never be smaller than pageX/pageY 
minus page scroll
-                               x = event.pageX - winPageX;
-                               y = event.pageY - winPageY;
-                       }
-
-                       return {
-                               x: x,
-                               y: y
-                       };
-               },
-
-               start: function( event ) {
-                       var data = event.originalEvent.touches ?
-                                       event.originalEvent.touches[ 0 ] : 
event,
-                               location = $.event.special.swipe.getLocation( 
data );
-                       return {
-                                               time: ( new Date() ).getTime(),
-                                               coords: [ location.x, 
location.y ],
-                                               origin: $( event.target )
-                                       };
-               },
-
-               stop: function( event ) {
-                       var data = event.originalEvent.touches ?
-                                       event.originalEvent.touches[ 0 ] : 
event,
-                               location = $.event.special.swipe.getLocation( 
data );
-                       return {
-                                               time: ( new Date() ).getTime(),
-                                               coords: [ location.x, 
location.y ]
-                                       };
-               },
-
-               handleSwipe: function( start, stop, thisObject, origTarget ) {
-                       if ( stop.time - start.time < 
$.event.special.swipe.durationThreshold &&
-                               Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] 
) > $.event.special.swipe.horizontalDistanceThreshold &&
-                               Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] 
) < $.event.special.swipe.verticalDistanceThreshold ) {
-                               var direction = start.coords[0] > stop.coords[ 
0 ] ? "swipeleft" : "swiperight";
-
-                               triggerCustomEvent( thisObject, "swipe", 
$.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), 
true );
-                               triggerCustomEvent( thisObject, 
direction,$.Event( direction, { target: origTarget, swipestart: start, 
swipestop: stop } ), true );
+               $this.on( "vmousedown", function( event ) {
+                       isTaphold = false;
+                       if ( event.which && event.which !== 1 ) {
                                return true;
                        }
-                       return false;
 
-               },
+                       var origTarget = event.target,
+                               timer, clickHandler;
 
-               // This serves as a flag to ensure that at most one swipe event 
event is
-               // in work at any given time
-               eventInProgress: false,
-
-               setup: function() {
-                       var events,
-                               thisObject = this,
-                               $this = $( thisObject ),
-                               context = {};
-
-                       // Retrieve the events data for this element and add 
the swipe context
-                       events = $.data( this, "mobile-events" );
-                       if ( !events ) {
-                               events = { length: 0 };
-                               $.data( this, "mobile-events", events );
+                       function clearTapTimer() {
+                               if ( timer ) {
+                                       $this.on( "vclick", clickHandler );
+                                       clearTimeout( timer );
+                               }
                        }
-                       events.length++;
-                       events.swipe = context;
 
-                       context.start = function( event ) {
+                       function clearTapHandlers() {
+                               clearTapTimer();
 
-                               // Bail if we're already working on a swipe 
event
-                               if ( $.event.special.swipe.eventInProgress ) {
+                               $this.off( "vclick", clickHandler )
+                                       .off( "vmouseup", clearTapTimer );
+                               $document.off( "vmousecancel", clearTapHandlers 
);
+                       }
+
+                       clickHandler = function( event ) {
+                               clearTapHandlers();
+
+                               // ONLY trigger a 'tap' event if the start 
target is
+                               // the same as the stop target.
+                               if ( !isTaphold && origTarget === event.target 
) {
+                                       triggerCustomEvent( thisObject, "tap", 
event );
+                               } else if ( isTaphold ) {
+                                       event.preventDefault();
+                               }
+                       };
+
+                       $this.on( "vmouseup", clearTapTimer );
+
+                       $document.on( "vmousecancel", clearTapHandlers );
+
+                       timer = setTimeout( function() {
+                               if ( !$.event.special.tap.emitTapOnTaphold ) {
+                                       isTaphold = true;
+                               }
+                               timer = 0;
+                               triggerCustomEvent( thisObject, "taphold", 
$.Event( "taphold", { target: origTarget } ) );
+                       }, $.event.special.tap.tapholdThreshold );
+               } );
+       },
+       teardown: function() {
+               $( this ).off( "vmousedown" ).off( "vclick" ).off( "vmouseup" );
+               $document.off( "vmousecancel" );
+       }
+};
+
+// Also handles swipeleft, swiperight
+$.event.special.swipe = {
+
+       // More than this horizontal displacement, and we will suppress 
scrolling.
+       scrollSupressionThreshold: 30,
+
+       // More time than this, and it isn't a swipe.
+       durationThreshold: 1000,
+
+       // Swipe horizontal displacement must be more than this.
+       horizontalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30,
+
+       // Swipe vertical displacement must be less than this.
+       verticalDistanceThreshold: window.devicePixelRatio >= 2 ? 15 : 30,
+
+       getLocation: function( event ) {
+               var winPageX = window.pageXOffset,
+                       winPageY = window.pageYOffset,
+                       x = event.clientX,
+                       y = event.clientY;
+
+               if ( event.pageY === 0 && Math.floor( y ) > Math.floor( 
event.pageY ) ||
+                               event.pageX === 0 && Math.floor( x ) > 
Math.floor( event.pageX ) ) {
+
+                       // iOS4 clientX/clientY have the value that should have 
been
+                       // in pageX/pageY. While pageX/page/ have the value 0
+                       x = x - winPageX;
+                       y = y - winPageY;
+               } else if ( y < ( event.pageY - winPageY ) || x < ( event.pageX 
- winPageX ) ) {
+
+                       // Some Android browsers have totally bogus values for 
clientX/Y
+                       // when scrolling/zooming a page. Detectable since 
clientX/clientY
+                       // should never be smaller than pageX/pageY minus page 
scroll
+                       x = event.pageX - winPageX;
+                       y = event.pageY - winPageY;
+               }
+
+               return {
+                       x: x,
+                       y: y
+               };
+       },
+
+       start: function( event ) {
+               var data = event.originalEvent.touches ?
+                               event.originalEvent.touches[ 0 ] : event,
+                       location = $.event.special.swipe.getLocation( data );
+               return {
+                       time: ( new Date() ).getTime(),
+                       coords: [ location.x, location.y ],
+                       origin: $( event.target )
+               };
+       },
+
+       stop: function( event ) {
+               var data = event.originalEvent.touches ?
+                               event.originalEvent.touches[ 0 ] : event,
+                       location = $.event.special.swipe.getLocation( data );
+               return {
+                       time: ( new Date() ).getTime(),
+                       coords: [ location.x, location.y ]
+               };
+       },
+
+       handleSwipe: function( start, stop, thisObject, origTarget ) {
+               if ( stop.time - start.time < 
$.event.special.swipe.durationThreshold &&
+                               Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] 
) > $.event.special.swipe.horizontalDistanceThreshold &&
+                               Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] 
) < $.event.special.swipe.verticalDistanceThreshold ) {
+                       var direction = start.coords[ 0 ] > stop.coords[ 0 ] ? 
"swipeleft" : "swiperight";
+
+                       triggerCustomEvent( thisObject, "swipe", $.Event( 
"swipe", { target: origTarget, swipestart: start, swipestop: stop } ), true );
+                       triggerCustomEvent( thisObject, direction, $.Event( 
direction, { target: origTarget, swipestart: start, swipestop: stop } ), true );
+                       return true;
+               }
+               return false;
+
+       },
+
+       // This serves as a flag to ensure that at most one swipe event event is
+       // in work at any given time
+       eventInProgress: false,
+
+       setup: function() {
+               var events,
+                       thisObject = this,
+                       $this = $( thisObject ),
+                       context = {};
+
+               // Retrieve the events data for this element and add the swipe 
context
+               events = $.data( this, "mobile-events" );
+               if ( !events ) {
+                       events = { length: 0 };
+                       $.data( this, "mobile-events", events );
+               }
+               events.length++;
+               events.swipe = context;
+
+               context.start = function( event ) {
+
+                       // Bail if we're already working on a swipe event
+                       if ( $.event.special.swipe.eventInProgress ) {
+                               return;
+                       }
+                       $.event.special.swipe.eventInProgress = true;
+
+                       var stop,
+                               start = $.event.special.swipe.start( event ),
+                               origTarget = event.target,
+                               emitted = false;
+
+                       context.move = function( event ) {
+                               if ( !start || event.isDefaultPrevented() ) {
                                        return;
                                }
-                               $.event.special.swipe.eventInProgress = true;
 
-                               var stop,
-                                       start = $.event.special.swipe.start( 
event ),
-                                       origTarget = event.target,
-                                       emitted = false;
-
-                               context.move = function( event ) {
-                                       if ( !start || 
event.isDefaultPrevented() ) {
-                                               return;
-                                       }
-
-                                       stop = $.event.special.swipe.stop( 
event );
-                                       if ( !emitted ) {
-                                               emitted = 
$.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );
-                                               if ( emitted ) {
-
-                                                       // Reset the context to 
make way for the next swipe event
-                                                       
$.event.special.swipe.eventInProgress = false;
-                                               }
-                                       }
-                                       // prevent scrolling
-                                       if ( Math.abs( start.coords[ 0 ] - 
stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
-                                               event.preventDefault();
-                                       }
-                               };
-
-                               context.stop = function() {
-                                               emitted = true;
+                               stop = $.event.special.swipe.stop( event );
+                               if ( !emitted ) {
+                                       emitted = 
$.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );
+                                       if ( emitted ) {
 
                                                // Reset the context to make 
way for the next swipe event
                                                
$.event.special.swipe.eventInProgress = false;
-                                               $document.off( touchMoveEvent, 
context.move );
-                                               context.move = null;
-                               };
-
-                               $document.on( touchMoveEvent, context.move )
-                                       .one( touchStopEvent, context.stop );
+                                       }
+                               }
+                               // prevent scrolling
+                               if ( Math.abs( start.coords[ 0 ] - stop.coords[ 
0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
+                                       event.preventDefault();
+                               }
                        };
-                       $this.on( touchStartEvent, context.start );
-               },
 
-               teardown: function() {
-                       var events, context;
+                       context.stop = function() {
+                               emitted = true;
 
-                       events = $.data( this, "mobile-events" );
-                       if ( events ) {
-                               context = events.swipe;
-                               delete events.swipe;
-                               events.length--;
-                               if ( events.length === 0 ) {
-                                       $.removeData( this, "mobile-events" );
-                               }
-                       }
+                               // Reset the context to make way for the next 
swipe event
+                               $.event.special.swipe.eventInProgress = false;
+                               $document.off( touchMoveEvent, context.move );
+                               context.move = null;
+                       };
 
-                       if ( context ) {
-                               if ( context.start ) {
-                                       $( this ).off( touchStartEvent, 
context.start );
-                               }
-                               if ( context.move ) {
-                                       $document.off( touchMoveEvent, 
context.move );
-                               }
-                               if ( context.stop ) {
-                                       $document.off( touchStopEvent, 
context.stop );
-                               }
+                       $document.on( touchMoveEvent, context.move )
+                               .one( touchStopEvent, context.stop );
+               };
+               $this.on( touchStartEvent, context.start );
+       },
+
+       teardown: function() {
+               var events, context;
+
+               events = $.data( this, "mobile-events" );
+               if ( events ) {
+                       context = events.swipe;
+                       delete events.swipe;
+                       events.length--;
+                       if ( events.length === 0 ) {
+                               $.removeData( this, "mobile-events" );
                        }
                }
-       };
-       $.each({
-               scrollstop: "scrollstart",
-               taphold: "tap",
-               swipeleft: "swipe.left",
-               swiperight: "swipe.right"
-       }, function( event, sourceEvent ) {
 
-               $.event.special[ event ] = {
-                       setup: function() {
-                               $( this ).on( sourceEvent, $.noop );
-                       },
-                       teardown: function() {
-                               $( this ).off( sourceEvent );
+               if ( context ) {
+                       if ( context.start ) {
+                               $( this ).off( touchStartEvent, context.start );
                        }
-               };
-       });
+                       if ( context.move ) {
+                               $document.off( touchMoveEvent, context.move );
+                       }
+                       if ( context.stop ) {
+                               $document.off( touchStopEvent, context.stop );
+                       }
+               }
+       }
+};
+$.each( {
+       taphold: "tap",
+       swipeleft: "swipe.left",
+       swiperight: "swipe.right"
+}, function( event, sourceEvent ) {
 
-})( jQuery, this );
+       $.event.special[ event ] = {
+               setup: function() {
+                       $( this ).on( sourceEvent, $.noop );
+               },
+               teardown: function() {
+                       $( this ).off( sourceEvent );
+               }
+       };
+} );
+
+return $.event.special;
+} );
+
 
 
 }));

-- 
To view, visit https://gerrit.wikimedia.org/r/371508
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Icdcaf49c583f2f1380656cd0a0b6333ace0f1c53
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/skins/Timeless
Gerrit-Branch: master
Gerrit-Owner: Bartosz DziewoƄski <matma....@gmail.com>
Gerrit-Reviewer: Isarra <zhoris...@gmail.com>
Gerrit-Reviewer: TheDJ <hartman.w...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to