Clipboard copy in code-server on iPad is unreliable with dragged/keyboard selections
- Langage dominant
- TypeScript
- Étoiles
- 79.3k
- Forks
- 6.8k
- Merge moyen
- 2 j 6 h
- PR mergées (30 j)
- 41
Description
### Is there an existing issue for this?
- [x] I have searched the existing issues
### OS/Web Information
- **iPadOS:** 26.0.1
- **code-server:** 4.105.1 (`811ec6c1d60add2eb92446161ca812828fdbaa7f`)
- **VS Code (web):** 1.105.1
- **Browsers on iPad:** Safari, Safari PWA (Add to Home Screen), Brave, Chrome
- **Access:** Tailscale with HTTPS (valid certs; no warnings)
- **Host:** code-server running in WSL2 on Windows 11 (Ubuntu)
### Steps to Reproduce
1. Open code-server in Safari
2. Open a file (I used `.py`)
3. Select code by dragging with mouse/trackpad from end to beginning
4. Press **⌘C** to copy.
5. Press the position you want to paste
6. Press **⌘V** to paste.
> **Note on selection direction:** If I select **from the beginning to the end** of the text, copy tends to work **more often**, but I then hit separate **encoding issues** (details below). If I select **from the end to the beginning** (which is common in real use), copy fails much more frequently. Details and diagnostics are in later sections.
### Expected
Copy should reliably place the selected text into the iPad system clipboard, regardless of how the selection was created. Pasting should paste the just selected text.
### Actual
The pasted text is often **not** the selection; it pastes whatever was previously on the clipboard.
Because this is **intermittent**, try the above a few times if it works once; failures are common but not 100%.
### Logs
```shell
When selecting text (end to beginning), pressing **⌘C** (fails), and pasting (pasted previously copied text, not the new text):
[18:36:01] File action: writeFile /mnt/c/Users///temp.py
[18:36:01] [File Watcher (node.js)] [raw] ["change"] temp.py
[18:36:01] [File Watcher (node.js)] [CHANGED] /mnt/c/Users///temp.py
[18:36:01] [File Watcher (node.js)] >> ignored (not included) /mnt/c/Users///temp.py
[18:36:01] [File Watcher (node.js)] [raw] ["change"] temp.py
[18:36:01] [File Watcher (node.js)] [CHANGED] /mnt/c/Users///temp.py
[18:36:01] [File Watcher (node.js)] >> ignored (not included) /mnt/c/Users///temp.py
[18:36:01] [File Watcher ('parcel')] [CHANGED] /mnt/c/Users///temp.py
[18:36:01] File action: writeFile /home//.local/share/code-server/User/History/-5a5bb3a7/entries.json
[18:36:01] [File Watcher ('parcel')] [CHANGED] /mnt/c/Users///temp.py
[18:36:01] [File Watcher ('parcel')] >> normalized [CHANGED] /mnt/c/Users///temp.py
```
### Screenshot/Video
https://github.com/user-attachments/assets/defdc0fb-6442-484e-a772-f1914b6b16e7
### Does this bug reproduce in native VS Code?
This cannot be tested in native VS Code
### Does this bug reproduce in GitHub Codespaces?
I did not test GitHub Codespaces
### Are you accessing code-server over a secure context?
- [x] I am using a secure context.
### Notes
## Additional observations
### A) Selection direction vs. encoding artifacts
- Selecting **begin → end** tends to copy **more reliably** (always so far), **but** small selections that include certain punctuation (quotes, commas, colons) can paste as **URL‑encoded text**.
- **Code line:** `print("Torch version:", torch.__version__)`
- **Example selected:** `n:", to`
- **Pasted:** `n:%22,%20to`
- When selecting **larger spans** or **multiple lines**, the URL‑encoding doesn’t appear.
- When pasting **multiple lines** that were copied during these “encoded” cases, they paste as **one line** instead of preserving line breaks.
### B) Selection method that always works (diagnostic)
- If I select by **double-click** (word) or **triple-click** (entire line) and then copy, **copy/paste always works** and I do **not** see the encoding issue.
- This is useful as a control, but it’s not how users typically select arbitrary ranges in day-to-day editing.
---
## What I’ve tried
### Copy mechanisms
- **⌘C / ⌘V** (default) → unreliable with drag/Shift+Arrow selections.
- **right‑click → Copy** → same behavior.
### Keybindings
- Custom binding of `editor.action.clipboardCopyAction` to **Ctrl+Shift+C** → still unreliable with drag selections.
- Default **⌘C** left in place to match typical usage; same results.
### Browsers
- **Safari**, **Safari PWA**, **Brave**, **Chrome** on iPad → identical behavior (expected; all are WebKit).
### Selection variants
- **End → begin** selection → fails more frequently.
- **Begin → end** selection → succeeds always (in the short time I've tried it), but introduces **URL‑encoded paste** for short spans containing punctuation.
- **Double/triple‑click** selection → **always succeeds**, no encoding issue.
- **Multiple lines / larger blocks** → encoding issue not observed.
---
## Impact
Frequent copy failures and occasional encoding artifacts make normal editing (moving code, refactoring snippets, copying short substrings) unreliable on iPad. The **Begin → end** selection is a usable workaround for now, and for the encoding issue I can select more text and delete the extra parts, but it does impact my productivity.
On a side note, this is my first issue on a public repository, so feedback on what I could do differently in the future is always welcome :)
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
Commencez par reproduire les étapes de sélection par glisser, de copie et de collage dans code-server sur iPadOS avec les navigateurs indiqués, en comparant les sélections de la fin vers le début et du début vers la fin avec des contrôles par double et triple clic. Suivez le chemin du presse-papiers du navigateur utilisé par le VS Code web editor ; le travail est terminé lorsque des sélections arbitraires atteignent de manière fiable le presse-papiers de l’iPad, conservent les sauts de ligne et ne deviennent pas URL-encoded.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript, vscode
- Domaine
- frontend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 48/100