Skip to content

Commit cf88c71

Browse files
fix: use IPC for clipboard operations instead of execCommand('paste')
document.execCommand('paste') is blocked in Chromium/Electron for security reasons. Use webContents.cut()/copy()/paste() via IPC for reliable clipboard operations in the Electron environment. Falls back to Clipboard API in web. Co-Authored-By: rohandevin5@outlook.com <bossincrypto@gmail.com>
1 parent c693e89 commit cf88c71

4 files changed

Lines changed: 19 additions & 3 deletions

File tree

electron/main.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,10 @@ ipcMain.handle('export:html', async (_event, htmlContent: string) => {
561561
}
562562
})
563563

564+
ipcMain.on('edit:cut', () => mainWindow?.webContents.cut())
565+
ipcMain.on('edit:copy', () => mainWindow?.webContents.copy())
566+
ipcMain.on('edit:paste', () => mainWindow?.webContents.paste())
567+
564568
ipcMain.on('window:minimize', () => mainWindow?.minimize())
565569
ipcMain.on('window:maximize', () => {
566570
if (mainWindow?.isMaximized()) {

electron/preload.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ const electronAPI = {
1919
exportPDF: (htmlContent: string) => ipcRenderer.invoke('export:pdf', htmlContent),
2020
exportHTML: (htmlContent: string) => ipcRenderer.invoke('export:html', htmlContent),
2121

22+
editCut: () => ipcRenderer.send('edit:cut'),
23+
editCopy: () => ipcRenderer.send('edit:copy'),
24+
editPaste: () => ipcRenderer.send('edit:paste'),
25+
2226
minimizeWindow: () => ipcRenderer.send('window:minimize'),
2327
maximizeWindow: () => ipcRenderer.send('window:maximize'),
2428
closeWindow: () => ipcRenderer.send('window:close'),

src/App.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,18 @@ function App() {
278278
editorRef.current?.chain().focus().redo().run()
279279
break
280280
case 'cut':
281-
document.execCommand('cut')
281+
if (api?.editCut) api.editCut()
282+
else document.execCommand('cut')
282283
break
283284
case 'copy':
284-
document.execCommand('copy')
285+
if (api?.editCopy) api.editCopy()
286+
else document.execCommand('copy')
285287
break
286288
case 'paste':
287-
document.execCommand('paste')
289+
if (api?.editPaste) api.editPaste()
290+
else navigator.clipboard.readText().then(text => {
291+
editorRef.current?.chain().focus().insertContent(text).run()
292+
}).catch(() => {})
288293
break
289294
case 'select-all':
290295
editorRef.current?.chain().focus().selectAll().run()

src/types.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ declare global {
3434
exportHTML: (
3535
htmlContent: string
3636
) => Promise<{ success: boolean; filePath?: string; error?: string }>
37+
editCut: () => void
38+
editCopy: () => void
39+
editPaste: () => void
3740
minimizeWindow: () => void
3841
maximizeWindow: () => void
3942
closeWindow: () => void

0 commit comments

Comments
 (0)