From 0d6fca35c114e620d40252df7ad0fb9c46444fc5 Mon Sep 17 00:00:00 2001
From: Mark Salsbery <msalsbery@hotmail.com>
Date: Mon, 12 Jan 2015 16:08:26 -0800
Subject: [PATCH] Fix pointer type passed to capturePointer/releasePointer in
 pointer events model.

Remembered to change the test shim as well.
---
 src/mousetracker.js       | 27 ++++++++++++++++-----------
 test/legacy.mouse.shim.js | 12 ++++++++++--
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/mousetracker.js b/src/mousetracker.js
index 86e23f70..09b3c751 100644
--- a/src/mousetracker.js
+++ b/src/mousetracker.js
@@ -880,6 +880,7 @@
 
     if ( window.PointerEvent ) {
         // IE11 and other W3C Pointer Event implementations (see http://www.w3.org/TR/pointerevents)
+        $.MouseTracker.havePointerEvents = true;
         $.MouseTracker.subscribeEvents.push( "pointerover", "pointerout", "pointerdown", "pointerup", "pointermove", "pointercancel" );
         $.MouseTracker.unprefixedPointerEvents = true;
         if( navigator.maxTouchPoints ) {
@@ -891,6 +892,7 @@
         $.MouseTracker.haveMouseEnter = false;
     } else if ( window.MSPointerEvent ) {
         // IE10
+        $.MouseTracker.havePointerEvents = true;
         $.MouseTracker.subscribeEvents.push( "MSPointerOver", "MSPointerOut", "MSPointerDown", "MSPointerUp", "MSPointerMove", "MSPointerCancel" );
         $.MouseTracker.unprefixedPointerEvents = false;
         if( navigator.msMaxTouchPoints ) {
@@ -902,6 +904,7 @@
         $.MouseTracker.haveMouseEnter = false;
     } else {
         // Legacy W3C mouse events
+        $.MouseTracker.havePointerEvents = false;
         if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
             $.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave" );
             $.MouseTracker.haveMouseEnter = true;
@@ -1221,7 +1224,14 @@
     function getCaptureEventParams( tracker, pointerType ) {
         var delegate = THIS[ tracker.hash ];
 
-        if ( pointerType === 'mouse' ) {
+        if ( pointerType === 'pointerevent' ) {
+            return {
+                upName: $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp',
+                upHandler: delegate.pointerupcaptured,
+                moveName: $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove',
+                moveHandler: delegate.pointermovecaptured
+            };
+        } else if ( pointerType === 'mouse' ) {
             return {
                 upName: 'mouseup',
                 upHandler: delegate.mouseupcaptured,
@@ -1236,12 +1246,7 @@
                 moveHandler: delegate.touchmovecaptured
             };
         } else {
-            return {
-                upName: $.MouseTracker.unprefixedPointerEvents ? 'pointerup' : 'MSPointerUp',
-                upHandler: delegate.pointerupcaptured,
-                moveName: $.MouseTracker.unprefixedPointerEvents ? 'pointermove' : 'MSPointerMove',
-                moveHandler: delegate.pointermovecaptured
-            };
+            throw new Error( "MouseTracker.getCaptureEventParams: Unknown pointer type." );
         }
     }
 
@@ -1260,7 +1265,7 @@
             if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
                 tracker.element.setCapture( true );
             } else {
-                eventParams = getCaptureEventParams( tracker, pointerType );
+                eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType );
                 // We emulate mouse capture by hanging listeners on the document object.
                 //    (Note we listen on the capture phase so the captured handlers will get called first)
                 $.addEvent(
@@ -1295,7 +1300,7 @@
             if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
                 tracker.element.releaseCapture();
             } else {
-                eventParams = getCaptureEventParams( tracker, pointerType );
+                eventParams = getCaptureEventParams( tracker, $.MouseTracker.havePointerEvents ? 'pointerevent' : pointerType );
                 // We emulate mouse capture by hanging listeners on the document object.
                 //    (Note we listen on the capture phase so the captured handlers will get called first)
                 $.removeEvent(
@@ -2104,7 +2109,7 @@
 
         if ( updatePointersDown( tracker, event, [ gPoint ], event.button ) ) {
             $.stopEvent( event );
-            capturePointer( tracker, 'pointer' );
+            capturePointer( tracker, gPoint.type );
         }
 
         if ( tracker.clickHandler || tracker.dblClickHandler || tracker.pressHandler || tracker.dragHandler || tracker.dragEndHandler || tracker.pinchHandler ) {
@@ -2154,7 +2159,7 @@
         };
 
         if ( updatePointersUp( tracker, event, [ gPoint ], event.button ) ) {
-            releasePointer( tracker, 'pointer' );
+            releasePointer( tracker, gPoint.type );
         }
     }
 
diff --git a/test/legacy.mouse.shim.js b/test/legacy.mouse.shim.js
index 7a8ff7cc..535f8815 100644
--- a/test/legacy.mouse.shim.js
+++ b/test/legacy.mouse.shim.js
@@ -11,8 +11,15 @@
         $.MouseTracker.subscribeEvents.push( "MozMousePixelScroll" );
     }
 
-    $.MouseTracker.subscribeEvents.push( "mouseover", "mouseout", "mousedown", "mouseup", "mousemove" );
-    $.MouseTracker.haveMouseEnter = false;
+    $.MouseTracker.havePointerEvents = false;
+    if ( $.Browser.vendor === $.BROWSERS.IE && $.Browser.version < 9 ) {
+        $.MouseTracker.subscribeEvents.push( "mouseenter", "mouseleave" );
+        $.MouseTracker.haveMouseEnter = true;
+    } else {
+        $.MouseTracker.subscribeEvents.push( "mouseover", "mouseout" );
+        $.MouseTracker.haveMouseEnter = false;
+    }
+    $.MouseTracker.subscribeEvents.push( "mousedown", "mouseup", "mousemove" );
     if ( 'ontouchstart' in window ) {
         // iOS, Android, and other W3c Touch Event implementations (see http://www.w3.org/TR/2011/WD-touch-events-20110505)
         $.MouseTracker.subscribeEvents.push( "touchstart", "touchend", "touchmove", "touchcancel" );
@@ -33,4 +40,5 @@
     $.MouseTracker.mousePointerId = "legacy-mouse";
     $.MouseTracker.maxTouchPoints = 10;
 
+
 }(OpenSeadragon));