Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(477)

Side by Side Diff: third_party/WebKit/LayoutTests/fast/dnd/resources/event-mouse-coordinates.js

Issue 2471843005: Delegate dragend to the correct frame's EventHandler. (Closed)
Patch Set: Addressed some of the feedback. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698