Skip to content

Commit

Permalink
Re-allow clipboard copy on non-https sites (#17118)
Browse files Browse the repository at this point in the history
* Re-allow clipboard copy on non-https sites
* fallback clipboard functions
  • Loading branch information
tech-meppem authored Oct 19, 2021
1 parent eaf493b commit 9f3d5c0
Showing 1 changed file with 32 additions and 1 deletion.
33 changes: 32 additions & 1 deletion web_src/js/features/clipboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,33 @@ function onError(btn) {
btn.dataset.content = btn.dataset.original;
}

/**
* Fallback to use if navigator.clipboard doesn't exist.
* Achieved via creating a temporary textarea element, selecting the text, and using document.execCommand.
*/
function fallbackCopyToClipboard(text) {
if (!document.execCommand) return false;

const tempTextArea = document.createElement('textarea');
tempTextArea.value = text;

// avoid scrolling
tempTextArea.style.top = 0;
tempTextArea.style.left = 0;
tempTextArea.style.position = 'fixed';

document.body.appendChild(tempTextArea);

tempTextArea.select();

// if unsecure (not https), there is no navigator.clipboard, but we can still use document.execCommand to copy to clipboard
const success = document.execCommand('copy');

document.body.removeChild(tempTextArea);

return success;
}

export default function initGlobalCopyToClipboardListener() {
document.addEventListener('click', async (e) => {
let target = e.target;
Expand All @@ -33,7 +60,11 @@ export default function initGlobalCopyToClipboardListener() {
await navigator.clipboard.writeText(text);
onSuccess(target);
} catch {
onError(target);
if (fallbackCopyToClipboard(text)) {
onSuccess(target);
} else {
onError(target);
}
}
break;
}
Expand Down

0 comments on commit 9f3d5c0

Please sign in to comment.