// HTML5 Drag and Drop Helper Functions for Cremote
// These functions are injected into web pages to provide reliable drag and drop functionality
(function() {
'use strict';
// Create a namespace to avoid conflicts
window.cremoteDragDrop = window.cremoteDragDrop || {};
/**
* Simulates HTML5 drag and drop between two elements
* @param {string} sourceSelector - CSS selector for source element
* @param {string} targetSelector - CSS selector for target element
* @returns {Promise} - Success status
*/
window.cremoteDragDrop.dragElementToElement = async function(sourceSelector, targetSelector) {
const sourceElement = document.querySelector(sourceSelector);
const targetElement = document.querySelector(targetSelector);
if (!sourceElement) {
throw new Error(`Source element not found: ${sourceSelector}`);
}
if (!targetElement) {
throw new Error(`Target element not found: ${targetSelector}`);
}
// Make source draggable if not already
if (!sourceElement.draggable) {
sourceElement.draggable = true;
}
// Create and dispatch dragstart event
const dragStartEvent = new DragEvent('dragstart', {
bubbles: true,
cancelable: true,
dataTransfer: new DataTransfer()
});
// Set drag data
dragStartEvent.dataTransfer.setData('text/plain', sourceElement.id || sourceSelector);
dragStartEvent.dataTransfer.effectAllowed = 'all';
const dragStartResult = sourceElement.dispatchEvent(dragStartEvent);
if (!dragStartResult) {
console.log('Dragstart was cancelled');
return false;
}
// Small delay to simulate realistic drag timing
await new Promise(resolve => setTimeout(resolve, 50));
// Create and dispatch dragover event on target
const dragOverEvent = new DragEvent('dragover', {
bubbles: true,
cancelable: true,
dataTransfer: dragStartEvent.dataTransfer
});
const dragOverResult = targetElement.dispatchEvent(dragOverEvent);
// Create and dispatch drop event on target
const dropEvent = new DragEvent('drop', {
bubbles: true,
cancelable: true,
dataTransfer: dragStartEvent.dataTransfer
});
const dropResult = targetElement.dispatchEvent(dropEvent);
// Create and dispatch dragend event on source
const dragEndEvent = new DragEvent('dragend', {
bubbles: true,
cancelable: true,
dataTransfer: dragStartEvent.dataTransfer
});
sourceElement.dispatchEvent(dragEndEvent);
return dropResult;
};
/**
* Simulates HTML5 drag and drop from element to coordinates
* @param {string} sourceSelector - CSS selector for source element
* @param {number} x - Target X coordinate
* @param {number} y - Target Y coordinate
* @returns {Promise