| Index: third_party/WebKit/LayoutTests/fast/dnd/resources/event-mouse-coordinates.js
|
| diff --git a/third_party/WebKit/LayoutTests/fast/dnd/resources/event-mouse-coordinates.js b/third_party/WebKit/LayoutTests/fast/dnd/resources/event-mouse-coordinates.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5dab8c71eecdfec79631ac8faf4b4437a3bc422e
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/fast/dnd/resources/event-mouse-coordinates.js
|
| @@ -0,0 +1,107 @@
|
| +// The mouse bot will always be precise. Humans can click anywhere in the boxes.
|
| +const epsilon = (window.eventSender) ? 0 : 50;
|
| +
|
| +const elementCenter = (element) => {
|
| + const clientRect = element.getBoundingClientRect();
|
| + const centerX = (clientRect.left + clientRect.right) / 2;
|
| + const centerY = (clientRect.top + clientRect.bottom) / 2;
|
| + return { x: centerX, y: centerY };
|
| +};
|
| +
|
| +const mouseMoveToCenter = (element, frameOffset) => {
|
| + const center = elementCenter(element);
|
| + eventSender.mouseMoveTo(center.x + frameOffset.x, center.y + frameOffset.y);
|
| +};
|
| +
|
| +const mouseEventCoordinates = (event) => {
|
| + return {
|
| + client: { x: event.clientX, y: event.clientY },
|
| + offset: { x: event.offsetX, y: event.offsetY },
|
| + page: { x: event.pageX, y: event.pageY },
|
| + screen: { x: event.screenX, y: event.screenY },
|
| + };
|
| +};
|
| +
|
| +// Recursively loads content into a series of nested iframes.
|
| +// Returns a promise that resolves with the HTMLDocument of the innermost frame.
|
| +const loadNestedFrames = (domRoot) => {
|
| + const frame = domRoot.querySelector('iframe');
|
| + if (!frame)
|
| + return Promise.resolve(domRoot);
|
| +
|
| + return new Promise((resolve, reject) => {
|
| + const htmlSourceId = frame.getAttribute('data-source');
|
| + const html = document.getElementById(htmlSourceId).textContent;
|
| + frame.onload = () => {
|
| + const frameDocument = frame.contentDocument;
|
| + resolve(loadNestedFrames(frameDocument));
|
| + };
|
| + frame.setAttribute('srcdoc', html);
|
| + });
|
| +};
|
| +
|
| +const runDragTest = (t, params) => {
|
| + const domRoot = params.domRoot;
|
| +
|
| + const dragged = domRoot.querySelector('.dragged');
|
| + let dragStartCoordinates = null;
|
| + dragged.ondragstart = (event) => {
|
| + dragStartCoordinates = mouseEventCoordinates(event);
|
| + event.dataTransfer.setData('text/plain', 'Needed to work in Firefox');
|
| + };
|
| +
|
| + const dropZone = domRoot.querySelector('.dropzone');
|
| + dropZone.ondragover = (event) => { event.preventDefault(); }
|
| +
|
| + let dropCoordinates = null;
|
| + dropZone.ondrop = (event) => {
|
| + // Needed to avoid navigation in Firefox.
|
| + event.preventDefault();
|
| + dropCoordinates = mouseEventCoordinates(event);
|
| + }
|
| +
|
| + let dragEndCoordinates = null;
|
| + return new Promise((resolve, reject) => {
|
| + dragged.ondragend = (event) => {
|
| + dragEndCoordinates = mouseEventCoordinates(event);
|
| + resolve(true);
|
| + }
|
| +
|
| + if (window.eventSender) {
|
| + mouseMoveToCenter(dragged, params.frameOffset);
|
| + eventSender.mouseDown();
|
| + setTimeout(() => {
|
| + mouseMoveToCenter(dropZone, params.frameOffset);
|
| + eventSender.mouseUp();
|
| + }, 100);
|
| + }
|
| + }).then(() => t.step(() => {
|
| + assert_approx_equals(dragStartCoordinates.client.x, params.start.client.x,
|
| + epsilon, 'clientX on the dragstart event should be in the drag me box');
|
| + assert_approx_equals(dragStartCoordinates.client.y, params.start.client.y,
|
| + epsilon, 'clientY on the dragstart event should be in the drag me box');
|
| + assert_approx_equals(dragStartCoordinates.page.x, params.start.page.x,
|
| + epsilon, 'pageX on the dragstart event should be in the drag me box');
|
| + assert_approx_equals(dragStartCoordinates.page.y, params.start.page.y,
|
| + epsilon, 'pageY on the dragstart event should be in the drag me box');
|
| +
|
| + assert_approx_equals(dropCoordinates.client.x, params.end.client.x, epsilon,
|
| + 'clientX on the drop event should be in the drop here box');
|
| + assert_approx_equals(dropCoordinates.client.y, params.end.client.y, epsilon,
|
| + 'clientX on the drop event should be in the drop here box');
|
| + assert_approx_equals(dropCoordinates.page.x, params.end.page.x, epsilon,
|
| + 'pageX on the drop event should be in the drop here box');
|
| + assert_approx_equals(dropCoordinates.page.y, params.end.page.y, epsilon,
|
| + 'pageY on the drop event should be in the drop here box');
|
| +
|
| + assert_approx_equals(dragEndCoordinates.client.x, params.end.client.x,
|
| + epsilon, 'clientX on the dragend event should be in the drop here box');
|
| + assert_approx_equals(dragEndCoordinates.client.y, params.end.client.y,
|
| + epsilon, 'clientY on the dragend event should be in the drop here box');
|
| + assert_approx_equals(dragEndCoordinates.page.x, params.end.page.x, epsilon,
|
| + 'pageX on the dragend event should be in the drop here box');
|
| + assert_approx_equals(dragEndCoordinates.page.y, params.end.page.y, epsilon,
|
| + 'pageY on the dragend event should be in the drop here box');
|
| +
|
| + }));
|
| +};
|
|
|