| <!DOCTYPE HTML> | 
 | <html> | 
 | <head> | 
 | <title>TouchEvent Retargeting Tests</title> | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 | </head> | 
 | <body> | 
 | <div id="host0"></div> | 
 | <div id="host1"></div> | 
 | <script> | 
 | var host0 = document.getElementById('host0'); | 
 | var root0 = host0.attachShadow({ mode: 'open' }); | 
 | var target0 = document.createElement('div'); | 
 | root0.appendChild(target0); | 
 |  | 
 | var host1 = document.getElementById('host1'); | 
 | var root1 = host1.attachShadow({ mode: 'open' }); | 
 | var target1 = document.createElement('div'); | 
 | root1.appendChild(target1); | 
 |  | 
 | async_test(function(t) { | 
 |  var touch0 = new Touch({ | 
 |  identifier: 0, | 
 |  target: target0, | 
 |  }); | 
 |  var touch1 = new Touch({ | 
 |  identifier: 1, | 
 |  target: target1, | 
 |  }); | 
 |  | 
 |  var touchEvent = new TouchEvent("touchstart", { | 
 |  touches: [touch0, touch1], | 
 |  targetTouches: [touch1], | 
 |  changedTouches: [touch1], | 
 |  }); | 
 |  | 
 |  target0.addEventListener('touchstart', t.step_func_done(function(e) { | 
 |  assert_equals(e.touches.length, 2); | 
 |  assert_equals(e.touches[0].target, target0); | 
 |  assert_equals(e.touches[1].target, host1); | 
 |  | 
 |  assert_equals(e.targetTouches.length, 1); | 
 |  assert_equals(e.targetTouches[0].target, host1); | 
 |  | 
 |  assert_equals(e.changedTouches.length, 1); | 
 |  assert_equals(e.changedTouches[0].target, host1); | 
 |  })); | 
 |  | 
 |  target0.dispatchEvent(touchEvent, { composed: true }); | 
 | }, "TouchEvent's touches, targetTouches, and changedTouches should be retargeted."); | 
 | </script> | 
 | </body> | 
 | </html> |