summaryrefslogtreecommitdiff
path: root/client/simple/src/js/main/keyboard.ts
diff options
context:
space:
mode:
authorIvan Gabaldon <igabaldon@inetol.net>2025-10-24 11:28:07 +0200
committerMarkus Heiser <markus.heiser@darmarIT.de>2025-10-24 12:32:43 +0200
commit8dacbbbb157359447a07ea4562ab6447dacb5f06 (patch)
tree094ae416687a1e5e6878130fe3c4f7b595c62bbf /client/simple/src/js/main/keyboard.ts
parentb770a46e1f8f339b2bb2a53faba80e9c9a5b1611 (diff)
[fix] client/simple: insecure ctx clipboard copy
Uses the deprecated [`execCommand()`](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand) to copy content to clipboard if accessing the instance through HTTP, this method isn't going away soon. Closes https://github.com/searxng/searxng/issues/5359
Diffstat (limited to 'client/simple/src/js/main/keyboard.ts')
-rw-r--r--client/simple/src/js/main/keyboard.ts27
1 files changed, 23 insertions, 4 deletions
diff --git a/client/simple/src/js/main/keyboard.ts b/client/simple/src/js/main/keyboard.ts
index b5e5d4edc..f165a601a 100644
--- a/client/simple/src/js/main/keyboard.ts
+++ b/client/simple/src/js/main/keyboard.ts
@@ -407,12 +407,31 @@ const toggleHelp = (keyBindings: typeof baseKeyBinding): void => {
};
const copyURLToClipboard = async (): Promise<void> => {
- const currentUrlElement = document.querySelector<HTMLAnchorElement>(".result[data-vim-selected] h3 a");
- assertElement(currentUrlElement);
+ const selectedResult = document.querySelector<HTMLElement>(".result[data-vim-selected]");
+ if (!selectedResult) return;
- const url = currentUrlElement.getAttribute("href");
+ const resultAnchor = selectedResult.querySelector<HTMLAnchorElement>("a");
+ assertElement(resultAnchor);
+
+ const url = resultAnchor.getAttribute("href");
if (url) {
- await navigator.clipboard.writeText(url);
+ if (window.isSecureContext) {
+ await navigator.clipboard.writeText(url);
+ } else {
+ const selection = window.getSelection();
+ if (selection) {
+ const node = document.createElement("span");
+ node.textContent = url;
+ resultAnchor.appendChild(node);
+
+ const range = document.createRange();
+ range.selectNodeContents(node);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ document.execCommand("copy");
+ node.remove();
+ }
+ }
}
};