diff options
author | skjnldsv <skjnldsv@protonmail.com> | 2024-11-08 08:44:28 +0100 |
---|---|---|
committer | skjnldsv <skjnldsv@protonmail.com> | 2024-11-08 08:44:28 +0100 |
commit | 6296b032f9356a0e8dd8a2fd9ac6c9c6b1fa60f4 (patch) | |
tree | e08d2623ac82790d3d1a75a6388c3bf2e60ae705 | |
parent | 5193ca41f92f8fb6ad88e40be3277ae7ea912361 (diff) | |
download | nextcloud-server-feat/clipboard-fallback.tar.gz nextcloud-server-feat/clipboard-fallback.zip |
feat(core): offer clipboard fallback for non-secure environmentsfeat/clipboard-fallback
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
-rw-r--r-- | core/src/init.js | 2 | ||||
-rw-r--r-- | core/src/utils/ClipboardFallback.ts | 35 |
2 files changed, 37 insertions, 0 deletions
diff --git a/core/src/init.js b/core/src/init.js index fab97d2ee2b..9942c2f76f9 100644 --- a/core/src/init.js +++ b/core/src/init.js @@ -14,6 +14,7 @@ import { setUp as setUpContactsMenu } from './components/ContactsMenu.js' import { setUp as setUpMainMenu } from './components/MainMenu.js' import { setUp as setUpUserMenu } from './components/UserMenu.js' import { interceptRequests } from './utils/xhr-request.js' +import { initFallbackClipboardAPI } from './utils/ClipboardFallback' // keep in sync with core/css/variables.scss const breakpointMobileWidth = 1024 @@ -58,6 +59,7 @@ moment.locale(locale) */ export const initCore = () => { interceptRequests() + initFallbackClipboardAPI() $(window).on('unload.main', () => { OC._unloadCalled = true }) $(window).on('beforeunload.main', () => { diff --git a/core/src/utils/ClipboardFallback.ts b/core/src/utils/ClipboardFallback.ts new file mode 100644 index 00000000000..392a0d9776d --- /dev/null +++ b/core/src/utils/ClipboardFallback.ts @@ -0,0 +1,35 @@ +/** + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +function unsecuredCopyToClipboard(text) { + const textArea = document.createElement('textarea') + const textAreaContent = document.createTextNode(text) + textArea.appendChild(textAreaContent) + document.body.appendChild(textArea) + + textArea.focus({ preventScroll: true }) + textArea.select() + + try { + document.execCommand('copy') + } catch (err) { + console.error('[ERROR] core: files Unable to copy to clipboard', err) + } + + document.body.removeChild(textArea) +} + +function initFallbackClipboardAPI() { + if (!window.navigator?.clipboard?.writeText) { + console.info('[INFO] core: Clipboard API not available, using fallback') + Object.defineProperty(window.navigator, 'clipboard', { + value: { + writeText: unsecuredCopyToClipboard, + }, + writable: false, + }) + } +} + +export { initFallbackClipboardAPI } |