diff --git a/ts/routes/editor/rich-text-input/data-transfer.ts b/ts/routes/editor/rich-text-input/data-transfer.ts index 77447e713..eca796d0b 100644 --- a/ts/routes/editor/rich-text-input/data-transfer.ts +++ b/ts/routes/editor/rich-text-input/data-transfer.ts @@ -38,8 +38,7 @@ function imageDataToUint8Array(data: ImageData): Uint8Array { return typeof data === "string" ? new TextEncoder().encode(data) : data; } -// TODO -async function _wantsExtendedPaste(event: MouseEvent | KeyboardEvent): Promise { +async function wantsExtendedPaste(event: MouseEvent | KeyboardEvent): Promise { let stripHtml = (await getConfigBool({ key: ConfigKey_Bool.PASTE_STRIPS_FORMATTING, })).val; @@ -200,7 +199,7 @@ function isURL(s: string): boolean { return prefixes.some(prefix => s.startsWith(prefix)); } -async function processUrls(data: DataTransfer, _extended: boolean): Promise { +async function processUrls(data: DataTransfer, _extended: Promise): Promise { const urls = getUrls(data); if (urls.length === 0) { return null; @@ -216,7 +215,7 @@ async function processUrls(data: DataTransfer, _extended: boolean): Promise { +async function processImages(data: DataTransfer, _extended: Promise): Promise { const image = await getImageData(data); if (!image) { return null; @@ -230,7 +229,7 @@ async function processImages(data: DataTransfer, _extended: boolean): Promise { +async function processText(data: DataTransfer, extended: Promise): Promise { function replaceSpaces(match: string, p1: string): string { return `${p1.replaceAll(" ", " ")} `; } @@ -243,9 +242,9 @@ async function processText(data: DataTransfer, extended: boolean): Promise { +async function processDataTransferEvent( + event: ClipboardEvent | DragEvent, + extended: Promise, +): Promise { + const data = event instanceof ClipboardEvent ? event.clipboardData! : event.dataTransfer!; const html = data.getData("text/html"); if (html) { return html; } const urls = getUrls(data); - let handlers: ((data: DataTransfer, extended: boolean) => Promise)[]; + let handlers: ((data: DataTransfer, extended: Promise) => Promise)[]; if (urls.length > 0 && urls[0].startsWith("file://")) { handlers = [processUrls, processImages, processText]; } else { @@ -319,8 +322,7 @@ async function runPreFilter(html: string, internal = false): Promise { export async function handlePaste(event: ClipboardEvent) { // bridgeCommand("paste"); event.preventDefault(); - const data = event.clipboardData!; - let html = await processClipboardData(data, true); + let html = await processDataTransferEvent(event, Promise.resolve(true)); if (html) { html = await runPreFilter(html); pasteHTML(html, false, false); @@ -329,8 +331,8 @@ export async function handlePaste(event: ClipboardEvent) { export async function handleDrop(event: DragEvent) { event.preventDefault(); - const data = event.dataTransfer!; - let html = await processClipboardData(data, true); + // `extended` is passed as a promise because the event's data is apparently cleared if we wait here before calling getData() + let html = await processDataTransferEvent(event, wantsExtendedPaste(event)); if (html) { html = await runPreFilter(html); pasteHTML(html, false, false);