| OLD | NEW |
| (Empty) | |
| 1 // The mouse bot will always be precise. Humans can click anywhere in the boxes. |
| 2 const epsilon = (window.eventSender) ? 0 : 50; |
| 3 |
| 4 const elementCenter = (element) => { |
| 5 const clientRect = element.getBoundingClientRect(); |
| 6 const centerX = (clientRect.left + clientRect.right) / 2; |
| 7 const centerY = (clientRect.top + clientRect.bottom) / 2; |
| 8 return { x: centerX, y: centerY }; |
| 9 }; |
| 10 |
| 11 const mouseMoveToCenter = (element, frameOffset) => { |
| 12 const center = elementCenter(element); |
| 13 eventSender.mouseMoveTo(center.x + frameOffset.x, center.y + frameOffset.y); |
| 14 }; |
| 15 |
| 16 const mouseEventCoordinates = (event) => { |
| 17 return { |
| 18 client: { x: event.clientX, y: event.clientY }, |
| 19 offset: { x: event.offsetX, y: event.offsetY }, |
| 20 page: { x: event.pageX, y: event.pageY }, |
| 21 screen: { x: event.screenX, y: event.screenY }, |
| 22 }; |
| 23 }; |
| 24 |
| 25 // Recursively loads content into a series of nested iframes. |
| 26 // Returns a promise that resolves with the HTMLDocument of the innermost frame. |
| 27 const loadNestedFrames = (domRoot) => { |
| 28 const frame = domRoot.querySelector('iframe'); |
| 29 if (!frame) |
| 30 return Promise.resolve(domRoot); |
| 31 |
| 32 return new Promise((resolve, reject) => { |
| 33 const htmlSourceId = frame.getAttribute('data-source'); |
| 34 const html = document.getElementById(htmlSourceId).textContent; |
| 35 frame.onload = () => { |
| 36 const frameDocument = frame.contentDocument; |
| 37 resolve(loadNestedFrames(frameDocument)); |
| 38 }; |
| 39 frame.setAttribute('srcdoc', html); |
| 40 }); |
| 41 }; |
| 42 |
| 43 const runDragTest = (t, params) => { |
| 44 const domRoot = params.domRoot; |
| 45 |
| 46 const dragged = domRoot.querySelector('.dragged'); |
| 47 let dragStartCoordinates = null; |
| 48 dragged.ondragstart = (event) => { |
| 49 dragStartCoordinates = mouseEventCoordinates(event); |
| 50 event.dataTransfer.setData('text/plain', 'Needed to work in Firefox'); |
| 51 }; |
| 52 |
| 53 const dropZone = domRoot.querySelector('.dropzone'); |
| 54 dropZone.ondragover = (event) => { event.preventDefault(); } |
| 55 |
| 56 let dropCoordinates = null; |
| 57 dropZone.ondrop = (event) => { |
| 58 // Needed to avoid navigation in Firefox. |
| 59 event.preventDefault(); |
| 60 dropCoordinates = mouseEventCoordinates(event); |
| 61 } |
| 62 |
| 63 let dragEndCoordinates = null; |
| 64 return new Promise((resolve, reject) => { |
| 65 dragged.ondragend = (event) => { |
| 66 dragEndCoordinates = mouseEventCoordinates(event); |
| 67 resolve(true); |
| 68 } |
| 69 |
| 70 if (window.eventSender) { |
| 71 mouseMoveToCenter(dragged, params.frameOffset); |
| 72 eventSender.mouseDown(); |
| 73 setTimeout(() => { |
| 74 mouseMoveToCenter(dropZone, params.frameOffset); |
| 75 eventSender.mouseUp(); |
| 76 }, 100); |
| 77 } |
| 78 }).then(() => t.step(() => { |
| 79 assert_approx_equals(dragStartCoordinates.client.x, params.start.client.x, |
| 80 epsilon, 'clientX on the dragstart event should be in the drag me box'); |
| 81 assert_approx_equals(dragStartCoordinates.client.y, params.start.client.y, |
| 82 epsilon, 'clientY on the dragstart event should be in the drag me box'); |
| 83 assert_approx_equals(dragStartCoordinates.page.x, params.start.page.x, |
| 84 epsilon, 'pageX on the dragstart event should be in the drag me box'); |
| 85 assert_approx_equals(dragStartCoordinates.page.y, params.start.page.y, |
| 86 epsilon, 'pageY on the dragstart event should be in the drag me box'); |
| 87 |
| 88 assert_approx_equals(dropCoordinates.client.x, params.end.client.x, epsilon, |
| 89 'clientX on the drop event should be in the drop here box'); |
| 90 assert_approx_equals(dropCoordinates.client.y, params.end.client.y, epsilon, |
| 91 'clientX on the drop event should be in the drop here box'); |
| 92 assert_approx_equals(dropCoordinates.page.x, params.end.page.x, epsilon, |
| 93 'pageX on the drop event should be in the drop here box'); |
| 94 assert_approx_equals(dropCoordinates.page.y, params.end.page.y, epsilon, |
| 95 'pageY on the drop event should be in the drop here box'); |
| 96 |
| 97 assert_approx_equals(dragEndCoordinates.client.x, params.end.client.x, |
| 98 epsilon, 'clientX on the dragend event should be in the drop here box'); |
| 99 assert_approx_equals(dragEndCoordinates.client.y, params.end.client.y, |
| 100 epsilon, 'clientY on the dragend event should be in the drop here box'); |
| 101 assert_approx_equals(dragEndCoordinates.page.x, params.end.page.x, epsilon, |
| 102 'pageX on the dragend event should be in the drop here box'); |
| 103 assert_approx_equals(dragEndCoordinates.page.y, params.end.page.y, epsilon, |
| 104 'pageY on the dragend event should be in the drop here box'); |
| 105 |
| 106 })); |
| 107 }; |
| OLD | NEW |