chromium/third_party/blink/web_tests/fast/events/touch/multi-touch-user-gesture.html

<script src='../../../resources/testharness.js'></script>
<script src='../../../resources/testharnessreport.js'></script>
<div id="target1" style="touch-action:none; width: 200px; height: 50px;">Target1</div>
<div id="target2" style="touch-action:none; width: 200px; height: 50px;">Target2</div>
<div id="description">Test user gesture behavior during multi-finger touch events.</div>
<div id="console"></div>

<script>

var target1 = document.getElementById('target1');
var rect1 = target1.getBoundingClientRect();
var targetX1 = rect1.left + rect1.width / 2;
var targetY1 = rect1.top + rect1.height / 2;

var target2 = document.getElementById('target2');
var rect2 = target2.getBoundingClientRect();
var targetX2 = rect2.left + rect2.width / 2;
var targetY2 = rect2.top + rect2.height / 2;

var receivedEvents = [];

['touchstart', 'touchmove', 'touchend'].forEach( eventName => {
  [target1, target2].forEach(t => {
    t.addEventListener(eventName, event => {
      var w = window.open("about:blank", "_blank");
      var openedPopup = undefined;
      if (w) {
        w.close();
        openedPopup = true;
      } else {
        openedPopup = false;
      }
      receivedEvents.push(event.type + '@' + event.target.id + '(' + openedPopup + ')');
    });
  });
});

var testUserGesture = async_test('Test user gesture behavior during multi-finger touch events.');

function callback() {
  testUserGesture.step(function () {
    assert_equals(receivedEvents.join(', '), "touchstart@target1(false), touchstart@target2(false), touchmove@target1(false), touchmove@target2(false), touchend@target1(true), touchend@target2(true)");
  });
  testUserGesture.done();
}

if (window.chrome && chrome.gpuBenchmarking && window.testRunner) {
  var pointerActions =
    [
    {source: "touch",
      actions: [
      { name: "pointerDown", x: targetX1, y: targetY1 },
      { name: "pointerMove", x: targetX1+30, y: targetY1 },
      { name: "pointerUp" }]},
    {source: "touch",
      actions: [
      { name: "pointerDown", x: targetX2, y: targetY2 },
      { name: "pointerMove", x: targetX2+30, y: targetY2 },
      { name: "pointerUp" }]}
    ];
  chrome.gpuBenchmarking.pointerActionSequence(pointerActions, callback);
}

</script>