Skip to content

Commit 565f780

Browse files
authored
fix: call a DX event after using an HTML draggable element (T1260277) (#28541)
1 parent 32f9557 commit 565f780

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { ClientFunction, Selector } from 'testcafe';
2+
import url from '../../helpers/getPageUrl';
3+
4+
fixture.disablePageReloads`Events`
5+
.page(url(__dirname, '../container.html'));
6+
7+
const init = ClientFunction(() => {
8+
const markup = `<div class="dx-viewport demo-container">
9+
<div id="draggable" draggable="true" style="width: 200px; height: 200px; background-color: red;"></div>
10+
<div id="target" style="width: 200px; height: 200px; background-color: black;"></div>
11+
<div>hoverStartTriggerCount</div>
12+
<div id="hoverStartTriggerCount">0</div>
13+
<div>hoverEndTriggerCount</div>
14+
<div id="hoverEndTriggerCount">0</div>
15+
</div>`;
16+
17+
$('#container').html(markup);
18+
19+
const { DevExpress } = (window as any);
20+
21+
let hoverStartTriggerCount = 0;
22+
let hoverEndTriggerCount = 0;
23+
24+
DevExpress.events.on($('#target'), 'dxhoverstart', () => {
25+
hoverStartTriggerCount += 1;
26+
27+
$('#hoverStartTriggerCount').text(hoverStartTriggerCount);
28+
});
29+
30+
DevExpress.events.on($('#target'), 'dxhoverend', () => {
31+
hoverEndTriggerCount += 1;
32+
33+
$('#hoverEndTriggerCount').text(hoverEndTriggerCount);
34+
});
35+
});
36+
37+
test('The `dxhoverstart` event should be triggered after dragging and dropping an HTML draggable element (T1260277)', async (t) => {
38+
const draggable = Selector('#draggable');
39+
const target = Selector('#target');
40+
const hoverStartTriggerCount = Selector('#hoverStartTriggerCount');
41+
const hoverEndTriggerCount = Selector('#hoverEndTriggerCount');
42+
43+
await t
44+
.drag(draggable, 0, 400, { speed: 1 });
45+
46+
// `.drag` does not trigger the `pointercancel` event.
47+
// A sequence of `.drag` calls behaves like a single drag&drop operation,
48+
// and each call does not trigger the `pointerup` event.
49+
// Even if it did, the `pointercancel` event would not be triggered as specified in:
50+
// https://www.w3.org/TR/pointerevents/#suppressing-a-pointer-event-stream
51+
// This is a hack to test the event engine's logic.
52+
await t.dispatchEvent(draggable, 'pointercancel');
53+
54+
await t
55+
.drag(target, 0, 400, { speed: 1 });
56+
57+
await t.expect(hoverStartTriggerCount.textContent).eql('1');
58+
await t.expect(hoverEndTriggerCount.textContent).eql('1');
59+
}).before(async () => {
60+
await init();
61+
});

packages/devextreme/js/__internal/events/pointer/m_mouse.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
import BaseStrategy from '@js/common/core/events/pointer/base';
22
import Observer from '@js/common/core/events/pointer/observer';
3+
import browser from '@js/core/utils/browser';
34
import { extend } from '@js/core/utils/extend';
45

56
/* eslint-disable spellcheck/spell-checker */
67
const eventMap = {
78
dxpointerdown: 'mousedown',
89
dxpointermove: 'mousemove',
910
dxpointerup: 'mouseup',
10-
dxpointercancel: '',
11+
dxpointercancel: 'pointercancel',
1112
dxpointerover: 'mouseover',
1213
dxpointerout: 'mouseout',
1314
dxpointerenter: 'mouseenter',
1415
dxpointerleave: 'mouseleave',
1516
};
1617

18+
// due to this https://bugs.webkit.org/show_bug.cgi?id=222632 issue
19+
if (browser.safari) {
20+
eventMap.dxpointercancel = 'dragstart';
21+
}
22+
1723
const normalizeMouseEvent = function (e) {
1824
e.pointerId = 1;
1925

0 commit comments

Comments
 (0)