Browse Source

Re-allow clipboard copy on non-https sites (#17118)

* Re-allow clipboard copy on non-https sites
* fallback clipboard functions
tags/v1.16.0-rc1
Netduma Luke M 2 years ago
parent
commit
9f3d5c0a23
No account linked to committer's email address
1 changed files with 32 additions and 1 deletions
  1. 32
    1
      web_src/js/features/clipboard.js

+ 32
- 1
web_src/js/features/clipboard.js View File

@@ -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;
@@ -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;
}

Loading…
Cancel
Save