Ok I succeed to reproduce :), it was between 2 modifications of the code.

 I had this:

`var viewport = $(map.getViewport());

              if (!gaBrowserSniffer.touch) {
                // Listen to contextmenu events from the map.
                viewport.on('contextmenu', handler);

              } else {
                // On touch devices, display the context popup after a
                // long press (300ms)
                var startPixel, holdPromise;
                map.on('touchstart', function(event) {
                  $timeout.cancel(holdPromise);
                  startPixel = map.getEventPixel(event.originalEvent);
                  holdPromise = $timeout(function() {
                    handler(event);
                  }, 300, false);
                });
                map.on('touchend', function(event) {
                  $timeout.cancel(holdPromise);
                  startPixel = undefined;
                });
                map.on('touchmove', function(event) {
                  if (startPixel) {
                    var pixel = map.getEventPixel(event.originalEvent);
                    var deltaX = Math.abs(startPixel[0] - pixel[0]);
                    var deltaY = Math.abs(startPixel[1] - pixel[1]);
                    if (deltaX + deltaY > 6) {
                      $timeout.cancel(holdPromise);
                      startPixel = undefined;
                    }
                  }
                });
              }
` 

So `contextmenu` event on the viewport and `touch` events on the map.
On win8/IE10 I had an js error `property changeTouches doesn't exist` and the ìf touch` fixed the problem.

When all the events are on the viewport the `if touch` is useless, there is no errors. But if you say the touch events should be added on the map and not on the viewport this `if` makes sense.