|
96 | 96 | function escapeRegExp(s) { |
97 | 97 | return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string |
98 | 98 | } |
| 99 | +const clipboard = { |
| 100 | + copy(text) { |
| 101 | + const fakeElem = document.body.appendChild(document.createElement('textarea')); |
| 102 | + fakeElem.style.position = 'absolute'; |
| 103 | + fakeElem.style.left = '-9999px'; |
| 104 | + fakeElem.setAttribute('readonly', ''); |
| 105 | + fakeElem.value = text; |
| 106 | + fakeElem.select(); |
| 107 | + try { |
| 108 | + return document.execCommand('copy'); |
| 109 | + } catch (err) { |
| 110 | + return false; |
| 111 | + } finally { |
| 112 | + fakeElem.parentNode.removeChild(fakeElem); |
| 113 | + } |
| 114 | + }, |
| 115 | + paste() { |
| 116 | + const fakeElem = document.body.appendChild(document.createElement('textarea')); |
| 117 | + fakeElem.style.position = 'absolute'; |
| 118 | + fakeElem.style.left = '-9999px'; |
| 119 | + fakeElem.setAttribute('readonly', ''); |
| 120 | + fakeElem.select(); |
| 121 | + fakeElem.parentNode.removeChild(fakeElem); |
| 122 | + |
| 123 | + return navigator.clipboard.readText() |
| 124 | + .catch(err => { |
| 125 | + console.warn(err); |
| 126 | + |
| 127 | + return navigator.permissions.query({ |
| 128 | + name: 'clipboard-read', |
| 129 | + }) |
| 130 | + .then(async permissionStatus => { |
| 131 | + // Will be 'granted', 'denied' or 'prompt': |
| 132 | + console.log('permission 1', permissionStatus.state); |
| 133 | + |
| 134 | + if (permissionStatus.state !== 'granted') { |
| 135 | + // Listen for changes to the permission state |
| 136 | + await new Promise((accept, reject) => { |
| 137 | + permissionStatus.onchange = () => { |
| 138 | + console.log('permission 2', permissionStatus.state); |
| 139 | + if (permissionStatus.state === 'granted') { |
| 140 | + permissionStatus.onchange = null; |
| 141 | + accept(); |
| 142 | + } |
| 143 | + }; |
| 144 | + }); |
| 145 | + } |
| 146 | + }) |
| 147 | + .then(() => navigator.clipboard.readText()); |
| 148 | + }); |
| 149 | + }, |
| 150 | +}; |
99 | 151 |
|
100 | 152 | const _makeNullPromise = () => { |
101 | 153 | let resolve, reject; |
|
0 commit comments