diff --git a/files/ubuntu-root/usr/local/bin/patch-selkies-safari-keyboard.py b/files/ubuntu-root/usr/local/bin/patch-selkies-safari-keyboard.py index 6cb20f45..8b4ed71a 100644 --- a/files/ubuntu-root/usr/local/bin/patch-selkies-safari-keyboard.py +++ b/files/ubuntu-root/usr/local/bin/patch-selkies-safari-keyboard.py @@ -97,10 +97,65 @@ SCRIPT_V2 = f""" if (!isSafari) return; // Safari blocks clipboard read on focus without a user gesture. + // Keep clipboard enabled so user-initiated copy/paste still works. if (typeof window.clipboard_enabled !== "undefined") {{ - window.clipboard_enabled = false; + window.clipboard_enabled = true; }} + if (navigator.clipboard) {{ + if (typeof navigator.clipboard.readText === "function") {{ + var origReadText = navigator.clipboard.readText.bind(navigator.clipboard); + navigator.clipboard.readText = function () {{ + return origReadText().catch(function (err) {{ + if (err && err.name === "NotAllowedError") {{ + return ""; + }} + throw err; + }}); + }}; + }} + if (typeof navigator.clipboard.read === "function") {{ + var origRead = navigator.clipboard.read.bind(navigator.clipboard); + navigator.clipboard.read = function () {{ + return origRead().catch(function (err) {{ + if (err && err.name === "NotAllowedError") {{ + return []; + }} + throw err; + }}); + }}; + }} + }} + + function sendClipboardText(text) {{ + if (!text) return; + window.postMessage( + {{ type: "clipboardUpdateFromUI", text: text }}, + window.location.origin + ); + }} + + document.addEventListener("paste", function (e) {{ + if (!e || !e.clipboardData) return; + var text = e.clipboardData.getData("text/plain"); + if (text) {{ + sendClipboardText(text); + e.preventDefault(); + }} + }}, true); + + document.addEventListener("keydown", function (e) {{ + if (!e) return; + var isPasteKey = (e.metaKey || e.ctrlKey) && (e.key === "v" || e.key === "V"); + if (!isPasteKey) return; + if (navigator.clipboard && typeof navigator.clipboard.readText === "function") {{ + navigator.clipboard.readText().then(function (text) {{ + sendClipboardText(text); + }}).catch(function () {{ + }}); + }} + }}, true); + function focusAssist() {{ var input = document.getElementById("keyboard-input-assist"); if (!input || typeof input.focus !== "function") return; @@ -299,6 +354,122 @@ SCRIPT_V3 = f""" """.strip() +MARKER_V4 = "selkies-safari-clipboard-toolbar" +SCRIPT_V4 = f""" + +""".strip() + JS_MARKER = f"// {MARKER} (selkies-core)" JS_SNIPPET = f""" {JS_MARKER} @@ -349,6 +520,8 @@ def patch_html(path: Path) -> bool: scripts.append(SCRIPT_V2) if MARKER_V3 not in text: scripts.append(SCRIPT_V3) + if MARKER_V4 not in text: + scripts.append(SCRIPT_V4) if not scripts: return False