|
| 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 | +}); |
0 commit comments