All files / roosterjs-content-model-plugins/lib/dragAndDrop/utils handleDroppedContent.ts

100% Statements 17/17
100% Branches 2/2
100% Functions 2/2
100% Lines 17/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 511x 1x                       1x           10x 10x   10x 9x 9x   9x 9x 9x   9x 9x   9x   9x   5x 5x                        
import { cleanForbiddenElements } from './cleanForbiddenElements';
import {
    createDomToModelContext,
    domToContentModel,
    getNodePositionFromEvent,
    mergeModel,
} from 'roosterjs-content-model-dom';
import type { IEditor } from 'roosterjs-content-model-types';
 
/**
 * @internal
 * Handle dropped HTML content by inserting it at the drop position
 */
export function handleDroppedContent(
    editor: IEditor,
    event: DragEvent,
    html: string,
    forbiddenElements: string[]
): void {
    const doc = editor.getDocument();
    const domPosition = getNodePositionFromEvent(doc, editor.getDOMHelper(), event.x, event.y);
 
    if (domPosition) {
        event.preventDefault();
        event.stopPropagation();
 
        const range = doc.createRange();
        range.setStart(domPosition.node, domPosition.offset);
        range.collapse(true);
 
        const parsedHtml = editor.getDOMCreator().htmlToDOM(html);
        cleanForbiddenElements(parsedHtml, forbiddenElements);
 
        const droppedModel = domToContentModel(parsedHtml.body, createDomToModelContext());
 
        editor.formatContentModel(
            (model, context) => {
                mergeModel(model, droppedModel, context);
                return true;
            },
            {
                selectionOverride: {
                    type: 'range',
                    range,
                    isReverted: false,
                },
            }
        );
    }
}