diff options
-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 } |