UNPKG

clipboard-polyfill

Version:

A polyfill for the asynchronous clipboard API

61 lines (52 loc) 1.76 kB
import { StringItem } from "../ClipboardItem/convert"; import { TEXT_PLAIN } from "../ClipboardItem/data-types"; import { debugLog } from "../debug"; import { copyTextUsingDOM, copyUsingTempElem, copyUsingTempSelection, execCopy, } from "../strategies/dom"; import { seemToBeInIE, writeTextIE } from "../strategies/internet-explorer"; // Note: the fallback order is carefully tuned for compatibility. It might seem // safe to move some of them around, but do not do so without testing all browsers. export async function writeFallback(stringItem: StringItem): Promise<boolean> { const hasTextPlain = TEXT_PLAIN in stringItem; // Internet Explorer if (seemToBeInIE()) { if (!hasTextPlain) { throw new Error("No `text/plain` value was specified."); } if (writeTextIE(stringItem[TEXT_PLAIN])) { return true; } else { throw new Error("Copying failed, possibly because the user rejected it."); } } if (execCopy(stringItem)) { debugLog("regular execCopy worked"); return true; } // Success detection on Edge is not possible, due to bugs in all 4 // detection mechanisms we could try to use. Assume success. if (navigator.userAgent.indexOf("Edge") > -1) { debugLog('UA "Edge" => assuming success'); return true; } // Fallback 1 for desktop Safari. if (copyUsingTempSelection(document.body, stringItem)) { debugLog("copyUsingTempSelection worked"); return true; } // Fallback 2 for desktop Safari. if (copyUsingTempElem(stringItem)) { debugLog("copyUsingTempElem worked"); return true; } // Fallback for iOS Safari. if (copyTextUsingDOM(stringItem[TEXT_PLAIN])) { debugLog("copyTextUsingDOM worked"); return true; } return false; }