Skip to content

Commit 457c510

Browse files
committed
Improve prevent-clipboard-write scriptlet
1 parent 95eba80 commit 457c510

1 file changed

Lines changed: 18 additions & 20 deletions

File tree

src/js/resources/prevent-clipboard-write.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,23 @@ function preventClipboardWrite(matches = '', ...varargs) {
5454
const extraArgs = safe.parseVarargs(varargs);
5555
const excludePattern = extraArgs.excludeMatches &&
5656
safe.initPattern(extraArgs.excludeMatches);
57+
const htmlTemplate = [
58+
'<div style="background-color:beige;color:black;border:1px solid black;display:flex;font-family:sans-serif;font-size:medium;position:fixed;top:0;white-space:pre-wrap;width:100%;z-index:2147483647">',
59+
'<span style="flex-grow:1;padding:0.5em 0 0.5em 0.5em;">${warning}</span>\n',
60+
'<button style="font-size:32px;padding:0.5em">×</button>',
61+
'</div>',
62+
].join('');
5763
const domAlert = clipboardText => {
5864
const doc = document;
59-
const div = doc.createElement('div');
60-
const span = doc.createElement('span');
61-
span.style = 'flex-grow:1;padding:0.5em 0 0.5em 0.5em;';
6265
const domAlert = extraArgs.domAlert.replace(/\\n/g, '\n');
63-
const placeholder = /\$\{text\}/.exec(domAlert);
64-
if ( placeholder ) {
66+
let html;
67+
if ( domAlert.includes('${text}') ) {
6568
const code = doc.createElement('code');
6669
const styles = [
6770
'background-color: #ddc',
6871
'display: inline-block',
6972
'font-family: monospace',
73+
'font-size: 100%',
7074
'max-height: 8em',
7175
'overflow: auto',
7276
'padding: 0.25em',
@@ -77,29 +81,23 @@ function preventClipboardWrite(matches = '', ...varargs) {
7781
}
7882
code.style = styles.join(';');
7983
code.textContent = clipboardText;
80-
span.append(
81-
domAlert.slice(0, placeholder.index),
82-
code,
83-
domAlert.slice(placeholder.index + placeholder[0].length)
84+
html = htmlTemplate.replace('${warning}',
85+
domAlert.replace('${text}', code.outerHTML)
8486
);
8587
} else {
86-
span.append(domAlert);
88+
html = htmlTemplate.replace('${warning}', domAlert);
8789
}
88-
const button = doc.createElement('button');
89-
button.style = 'font-size:32px;padding:0.5em';
90-
button.textContent = '×';
90+
if ( currentAlert ) { currentAlert.remove(); }
91+
const domParser = new DOMParser();
92+
const fragment = domParser.parseFromString(html, 'text/html');
93+
currentAlert = fragment.querySelector('div');
94+
const button = currentAlert.querySelector('button');
9195
button.addEventListener('click', ( ) => {
9296
if ( currentAlert === null ) { return; }
9397
currentAlert.remove();
9498
currentAlert = null;
9599
});
96-
div.append(span, button);
97-
div.style = 'background-color:beige;color:black;border:1px solid black;display:flex;font-family:sans-serif;font-size:medium;position:fixed;top:0;white-space:pre-wrap;width:100%;z-index:2147483647';
98-
doc.documentElement.append(div);
99-
if ( currentAlert ) {
100-
currentAlert.remove();
101-
}
102-
currentAlert = div;
100+
doc.documentElement.append(currentAlert);
103101
};
104102
let currentAlert = null;
105103
const prevent = text => {

0 commit comments

Comments
 (0)