@@ -1025,42 +1025,51 @@ public function keyUp(string $xpath, $char, ?string $modifier = null)
10251025
10261026 public function dragTo (string $ sourceXpath , string $ destinationXpath )
10271027 {
1028- $ source = $ this ->findElement ($ sourceXpath );
1029- $ destination = $ this ->findElement ($ destinationXpath );
1030-
1031- $ this ->getWebDriverSession ()->moveto (array (
1032- 'element ' => $ source ->getID ()
1033- ));
1034-
1035- $ script = <<<JS
1036- (function (sourceElement) {
1037- window['__minkDragAndDropSourceElement'] = sourceElement;
1038-
1039- sourceElement.dispatchEvent(new DragEvent('dragstart', {bubbles: true, cancelable: true}));
1040- }({{ELEMENT}}));
1041- JS ;
1042- $ this ->executeJsOnElement ($ source , $ script );
1043-
1044- if ($ destination ->getID () === $ source ->getID ()) {
1045- $ this ->getWebDriverSession ()->click (0 );
1046- } else {
1047- $ this ->getWebDriverSession ()->buttondown ();
1048- $ this ->getWebDriverSession ()->moveto (array (
1049- 'element ' => $ destination ->getID ()
1050- ));
1051- $ this ->getWebDriverSession ()->buttonup ();
1052- }
1053-
1054- $ script = <<<JS
1055- (function (targetElement) {
1056- targetElement.dispatchEvent(new DragEvent('dragover', {bubbles: true, cancelable: true}));
1057-
1058- targetElement.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
1028+ $ source = $ this ->findElement ($ sourceXpath );
1029+ $ target = $ this ->findElement ($ destinationXpath );
1030+
1031+ $ this ->getWebDriverSession ()->moveto (['element ' => $ source ->getID ()]);
1032+
1033+ $ this ->executeJsOnElement ($ source , <<<'JS'
1034+ (function (sourceElement) {
1035+ var withPointerEvents = 'PointerEvent' in window;
1036+ window['__minkDragAndDropSourceElement'] = sourceElement;
1037+
1038+ withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointerdown', {bubbles: true, cancelable: true}));
1039+ sourceElement.dispatchEvent(new MouseEvent('mousedown', {bubbles: true, cancelable: true}));
1040+ sourceElement.dispatchEvent(new DragEvent('dragstart', {bubbles: true, cancelable: true}));
1041+ withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointercancel', {bubbles: true, cancelable: true}));
1042+ withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointerout', {bubbles: true, cancelable: true}));
1043+ withPointerEvents && sourceElement.dispatchEvent(new PointerEvent('pointerleave', {bubbles: true, cancelable: true}));
1044+ }({{ELEMENT}}));
1045+ JS
1046+ );
10591047
1060- window['__minkDragAndDropSourceElement'].dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
1061- }({{ELEMENT}}));
1062- JS ;
1063- $ this ->executeJsOnElement ($ destination , $ script );
1048+ $ this ->getWebDriverSession ()->moveto (['element ' => $ target ->getID ()]);
1049+
1050+ $ this ->executeJsOnElement ($ target , <<<'JS'
1051+ (function (targetElement) {
1052+ var withPointerEvents = 'PointerEvent' in window;
1053+ var sourceElement = window['__minkDragAndDropSourceElement'];
1054+
1055+ withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerover', {bubbles: true, cancelable: true}));
1056+ withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerenter', {bubbles: true, cancelable: true}));
1057+ sourceElement.dispatchEvent(new MouseEvent('mouseout', {bubbles: true, cancelable: true}));
1058+ sourceElement.dispatchEvent(new MouseEvent('mouseleave', {bubbles: true, cancelable: true}));
1059+ targetElement.dispatchEvent(new MouseEvent('mouseover', {bubbles: true, cancelable: true}));
1060+ targetElement.dispatchEvent(new MouseEvent('mouseenter', {bubbles: true, cancelable: true}));
1061+ targetElement.dispatchEvent(new MouseEvent('mousemove', {bubbles: true, cancelable: true}));
1062+ withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerout', {bubbles: true, cancelable: true}));
1063+ withPointerEvents && targetElement.dispatchEvent(new PointerEvent('pointerleave', {bubbles: true, cancelable: true}));
1064+ targetElement.dispatchEvent(new MouseEvent('mouseout', {bubbles: true, cancelable: true}));
1065+ targetElement.dispatchEvent(new MouseEvent('mouseleave', {bubbles: true, cancelable: true}));
1066+ sourceElement.dispatchEvent(new DragEvent('drag', {bubbles: true, cancelable: true}));
1067+ targetElement.dispatchEvent(new DragEvent('dragover', {bubbles: true, cancelable: true}));
1068+ targetElement.dispatchEvent(new DragEvent('drop', {bubbles: true, cancelable: true}));
1069+ sourceElement.dispatchEvent(new DragEvent('dragend', {bubbles: true, cancelable: true}));
1070+ }({{ELEMENT}}));
1071+ JS
1072+ );
10641073 }
10651074
10661075 public function executeScript (string $ script )
0 commit comments