Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/replay/backend/menus/generateContextMenu.ts
1030 views
1
import { clipboard, Menu, nativeImage } from 'electron';
2
import { printPage, saveAs, viewSource } from './CommonActions';
3
import Window from '../models/Window';
4
5
export default function generateContextMenu(
6
params: Electron.ContextMenuParams,
7
webContents: Electron.WebContents,
8
) {
9
let menuItems: Electron.MenuItemConstructorOptions[] = [];
10
11
if (params.linkURL !== '') {
12
menuItems = menuItems.concat([
13
{
14
label: 'Copy link address',
15
click: () => {
16
clipboard.clear();
17
clipboard.writeText(params.linkURL);
18
},
19
},
20
{
21
type: 'separator',
22
},
23
]);
24
}
25
26
if (params.hasImageContents) {
27
menuItems = menuItems.concat([
28
{
29
label: 'Copy image',
30
click: () => {
31
const img = nativeImage.createFromDataURL(params.srcURL);
32
33
clipboard.clear();
34
clipboard.writeImage(img);
35
},
36
},
37
{
38
label: 'Copy image address',
39
click: () => {
40
clipboard.clear();
41
clipboard.writeText(params.srcURL);
42
},
43
},
44
{
45
type: 'separator',
46
},
47
]);
48
}
49
50
if (params.isEditable) {
51
menuItems = menuItems.concat([
52
{
53
role: 'undo',
54
accelerator: 'CmdOrCtrl+Z',
55
},
56
{
57
role: 'redo',
58
accelerator: 'CmdOrCtrl+Shift+Z',
59
},
60
{
61
type: 'separator',
62
},
63
{
64
role: 'cut',
65
accelerator: 'CmdOrCtrl+X',
66
},
67
{
68
role: 'copy',
69
accelerator: 'CmdOrCtrl+C',
70
},
71
{
72
role: 'pasteAndMatchStyle',
73
accelerator: 'CmdOrCtrl+V',
74
label: 'Paste',
75
},
76
{
77
role: 'paste',
78
accelerator: 'CmdOrCtrl+Shift+V',
79
label: 'Paste as plain text',
80
},
81
{
82
role: 'selectAll',
83
accelerator: 'CmdOrCtrl+A',
84
},
85
{
86
type: 'separator',
87
},
88
]);
89
}
90
91
if (!params.isEditable && params.selectionText !== '') {
92
menuItems = menuItems.concat([
93
{
94
role: 'copy',
95
accelerator: 'CmdOrCtrl+C',
96
},
97
{
98
type: 'separator',
99
},
100
]);
101
}
102
103
if (
104
!params.hasImageContents &&
105
params.linkURL === '' &&
106
params.selectionText === '' &&
107
!params.isEditable
108
) {
109
menuItems = menuItems.concat([
110
{
111
label: 'Go back',
112
accelerator: 'Alt+Left',
113
enabled: Window.current.hasBack(),
114
click: () => {
115
return Window.current.goBack();
116
},
117
},
118
{
119
label: 'Go forward',
120
accelerator: 'Alt+Right',
121
enabled: Window.current.hasNext(),
122
click: () => {
123
return Window.current.goForward();
124
},
125
},
126
{
127
label: 'Reload',
128
accelerator: 'CmdOrCtrl+R',
129
click: () => {
130
webContents.reload();
131
},
132
},
133
{
134
type: 'separator',
135
},
136
{
137
label: 'Save as...',
138
accelerator: 'CmdOrCtrl+S',
139
click: () => {
140
saveAs();
141
},
142
},
143
{
144
label: 'Print',
145
accelerator: 'CmdOrCtrl+P',
146
click: () => {
147
printPage();
148
},
149
},
150
{
151
type: 'separator',
152
},
153
{
154
label: 'View page source',
155
accelerator: 'CmdOrCtrl+U',
156
click: () => {
157
viewSource();
158
},
159
enabled: false,
160
},
161
]);
162
}
163
164
menuItems.push({
165
label: 'Inspect',
166
accelerator: 'CmdOrCtrl+Shift+I',
167
click: () => {
168
webContents.inspectElement(params.x, params.y);
169
170
if (webContents.isDevToolsOpened()) {
171
webContents.devToolsWebContents.focus();
172
} else {
173
webContents.openDevTools({ mode: 'detach' });
174
}
175
},
176
});
177
178
return Menu.buildFromTemplate(menuItems);
179
}
180
181