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