From 3efba17dbe44c94f28dc38d8548a97cb80c260ca Mon Sep 17 00:00:00 2001 From: hns258 Date: Thu, 11 Aug 2022 18:53:40 -0400 Subject: [PATCH 01/22] Add `showSelectAll` option (#160) Co-authored-by: Sindre Sorhus --- fixtures/fixture.js | 1 + index.d.ts | 16 +++++++++++++++- index.js | 9 +++++++++ readme.md | 11 ++++++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/fixtures/fixture.js b/fixtures/fixture.js index f5b70da..91f0877 100644 --- a/fixtures/fixture.js +++ b/fixtures/fixture.js @@ -36,6 +36,7 @@ contextMenu({ } ], append: () => {}, + showSelectAll: true, showCopyImageAddress: true, showSaveImageAs: true, showInspectElement: false, diff --git a/index.d.ts b/index.d.ts index cdacb66..9320c1b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -40,6 +40,11 @@ declare namespace contextMenu { */ readonly paste?: string; + /** + @default 'Select All' + */ + readonly selectAll?: string; + /** @default 'Save Image' */ @@ -98,6 +103,7 @@ declare namespace contextMenu { readonly cut: (options: ActionOptions) => MenuItemConstructorOptions; readonly copy: (options: ActionOptions) => MenuItemConstructorOptions; readonly paste: (options: ActionOptions) => MenuItemConstructorOptions; + readonly selectAll: (options: ActionOptions) => MenuItemConstructorOptions; readonly saveImage: (options: ActionOptions) => MenuItemConstructorOptions; readonly saveImageAs: (options: ActionOptions) => MenuItemConstructorOptions; readonly copyLink: (options: ActionOptions) => MenuItemConstructorOptions; @@ -161,6 +167,13 @@ declare namespace contextMenu { */ readonly showSearchWithGoogle?: boolean; + /** + Show the `Select All` menu item when right-clicking in a window. + + Default: `false` on macOS, `true` on Windows and Linux + */ + readonly showSelectAll?: boolean; + /** Show the `Copy Image` menu item when right-clicking on an image. @@ -266,6 +279,7 @@ declare namespace contextMenu { - `showLearnSpelling` - `showLookUpSelection` - `showSearchWithGoogle` + - `showSelectAll` - `showCopyImage` - `showCopyImageAddress` - `showSaveImageAs` @@ -275,7 +289,7 @@ declare namespace contextMenu { To get spellchecking, “Correct Automatically”, and “Learn Spelling” in the menu, please enable the `spellcheck` preference in browser window: `new BrowserWindow({webPreferences: {spellcheck: true}})` - @default [...dictionarySuggestions, defaultActions.separator(), defaultActions.separator(), defaultActions.learnSpelling(), defaultActions.separator(), defaultActions.lookUpSelection(), defaultActions.separator(),defaultActions.searchWithGoogle(), defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), defaultActions.separator(), defaultActions.saveImage(), defaultActions.saveImageAs(), defaultActions.copyLink(), defaultActions.copyImage(), defaultActions.copyImageAddress(), defaultActions.separator(), defaultActions.copyLink(), defaultActions.saveLinkAs(), defaultActions.separator(), defaultActions.inspect()] + @default [...dictionarySuggestions, defaultActions.separator(), defaultActions.separator(), defaultActions.learnSpelling(), defaultActions.separator(), defaultActions.lookUpSelection(), defaultActions.separator(),defaultActions.searchWithGoogle(), defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), defaultActions.selectAll(), defaultActions.separator(), defaultActions.saveImage(), defaultActions.saveImageAs(), defaultActions.copyLink(), defaultActions.copyImage(), defaultActions.copyImageAddress(), defaultActions.separator(), defaultActions.copyLink(), defaultActions.saveLinkAs(), defaultActions.separator(), defaultActions.inspect()] */ readonly menu?: ( defaultActions: Actions, diff --git a/index.js b/index.js index 407c0b4..25017c1 100644 --- a/index.js +++ b/index.js @@ -119,6 +119,13 @@ const create = (win, options) => { } } }), + selectAll: decorateMenuItem({ + id: 'selectAll', + label: 'Select &All', + click() { + webContents(win).selectAll(); + } + }), saveImage: decorateMenuItem({ id: 'saveImage', label: 'Save I&mage', @@ -200,6 +207,7 @@ const create = (win, options) => { }; const shouldShowInspectElement = typeof options.showInspectElement === 'boolean' ? options.showInspectElement : isDev; + const shouldShowSelectAll = options.showSelectAll || (options.showSelectAll !== false && process.platform !== 'darwin'); function word(suggestion) { return { @@ -240,6 +248,7 @@ const create = (win, options) => { defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), + shouldShowSelectAll && defaultActions.selectAll(), defaultActions.separator(), options.showSaveImage && defaultActions.saveImage(), options.showSaveImageAs && defaultActions.saveImageAs(), diff --git a/readme.md b/readme.md index 6e4bb7d..8107df3 100644 --- a/readme.md +++ b/readme.md @@ -143,6 +143,13 @@ Default: `true` Show the `Search with Google` menu item when right-clicking text. +#### showSelectAll + +Type: `boolean`\ +Default: `false` on macOS, `true` on Windows and Linux + +Show the `Select All` menu item when right-clicking in a window. + #### showCopyImage Type: `boolean`\ @@ -249,13 +256,14 @@ To get spellchecking, “Correct Automatically”, and “Learn Spelling” in t The following options are ignored when `menu` is used: - `showLookUpSelection` +- `showSearchWithGoogle` +- `showSelectAll` - `showCopyImage` - `showCopyImageAddress` - `showSaveImageAs` - `showSaveLinkAs` - `showInspectElement` - `showServices` -- `showSearchWithGoogle` Default actions: @@ -267,6 +275,7 @@ Default actions: - `cut` - `copy` - `paste` +- `selectAll` - `saveImage` - `saveImageAs` - `copyImage` From 584bb1f8ac0681c71071f86f96fdbd8c6587d1bc Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 12 Aug 2022 01:00:33 +0200 Subject: [PATCH 02/22] 3.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1465c53..5568de4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "3.3.0", + "version": "3.4.0", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From 157a5ad68054752af6a6d21f18d640d16bd62f39 Mon Sep 17 00:00:00 2001 From: tauraloke Date: Wed, 17 Aug 2022 00:22:10 +0300 Subject: [PATCH 03/22] Fix typo in readme example (#162) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 8107df3..8dc478b 100644 --- a/readme.md +++ b/readme.md @@ -41,7 +41,7 @@ let mainWindow; Advanced example: ```js -const {app, BrowserWindow} = require('electron'); +const {app, BrowserWindow, shell} = require('electron'); const contextMenu = require('electron-context-menu'); contextMenu({ From ddc4036cb9a652dceb0e776445be23b248db3ae2 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 16 Aug 2022 23:24:15 +0200 Subject: [PATCH 04/22] Meta tweaks --- index.d.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/index.d.ts b/index.d.ts index 9320c1b..cffd5fe 100644 --- a/index.d.ts +++ b/index.d.ts @@ -318,8 +318,8 @@ You can use this module directly in both the main and renderer process. @example ``` -const {app, BrowserWindow} = require('electron'); -const contextMenu = require('electron-context-menu'); +import {app, BrowserWindow} = require('electron'); +import contextMenu = require('electron-context-menu'); contextMenu({ showSaveImageAs: true @@ -339,7 +339,7 @@ let mainWindow; @example ``` -import {app, BrowserWindow} from 'electron'; +import {app, BrowserWindow} = require('electron'); import contextMenu = require('electron-context-menu'); contextMenu({ @@ -348,6 +348,14 @@ contextMenu({ label: 'Rainbow', // Only show it when right-clicking images visible: parameters.mediaType === 'image' + }, + { + label: 'Search Google for “{selection}”', + // Only show it when right-clicking text + visible: parameters.selectionText.trim().length > 0, + click: () => { + shell.openExternal(`https://google.com/search?q=${encodeURIComponent(parameters.selectionText)}`); + } } ] }); @@ -361,7 +369,7 @@ let mainWindow; spellcheck: true } }); -}); +})(); ``` The return value of `contextMenu()` is a function that disposes of the created event listeners: @@ -372,7 +380,6 @@ const dispose = contextMenu(); dispose(); ``` - */ declare function contextMenu(options?: contextMenu.Options): () => void; // eslint-disable-line no-redeclare From c50c1f5bc81fd07926a0cd37f9dcaba6fb014199 Mon Sep 17 00:00:00 2001 From: andy wu Date: Fri, 19 Aug 2022 22:55:31 +0800 Subject: [PATCH 05/22] Add menu items to save and copy video (#161) --- fixtures/fixture-menu.js | 6 ++++++ fixtures/fixture.html | 5 +++++ fixtures/fixture.js | 2 ++ fixtures/flower.mp4 | Bin 0 -> 121152 bytes index.d.ts | 44 ++++++++++++++++++++++++++++++++++++++- index.js | 34 ++++++++++++++++++++++++++++++ readme.md | 27 ++++++++++++++++++++++++ 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 fixtures/flower.mp4 diff --git a/fixtures/fixture-menu.js b/fixtures/fixture-menu.js index 920e7e1..4fbde25 100644 --- a/fixtures/fixture-menu.js +++ b/fixtures/fixture-menu.js @@ -17,6 +17,12 @@ contextMenu({ label: 'Unicorn' }, actions.separator(), + actions.saveVideo(), + actions.saveVideoAs(), + actions.copyVideoAddress({ + transform: content => `modified_copy_${content}` + }), + actions.separator(), actions.copy({ transform: content => `modified_copy_${content}` }), diff --git a/fixtures/fixture.html b/fixtures/fixture.html index b0d5b29..90b371b 100644 --- a/fixtures/fixture.html +++ b/fixtures/fixture.html @@ -22,6 +22,11 @@

Fixture



+
+
Editable text

Link diff --git a/fixtures/fixture.js b/fixtures/fixture.js index 91f0877..70185a0 100644 --- a/fixtures/fixture.js +++ b/fixtures/fixture.js @@ -39,6 +39,8 @@ contextMenu({ showSelectAll: true, showCopyImageAddress: true, showSaveImageAs: true, + showCopyVideoAddress: true, + showSaveVideoAs: true, showInspectElement: false, showSaveLinkAs: true }); diff --git a/fixtures/flower.mp4 b/fixtures/flower.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..ab9982adbd9014dd1b66dbd1d0c44fb76896f96b GIT binary patch literal 121152 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 literal 0 HcmV?d00001 diff --git a/index.d.ts b/index.d.ts index cffd5fe..cef5204 100644 --- a/index.d.ts +++ b/index.d.ts @@ -55,6 +55,16 @@ declare namespace contextMenu { */ readonly saveImageAs?: string; + /** + @default 'Save Video' + */ + readonly saveVideo?: string; + + /** + @default 'Save Video As…' + */ + readonly saveVideoAs?: string; + /** @default 'Copy Link' */ @@ -75,6 +85,11 @@ declare namespace contextMenu { */ readonly copyImageAddress?: string; + /** + @default 'Copy Video Address' + */ + readonly copyVideoAddress?: string; + /** @default 'Inspect Element' */ @@ -106,9 +121,12 @@ declare namespace contextMenu { readonly selectAll: (options: ActionOptions) => MenuItemConstructorOptions; readonly saveImage: (options: ActionOptions) => MenuItemConstructorOptions; readonly saveImageAs: (options: ActionOptions) => MenuItemConstructorOptions; + readonly saveVideo: (options: ActionOptions) => MenuItemConstructorOptions; + readonly saveVideoAs: (options: ActionOptions) => MenuItemConstructorOptions; readonly copyLink: (options: ActionOptions) => MenuItemConstructorOptions; readonly copyImage: (options: ActionOptions) => MenuItemConstructorOptions; readonly copyImageAddress: (options: ActionOptions) => MenuItemConstructorOptions; + readonly copyVideoAddress: (options: ActionOptions) => MenuItemConstructorOptions; readonly inspect: () => MenuItemConstructorOptions; readonly services: () => MenuItemConstructorOptions; } @@ -202,6 +220,27 @@ declare namespace contextMenu { */ readonly showSaveImageAs?: boolean; + /** + Show the `Copy Video Address` menu item when right-clicking on a video. + + @default false + */ + readonly showCopyVideoAddress?: boolean; + + /** + Show the `Save Video` menu item when right-clicking on a video. + + @default false + */ + readonly showSaveVideo?: boolean; + + /** + Show the `Save Video As…` menu item when right-clicking on a video. + + @default false + */ + readonly showSaveVideoAs?: boolean; + /** Show the `Save Link As…` menu item when right-clicking on a link. @@ -283,13 +322,16 @@ declare namespace contextMenu { - `showCopyImage` - `showCopyImageAddress` - `showSaveImageAs` + - `showCopyVideoAddress` + - `showSaveVideo` + - `showSaveVideoAs` - `showSaveLinkAs` - `showInspectElement` - `showServices` To get spellchecking, “Correct Automatically”, and “Learn Spelling” in the menu, please enable the `spellcheck` preference in browser window: `new BrowserWindow({webPreferences: {spellcheck: true}})` - @default [...dictionarySuggestions, defaultActions.separator(), defaultActions.separator(), defaultActions.learnSpelling(), defaultActions.separator(), defaultActions.lookUpSelection(), defaultActions.separator(),defaultActions.searchWithGoogle(), defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), defaultActions.selectAll(), defaultActions.separator(), defaultActions.saveImage(), defaultActions.saveImageAs(), defaultActions.copyLink(), defaultActions.copyImage(), defaultActions.copyImageAddress(), defaultActions.separator(), defaultActions.copyLink(), defaultActions.saveLinkAs(), defaultActions.separator(), defaultActions.inspect()] + @default [...dictionarySuggestions, defaultActions.separator(), defaultActions.separator(), defaultActions.learnSpelling(), defaultActions.separator(), defaultActions.lookUpSelection(), defaultActions.separator(),defaultActions.searchWithGoogle(), defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), defaultActions.selectAll(), defaultActions.separator(), defaultActions.saveImage(), defaultActions.saveImageAs(), defaultActions.saveVideo(), defaultActions.saveVideoAs(), defaultActions.copyLink(), defaultActions.copyImage(), defaultActions.copyImageAddress(), defaultActions.separator(), defaultActions.copyLink(), defaultActions.saveLinkAs(), defaultActions.separator(), defaultActions.inspect()] */ readonly menu?: ( defaultActions: Actions, diff --git a/index.js b/index.js index 25017c1..0137cec 100644 --- a/index.js +++ b/index.js @@ -144,6 +144,24 @@ const create = (win, options) => { download(win, props.srcURL, {saveAs: true}); } }), + saveVideo: decorateMenuItem({ + id: 'saveVideo', + label: 'Save Vide&o', + visible: props.mediaType === 'video', + click(menuItem) { + props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; + download(win, props.srcURL); + } + }), + saveVideoAs: decorateMenuItem({ + id: 'saveVideoAs', + label: 'Save Video& As…', + visible: props.mediaType === 'video', + click(menuItem) { + props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; + download(win, props.srcURL, {saveAs: true}); + } + }), copyLink: decorateMenuItem({ id: 'copyLink', label: 'Copy Lin&k', @@ -187,6 +205,19 @@ const create = (win, options) => { }); } }), + copyVideoAddress: decorateMenuItem({ + id: 'copyVideoAddress', + label: 'Copy Video Ad&dress', + visible: props.mediaType === 'video', + click(menuItem) { + props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; + + electron.clipboard.write({ + bookmark: props.srcURL, + text: props.srcURL + }); + } + }), inspect: () => ({ id: 'inspect', label: 'I&nspect Element', @@ -254,6 +285,9 @@ const create = (win, options) => { options.showSaveImageAs && defaultActions.saveImageAs(), options.showCopyImage !== false && defaultActions.copyImage(), options.showCopyImageAddress && defaultActions.copyImageAddress(), + options.showSaveVideo && defaultActions.saveVideo(), + options.showSaveVideoAs && defaultActions.saveVideoAs(), + options.showCopyVideoAddress && defaultActions.copyVideoAddress(), defaultActions.separator(), defaultActions.copyLink(), options.showSaveLinkAs && defaultActions.saveLinkAs(), diff --git a/readme.md b/readme.md index 8dc478b..a9da98a 100644 --- a/readme.md +++ b/readme.md @@ -178,6 +178,27 @@ Default: `false` Show the `Save Image As…` menu item when right-clicking on an image. +#### showCopyVideoAddress + +Type: `boolean`\ +Default: `false` + +Show the `Copy Video Address` menu item when right-clicking on a video. + +#### showSaveVideo + +Type: `boolean`\ +Default: `false` + +Show the `Save Video` menu item when right-clicking on a video. + +#### showSaveVideoAs + +Type: `boolean`\ +Default: `false` + +Show the `Save Video As…` menu item when right-clicking on a video. + #### showSaveLinkAs Type: `boolean`\ @@ -261,6 +282,9 @@ The following options are ignored when `menu` is used: - `showCopyImage` - `showCopyImageAddress` - `showSaveImageAs` +- `showCopyVideoAddress` +- `showSaveVideo` +- `showSaveVideoAs` - `showSaveLinkAs` - `showInspectElement` - `showServices` @@ -278,8 +302,11 @@ Default actions: - `selectAll` - `saveImage` - `saveImageAs` +- `saveVideo` +- `saveVideoAs` - `copyImage` - `copyImageAddress` +- `copyVideoAddress` - `copyLink` - `saveLinkAs` - `inspect` From 27f85a12c1be6c82eb3346dc69a0844022478a2a Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 19 Aug 2022 16:57:15 +0200 Subject: [PATCH 06/22] 3.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5568de4..b2c4a46 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "3.4.0", + "version": "3.5.0", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From 9ed5d4b14f7feb75f3548f60f52a1ee539f125ff Mon Sep 17 00:00:00 2001 From: Brandon Fowler <42590338+BrandonXLF@users.noreply.github.com> Date: Wed, 26 Oct 2022 10:38:43 -0400 Subject: [PATCH 07/22] Allow copying whitespace-only text (#166) --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 0137cec..37b11f7 100644 --- a/index.js +++ b/index.js @@ -35,7 +35,7 @@ const create = (win, options) => { } const {editFlags} = props; - const hasText = props.selectionText.trim().length > 0; + const hasText = props.selectionText.length > 0; const isLink = Boolean(props.linkURL); const can = type => editFlags[`can${type}`] && hasText; From 48b43f915b1025e4ce11972c24908f0571af37d5 Mon Sep 17 00:00:00 2001 From: absidue <48293849+absidue@users.noreply.github.com> Date: Wed, 26 Oct 2022 16:41:00 +0200 Subject: [PATCH 08/22] Add `showCopyLink` option (#165) --- index.d.ts | 8 ++++++++ index.js | 2 +- readme.md | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index cef5204..f98369c 100644 --- a/index.d.ts +++ b/index.d.ts @@ -241,6 +241,13 @@ declare namespace contextMenu { */ readonly showSaveVideoAs?: boolean; + /** + Show the `Copy Link` menu item when right-clicking on a link. + + @default true + */ + readonly showCopyLink?: boolean; + /** Show the `Save Link As…` menu item when right-clicking on a link. @@ -325,6 +332,7 @@ declare namespace contextMenu { - `showCopyVideoAddress` - `showSaveVideo` - `showSaveVideoAs` + - `showCopyLink` - `showSaveLinkAs` - `showInspectElement` - `showServices` diff --git a/index.js b/index.js index 37b11f7..6e8e551 100644 --- a/index.js +++ b/index.js @@ -289,7 +289,7 @@ const create = (win, options) => { options.showSaveVideoAs && defaultActions.saveVideoAs(), options.showCopyVideoAddress && defaultActions.copyVideoAddress(), defaultActions.separator(), - defaultActions.copyLink(), + options.showCopyLink !== false && defaultActions.copyLink(), options.showSaveLinkAs && defaultActions.saveLinkAs(), defaultActions.separator(), shouldShowInspectElement && defaultActions.inspect(), diff --git a/readme.md b/readme.md index a9da98a..be01049 100644 --- a/readme.md +++ b/readme.md @@ -199,6 +199,13 @@ Default: `false` Show the `Save Video As…` menu item when right-clicking on a video. +#### showCopyLink + +Type: `boolean`\ +Default: `true` + +Show the `Copy Link` menu item when right-clicking on a link. + #### showSaveLinkAs Type: `boolean`\ @@ -285,6 +292,7 @@ The following options are ignored when `menu` is used: - `showCopyVideoAddress` - `showSaveVideo` - `showSaveVideoAs` +- `showCopyLink` - `showSaveLinkAs` - `showInspectElement` - `showServices` From 503c4aa3e56ea8f5bf73c758f15b483f30ad0ddc Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 26 Oct 2022 21:43:41 +0700 Subject: [PATCH 09/22] 3.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b2c4a46..b827d5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "3.5.0", + "version": "3.6.0", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From cc69dea7e8288c5bbeddd7d2b472e47ffc5d201d Mon Sep 17 00:00:00 2001 From: contra Date: Sat, 3 Dec 2022 11:51:52 -0700 Subject: [PATCH 10/22] Fix "Inspect Element" not working in `BrowserView` (#167) --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 6e8e551..685277d 100644 --- a/index.js +++ b/index.js @@ -222,7 +222,7 @@ const create = (win, options) => { id: 'inspect', label: 'I&nspect Element', click() { - win.inspectElement(props.x, props.y); + webContents(win).inspectElement(props.x, props.y); if (webContents(win).isDevToolsOpened()) { webContents(win).devToolsWebContents.focus(); From b150d0afd9d8f4cf7af07c084678855452c6b01a Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sun, 4 Dec 2022 02:09:50 +0700 Subject: [PATCH 11/22] 3.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b827d5a..812eeb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "3.6.0", + "version": "3.6.1", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From a38824135b24459e9329bd9404c3e2fe32409438 Mon Sep 17 00:00:00 2001 From: samuel-fringeli Date: Sun, 13 Aug 2023 01:59:59 +0200 Subject: [PATCH 12/22] Fix readme for more recent Electron versions (#169) Co-authored-by: Sindre Sorhus --- readme.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/readme.md b/readme.md index be01049..dd92ed8 100644 --- a/readme.md +++ b/readme.md @@ -30,11 +30,7 @@ let mainWindow; (async () => { await app.whenReady(); - mainWindow = new BrowserWindow({ - webPreferences: { - spellcheck: true - } - }); + mainWindow = new BrowserWindow(); })(); ``` @@ -66,11 +62,7 @@ let mainWindow; (async () => { await app.whenReady(); - mainWindow = new BrowserWindow({ - webPreferences: { - spellcheck: true - } - }); + mainWindow = new BrowserWindow(); })(); ``` @@ -127,7 +119,7 @@ Default: `true` Show the `Learn Spelling {selection}` menu item when right-clicking text. -Even if `true`, the `spellcheck` preference in browser window must still be enabled. It will also only show when right-clicking misspelled words. +The spellcheck will only show when right-clicking misspelled words. #### showLookUpSelection @@ -279,7 +271,7 @@ Even though you include an action, it will still only be shown/enabled when appr `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in [`options.labels`](#labels). -To get spellchecking, “Correct Automatically”, and “Learn Spelling” in the menu, please enable the `spellcheck` preference in browser window: `new BrowserWindow({webPreferences: {spellcheck: true}})` +To get spellchecking, “Correct Automatically”, and “Learn Spelling” in the menu, make sure you have not disabled the `spellcheck` option (it's `true` by default) in `BrowserWindow`. The following options are ignored when `menu` is used: From 3b72a2641406ba917069cb9cde64328e8dc8c3d7 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 1 May 2024 19:35:54 +0700 Subject: [PATCH 13/22] Require Node.js 18 and Electron 30 and move to ESM --- .github/funding.yml | 4 - .github/workflows/main.yml | 7 +- fixtures/fixture-menu.js | 33 +- fixtures/fixture-toggle.js | 12 +- fixtures/fixture.js | 34 +- index.d.ts | 688 ++++++++++++++++++------------------- index.js | 192 +++++------ index.test-d.ts | 24 -- package.json | 35 +- readme.md | 20 +- test.js | 2 +- 11 files changed, 508 insertions(+), 543 deletions(-) delete mode 100644 .github/funding.yml delete mode 100644 index.test-d.ts diff --git a/.github/funding.yml b/.github/funding.yml deleted file mode 100644 index 15edf6e..0000000 --- a/.github/funding.yml +++ /dev/null @@ -1,4 +0,0 @@ -github: sindresorhus -open_collective: sindresorhus -patreon: sindresorhus -custom: https://sindresorhus.com/donate diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bafbe5e..346585c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,10 +10,11 @@ jobs: fail-fast: false matrix: node-version: - - 14 + - 20 + - 18 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm install diff --git a/fixtures/fixture-menu.js b/fixtures/fixture-menu.js index 4fbde25..a6d7054 100644 --- a/fixtures/fixture-menu.js +++ b/fixtures/fixture-menu.js @@ -1,47 +1,44 @@ -'use strict'; -const path = require('path'); -const { - app, - BrowserWindow -} = require('electron'); -const contextMenu = require('..'); +import path from 'node:path'; +import {app, BrowserWindow} from 'electron'; +import contextMenu from '../index.js'; contextMenu({ menu: actions => [ actions.separator(), actions.copyLink({ - transform: content => `modified_link_${content}` + transform: content => `modified_link_${content}`, }), actions.separator(), { - label: 'Unicorn' + label: 'Unicorn', }, actions.separator(), actions.saveVideo(), actions.saveVideoAs(), actions.copyVideoAddress({ - transform: content => `modified_copy_${content}` + transform: content => `modified_copy_${content}`, }), actions.separator(), actions.copy({ - transform: content => `modified_copy_${content}` + transform: content => `modified_copy_${content}`, }), { label: 'Invisible', - visible: false + visible: false, }, actions.paste({ - transform: content => `modified_paste_${content}` - }) - ] + transform: content => `modified_paste_${content}`, + }), + ], }); +// eslint-disable-next-line unicorn/prefer-top-level-await (async () => { await app.whenReady(); await (new BrowserWindow({ webPreferences: { - spellcheck: true - } - })).loadFile(path.join(__dirname, 'fixture.html')); + spellcheck: true, + }, + })).loadFile(path.join(import.meta.dirname, 'fixture.html')); })(); diff --git a/fixtures/fixture-toggle.js b/fixtures/fixture-toggle.js index d99fa83..fa089b7 100644 --- a/fixtures/fixture-toggle.js +++ b/fixtures/fixture-toggle.js @@ -1,13 +1,13 @@ -'use strict'; -const path = require('path'); -const {app, BrowserWindow} = require('electron'); +import path from 'node:path'; +import {app, BrowserWindow} from 'electron'; +// eslint-disable-next-line unicorn/prefer-top-level-await (async () => { await app.whenReady(); await (new BrowserWindow({ webPreferences: { - nodeIntegration: true - } - })).loadFile(path.join(__dirname, 'fixture-toggle.html')); + nodeIntegration: true, + }, + })).loadFile(path.join(import.meta.dirname, 'fixture-toggle.html')); })(); diff --git a/fixtures/fixture.js b/fixtures/fixture.js index 70185a0..cd1e159 100644 --- a/fixtures/fixture.js +++ b/fixtures/fixture.js @@ -1,7 +1,6 @@ -'use strict'; -const path = require('path'); -const {app, BrowserWindow} = require('electron'); -const contextMenu = require('..'); +import path from 'node:path'; +import {app, BrowserWindow} from 'electron'; +import contextMenu from '../index.js'; contextMenu({ labels: { @@ -12,45 +11,46 @@ contextMenu({ saveImageAs: 'Configured Save Image As…', copyLink: 'Configured Copy Link', saveLinkAs: 'Configured Save Link As…', - inspect: 'Configured Inspect' + inspect: 'Configured Inspect', }, prepend: () => [ { - label: 'Unicorn' + label: 'Unicorn', }, { - type: 'separator' + type: 'separator', }, { - type: 'separator' + type: 'separator', }, { label: 'Invisible', - visible: false + visible: false, }, { - type: 'separator' + type: 'separator', }, { - type: 'separator' - } + type: 'separator', + }, ], - append: () => {}, + append() {}, showSelectAll: true, showCopyImageAddress: true, showSaveImageAs: true, showCopyVideoAddress: true, showSaveVideoAs: true, showInspectElement: false, - showSaveLinkAs: true + showSaveLinkAs: true, }); +// eslint-disable-next-line unicorn/prefer-top-level-await (async () => { await app.whenReady(); await (new BrowserWindow({ webPreferences: { - spellcheck: true - } - })).loadFile(path.join(__dirname, 'fixture.html')); + spellcheck: true, + }, + })).loadFile(path.join(import.meta.dirname, 'fixture.html')); })(); diff --git a/index.d.ts b/index.d.ts index f98369c..468e48b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,365 +1,363 @@ import { - BrowserWindow, - BrowserView, - ContextMenuParams, - MenuItemConstructorOptions, - Event as ElectronEvent, - WebContents + type BrowserWindow, + type BrowserView, + type ContextMenuParams, + type MenuItemConstructorOptions, + type Event as ElectronEvent, + type WebContents, } from 'electron'; -declare namespace contextMenu { - interface Labels { - /** - @default 'Learn Spelling' - */ - readonly learnSpelling?: string; - - /** - The placeholder `{selection}` will be replaced by the currently selected text. - @default 'Look Up “{selection}”' - */ - readonly lookUpSelection?: string; - - /** - @default 'Search with Google' - */ - readonly searchWithGoogle?: string; - - /** - @default 'Cut' - */ - readonly cut?: string; - - /** - @default 'Copy' - */ - readonly copy?: string; - - /** - @default 'Paste' - */ - readonly paste?: string; - - /** - @default 'Select All' - */ - readonly selectAll?: string; - - /** - @default 'Save Image' - */ - readonly saveImage?: string; - - /** - @default 'Save Image As…' - */ - readonly saveImageAs?: string; - - /** - @default 'Save Video' - */ - readonly saveVideo?: string; - - /** - @default 'Save Video As…' - */ - readonly saveVideoAs?: string; - - /** - @default 'Copy Link' - */ - readonly copyLink?: string; - - /** - @default 'Save Link As…' - */ - readonly saveLinkAs?: string; - - /** - @default 'Copy Image' - */ - readonly copyImage?: string; - - /** - @default 'Copy Image Address' - */ - readonly copyImageAddress?: string; - - /** - @default 'Copy Video Address' - */ - readonly copyVideoAddress?: string; - - /** - @default 'Inspect Element' - */ - readonly inspect?: string; - - /** - @default 'Services' - */ - readonly services?: string; - } - - interface ActionOptions { - /** - Apply a transformation to the content of the action. - - If you use this on `cut`, `copy`, or `paste`, they will convert rich text to plain text. - */ - readonly transform?: (content: string) => string; - } - - interface Actions { - readonly separator: () => MenuItemConstructorOptions; - readonly learnSpelling: (options: ActionOptions) => MenuItemConstructorOptions; - readonly lookUpSelection: (options: ActionOptions) => MenuItemConstructorOptions; - readonly searchWithGoogle: (options: ActionOptions) => MenuItemConstructorOptions; - readonly cut: (options: ActionOptions) => MenuItemConstructorOptions; - readonly copy: (options: ActionOptions) => MenuItemConstructorOptions; - readonly paste: (options: ActionOptions) => MenuItemConstructorOptions; - readonly selectAll: (options: ActionOptions) => MenuItemConstructorOptions; - readonly saveImage: (options: ActionOptions) => MenuItemConstructorOptions; - readonly saveImageAs: (options: ActionOptions) => MenuItemConstructorOptions; - readonly saveVideo: (options: ActionOptions) => MenuItemConstructorOptions; - readonly saveVideoAs: (options: ActionOptions) => MenuItemConstructorOptions; - readonly copyLink: (options: ActionOptions) => MenuItemConstructorOptions; - readonly copyImage: (options: ActionOptions) => MenuItemConstructorOptions; - readonly copyImageAddress: (options: ActionOptions) => MenuItemConstructorOptions; - readonly copyVideoAddress: (options: ActionOptions) => MenuItemConstructorOptions; - readonly inspect: () => MenuItemConstructorOptions; - readonly services: () => MenuItemConstructorOptions; - } - - interface Options { - /** - Window or WebView to add the context menu to. - When not specified, the context menu will be added to all existing and new windows. - */ - readonly window?: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents; - - /** - Should return an array of [menu items](https://electronjs.org/docs/api/menu-item) to be prepended to the context menu. - - `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in `options.labels`. - */ - readonly prepend?: ( - defaultActions: Actions, - parameters: ContextMenuParams, - browserWindow: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents, - event: ElectronEvent - ) => MenuItemConstructorOptions[]; - - /** - Should return an array of [menu items](https://electronjs.org/docs/api/menu-item) to be appended to the context menu. - - `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in `options.labels`. - */ - readonly append?: ( - defaultActions: Actions, - parameters: ContextMenuParams, - browserWindow: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents, - event: ElectronEvent - ) => MenuItemConstructorOptions[]; - - /** - Show the `Learn Spelling {selection}` menu item when right-clicking text. - - Even if `true`, the `spellcheck` preference in browser window must still be enabled. It will also only show when right-clicking misspelled words. - - @default true - */ - readonly showLearnSpelling?: boolean; - - /** - Show the `Look Up {selection}` menu item when right-clicking text. - - @default true - */ - readonly showLookUpSelection?: boolean; - - /** - Show the `Search with Google` menu item when right-clicking text. - - @default true - */ - readonly showSearchWithGoogle?: boolean; +export type Labels = { + /** + @default 'Learn Spelling' + */ + readonly learnSpelling?: string; + + /** + The placeholder `{selection}` will be replaced by the currently selected text. + @default 'Look Up “{selection}”' + */ + readonly lookUpSelection?: string; + + /** + @default 'Search with Google' + */ + readonly searchWithGoogle?: string; + + /** + @default 'Cut' + */ + readonly cut?: string; + + /** + @default 'Copy' + */ + readonly copy?: string; + + /** + @default 'Paste' + */ + readonly paste?: string; + + /** + @default 'Select All' + */ + readonly selectAll?: string; + + /** + @default 'Save Image' + */ + readonly saveImage?: string; + + /** + @default 'Save Image As…' + */ + readonly saveImageAs?: string; + + /** + @default 'Save Video' + */ + readonly saveVideo?: string; + + /** + @default 'Save Video As…' + */ + readonly saveVideoAs?: string; + + /** + @default 'Copy Link' + */ + readonly copyLink?: string; + + /** + @default 'Save Link As…' + */ + readonly saveLinkAs?: string; + + /** + @default 'Copy Image' + */ + readonly copyImage?: string; + + /** + @default 'Copy Image Address' + */ + readonly copyImageAddress?: string; + + /** + @default 'Copy Video Address' + */ + readonly copyVideoAddress?: string; + + /** + @default 'Inspect Element' + */ + readonly inspect?: string; + + /** + @default 'Services' + */ + readonly services?: string; +}; + +export type ActionOptions = { + /** + Apply a transformation to the content of the action. + + If you use this on `cut`, `copy`, or `paste`, they will convert rich text to plain text. + */ + readonly transform?: (content: string) => string; +}; + +export type Actions = { + readonly separator: () => MenuItemConstructorOptions; + readonly learnSpelling: (options: ActionOptions) => MenuItemConstructorOptions; + readonly lookUpSelection: (options: ActionOptions) => MenuItemConstructorOptions; + readonly searchWithGoogle: (options: ActionOptions) => MenuItemConstructorOptions; + readonly cut: (options: ActionOptions) => MenuItemConstructorOptions; + readonly copy: (options: ActionOptions) => MenuItemConstructorOptions; + readonly paste: (options: ActionOptions) => MenuItemConstructorOptions; + readonly selectAll: (options: ActionOptions) => MenuItemConstructorOptions; + readonly saveImage: (options: ActionOptions) => MenuItemConstructorOptions; + readonly saveImageAs: (options: ActionOptions) => MenuItemConstructorOptions; + readonly saveVideo: (options: ActionOptions) => MenuItemConstructorOptions; + readonly saveVideoAs: (options: ActionOptions) => MenuItemConstructorOptions; + readonly copyLink: (options: ActionOptions) => MenuItemConstructorOptions; + readonly copyImage: (options: ActionOptions) => MenuItemConstructorOptions; + readonly copyImageAddress: (options: ActionOptions) => MenuItemConstructorOptions; + readonly copyVideoAddress: (options: ActionOptions) => MenuItemConstructorOptions; + readonly inspect: () => MenuItemConstructorOptions; + readonly services: () => MenuItemConstructorOptions; +}; + +export type Options = { + /** + Window or WebView to add the context menu to. + When not specified, the context menu will be added to all existing and new windows. + */ + readonly window?: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents; + + /** + Should return an array of [menu items](https://electronjs.org/docs/api/menu-item) to be prepended to the context menu. + + `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in `options.labels`. + */ + readonly prepend?: ( + defaultActions: Actions, + parameters: ContextMenuParams, + browserWindow: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents, + event: ElectronEvent + ) => MenuItemConstructorOptions[]; + + /** + Should return an array of [menu items](https://electronjs.org/docs/api/menu-item) to be appended to the context menu. + + `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in `options.labels`. + */ + readonly append?: ( + defaultActions: Actions, + parameters: ContextMenuParams, + browserWindow: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents, + event: ElectronEvent + ) => MenuItemConstructorOptions[]; + + /** + Show the `Learn Spelling {selection}` menu item when right-clicking text. + + Even if `true`, the `spellcheck` preference in browser window must still be enabled. It will also only show when right-clicking misspelled words. + + @default true + */ + readonly showLearnSpelling?: boolean; + + /** + Show the `Look Up {selection}` menu item when right-clicking text. + + @default true + */ + readonly showLookUpSelection?: boolean; + + /** + Show the `Search with Google` menu item when right-clicking text. + + @default true + */ + readonly showSearchWithGoogle?: boolean; + + /** + Show the `Select All` menu item when right-clicking in a window. + + Default: `false` on macOS, `true` on Windows and Linux + */ + readonly showSelectAll?: boolean; + + /** + Show the `Copy Image` menu item when right-clicking on an image. + + @default true + */ + readonly showCopyImage?: boolean; + + /** + Show the `Copy Image Address` menu item when right-clicking on an image. + + @default false + */ + readonly showCopyImageAddress?: boolean; + + /** + Show the `Save Image` menu item when right-clicking on an image. + + @default false + */ + readonly showSaveImage?: boolean; + + /** + Show the `Save Image As…` menu item when right-clicking on an image. + + @default false + */ + readonly showSaveImageAs?: boolean; - /** - Show the `Select All` menu item when right-clicking in a window. + /** + Show the `Copy Video Address` menu item when right-clicking on a video. - Default: `false` on macOS, `true` on Windows and Linux - */ - readonly showSelectAll?: boolean; + @default false + */ + readonly showCopyVideoAddress?: boolean; - /** - Show the `Copy Image` menu item when right-clicking on an image. + /** + Show the `Save Video` menu item when right-clicking on a video. - @default true - */ - readonly showCopyImage?: boolean; + @default false + */ + readonly showSaveVideo?: boolean; - /** - Show the `Copy Image Address` menu item when right-clicking on an image. + /** + Show the `Save Video As…` menu item when right-clicking on a video. - @default false - */ - readonly showCopyImageAddress?: boolean; + @default false + */ + readonly showSaveVideoAs?: boolean; - /** - Show the `Save Image` menu item when right-clicking on an image. + /** + Show the `Copy Link` menu item when right-clicking on a link. - @default false - */ - readonly showSaveImage?: boolean; + @default true + */ + readonly showCopyLink?: boolean; - /** - Show the `Save Image As…` menu item when right-clicking on an image. + /** + Show the `Save Link As…` menu item when right-clicking on a link. - @default false - */ - readonly showSaveImageAs?: boolean; + @default false + */ + readonly showSaveLinkAs?: boolean; - /** - Show the `Copy Video Address` menu item when right-clicking on a video. + /** + Force enable or disable the `Inspect Element` menu item. - @default false - */ - readonly showCopyVideoAddress?: boolean; + Default: [Only in development](https://github.com/sindresorhus/electron-is-dev) + */ + readonly showInspectElement?: boolean; - /** - Show the `Save Video` menu item when right-clicking on a video. + /** + Show the system `Services` submenu on macOS. - @default false - */ - readonly showSaveVideo?: boolean; + @default false + */ + readonly showServices?: boolean; - /** - Show the `Save Video As…` menu item when right-clicking on a video. + /** + Override labels for the default menu items. Useful for i18n. - @default false - */ - readonly showSaveVideoAs?: boolean; + The placeholder `{selection}` may be used in any label, and will be replaced by the currently selected text, trimmed to a maximum of 25 characters length. This is useful when localizing the `Look Up “{selection}”` menu item, but can also be used in custom menu items, for example, to implement a `Search Google for “{selection}”` menu item. If there is no selection, the `{selection}` placeholder will be replaced by an empty string. Normally this placeholder is only useful for menu items which will only be shown when there is text selected. This can be checked using `visible: parameters.selectionText.trim().length > 0` when implementing a custom menu item. - /** - Show the `Copy Link` menu item when right-clicking on a link. + @default {} - @default true - */ - readonly showCopyLink?: boolean; - - /** - Show the `Save Link As…` menu item when right-clicking on a link. - - @default false - */ - readonly showSaveLinkAs?: boolean; - - /** - Force enable or disable the `Inspect Element` menu item. - - Default: [Only in development](https://github.com/sindresorhus/electron-is-dev) - */ - readonly showInspectElement?: boolean; - - /** - Show the system `Services` submenu on macOS. - - @default false - */ - readonly showServices?: boolean; - - /** - Override labels for the default menu items. Useful for i18n. - - The placeholder `{selection}` may be used in any label, and will be replaced by the currently selected text, trimmed to a maximum of 25 characters length. This is useful when localizing the `Look Up “{selection}”` menu item, but can also be used in custom menu items, for example, to implement a `Search Google for “{selection}”` menu item. If there is no selection, the `{selection}` placeholder will be replaced by an empty string. Normally this placeholder is only useful for menu items which will only be shown when there is text selected. This can be checked using `visible: parameters.selectionText.trim().length > 0` when implementing a custom menu item. - - @default {} - - @example - ``` - { - labels: { - copy: 'Configured Copy', - saveImageAs: 'Configured Save Image As…' - } + @example + ``` + { + labels: { + copy: 'Configured Copy', + saveImageAs: 'Configured Save Image As…' } - ``` - */ - readonly labels?: Labels; - - /** - Determines whether or not to show the menu. - Can be useful if you for example have other code presenting a context menu in some contexts. - - @example - ``` - { - // Doesn't show the menu if the element is editable - shouldShowMenu: (event, parameters) => !parameters.isEditable - } - ``` - */ - readonly shouldShowMenu?: ( - event: ElectronEvent, - parameters: ContextMenuParams - ) => boolean; - - /** - This option lets you manually pick what menu items to include. It's meant for advanced needs. The default menu with the other options should be enough for most use-cases, and it ensures correct behavior, for example, correct order of menu items. So prefer the `append` and `prepend` option instead of `menu` whenever possible. - - The function passed to this option is expected to return an array of [`MenuItem` constructor options](https://electronjs.org/docs/api/menu-item/). - - The first argument the function receives is an array of default actions that can be used. These actions are functions that can take an object with a transform property (except for `separator` and `inspect`). The transform function will be passed the content of the action and can modify it if needed. If you use `transform` on `cut`, `copy`, or `paste`, they will convert rich text to plain text. - The second argument is [this `parameters` object](https://electronjs.org/docs/api/web-contents/#event-context-menu). - The third argument is the [BrowserWindow](https://electronjs.org/docs/api/browser-window/) the context menu was requested for. - The fourth argument is an Array of menu items for dictionary suggestions. This should be used if you wish to implement spellcheck in your custom menu. - The last argument is the event object passed to the `context-menu` event in web contents. - - Even though you include an action, it will still only be shown/enabled when appropriate. For example, the `saveImage` action is only shown when right-clicking an image. - - `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in `options.labels`. - - The following options are ignored when `menu` is used: - - - `showLearnSpelling` - - `showLookUpSelection` - - `showSearchWithGoogle` - - `showSelectAll` - - `showCopyImage` - - `showCopyImageAddress` - - `showSaveImageAs` - - `showCopyVideoAddress` - - `showSaveVideo` - - `showSaveVideoAs` - - `showCopyLink` - - `showSaveLinkAs` - - `showInspectElement` - - `showServices` - - To get spellchecking, “Correct Automatically”, and “Learn Spelling” in the menu, please enable the `spellcheck` preference in browser window: `new BrowserWindow({webPreferences: {spellcheck: true}})` - - @default [...dictionarySuggestions, defaultActions.separator(), defaultActions.separator(), defaultActions.learnSpelling(), defaultActions.separator(), defaultActions.lookUpSelection(), defaultActions.separator(),defaultActions.searchWithGoogle(), defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), defaultActions.selectAll(), defaultActions.separator(), defaultActions.saveImage(), defaultActions.saveImageAs(), defaultActions.saveVideo(), defaultActions.saveVideoAs(), defaultActions.copyLink(), defaultActions.copyImage(), defaultActions.copyImageAddress(), defaultActions.separator(), defaultActions.copyLink(), defaultActions.saveLinkAs(), defaultActions.separator(), defaultActions.inspect()] - */ - readonly menu?: ( - defaultActions: Actions, - parameters: ContextMenuParams, - browserWindow: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents, - dictionarySuggestions: MenuItemConstructorOptions[], - event: ElectronEvent - ) => MenuItemConstructorOptions[]; - - /** - Called when the context menu is shown. - */ - readonly onShow?: (event: ElectronEvent) => void; - - /** - Called when the context menu is closed. - */ - readonly onClose?: (event: ElectronEvent) => void; } -} + ``` + */ + readonly labels?: Labels; + + /** + Determines whether or not to show the menu. + Can be useful if you for example have other code presenting a context menu in some contexts. + + @example + ``` + { + // Doesn't show the menu if the element is editable + shouldShowMenu: (event, parameters) => !parameters.isEditable + } + ``` + */ + readonly shouldShowMenu?: ( + event: ElectronEvent, + parameters: ContextMenuParams + ) => boolean; + + /** + This option lets you manually pick what menu items to include. It's meant for advanced needs. The default menu with the other options should be enough for most use-cases, and it ensures correct behavior, for example, correct order of menu items. So prefer the `append` and `prepend` option instead of `menu` whenever possible. + + The function passed to this option is expected to return an array of [`MenuItem` constructor options](https://electronjs.org/docs/api/menu-item/). + + The first argument the function receives is an array of default actions that can be used. These actions are functions that can take an object with a transform property (except for `separator` and `inspect`). The transform function will be passed the content of the action and can modify it if needed. If you use `transform` on `cut`, `copy`, or `paste`, they will convert rich text to plain text. + The second argument is [this `parameters` object](https://electronjs.org/docs/api/web-contents/#event-context-menu). + The third argument is the [BrowserWindow](https://electronjs.org/docs/api/browser-window/) the context menu was requested for. + The fourth argument is an Array of menu items for dictionary suggestions. This should be used if you wish to implement spellcheck in your custom menu. + The last argument is the event object passed to the `context-menu` event in web contents. + + Even though you include an action, it will still only be shown/enabled when appropriate. For example, the `saveImage` action is only shown when right-clicking an image. + + `MenuItem` labels may contain the placeholder `{selection}` which will be replaced by the currently selected text as described in `options.labels`. + + The following options are ignored when `menu` is used: + + - `showLearnSpelling` + - `showLookUpSelection` + - `showSearchWithGoogle` + - `showSelectAll` + - `showCopyImage` + - `showCopyImageAddress` + - `showSaveImageAs` + - `showCopyVideoAddress` + - `showSaveVideo` + - `showSaveVideoAs` + - `showCopyLink` + - `showSaveLinkAs` + - `showInspectElement` + - `showServices` + + To get spellchecking, “Correct Automatically”, and “Learn Spelling” in the menu, please enable the `spellcheck` preference in browser window: `new BrowserWindow({webPreferences: {spellcheck: true}})` + + @default [...dictionarySuggestions, defaultActions.separator(), defaultActions.separator(), defaultActions.learnSpelling(), defaultActions.separator(), defaultActions.lookUpSelection(), defaultActions.separator(),defaultActions.searchWithGoogle(), defaultActions.cut(), defaultActions.copy(), defaultActions.paste(), defaultActions.selectAll(), defaultActions.separator(), defaultActions.saveImage(), defaultActions.saveImageAs(), defaultActions.saveVideo(), defaultActions.saveVideoAs(), defaultActions.copyLink(), defaultActions.copyImage(), defaultActions.copyImageAddress(), defaultActions.separator(), defaultActions.copyLink(), defaultActions.saveLinkAs(), defaultActions.separator(), defaultActions.inspect()] + */ + readonly menu?: ( + defaultActions: Actions, + parameters: ContextMenuParams, + browserWindow: BrowserWindow | BrowserView | Electron.WebviewTag | WebContents, + dictionarySuggestions: MenuItemConstructorOptions[], + event: ElectronEvent + ) => MenuItemConstructorOptions[]; + + /** + Called when the context menu is shown. + */ + readonly onShow?: (event: ElectronEvent) => void; + + /** + Called when the context menu is closed. + */ + readonly onClose?: (event: ElectronEvent) => void; +}; /** This module gives you a nice extensible context menu with items like `Cut`/`Copy`/`Paste` for text, `Save Image` for images, and `Copy Link` for links. It also adds an `Inspect Element` menu item when in development to quickly view items in the inspector like in Chrome. @@ -368,8 +366,8 @@ You can use this module directly in both the main and renderer process. @example ``` -import {app, BrowserWindow} = require('electron'); -import contextMenu = require('electron-context-menu'); +import {app, BrowserWindow} from 'electron'; +import contextMenu from 'electron-context-menu'; contextMenu({ showSaveImageAs: true @@ -389,8 +387,8 @@ let mainWindow; @example ``` -import {app, BrowserWindow} = require('electron'); -import contextMenu = require('electron-context-menu'); +import {app, BrowserWindow} from 'electron'; +import contextMenu from 'electron-context-menu'; contextMenu({ prepend: (defaultActions, parameters, browserWindow) => [ @@ -431,6 +429,4 @@ const dispose = contextMenu(); dispose(); ``` */ -declare function contextMenu(options?: contextMenu.Options): () => void; // eslint-disable-line no-redeclare - -export = contextMenu; +export default function contextMenu(options?: Options): () => void; diff --git a/index.js b/index.js index 685277d..4c9919a 100644 --- a/index.js +++ b/index.js @@ -1,19 +1,17 @@ -'use strict'; -const electron = require('electron'); -const cliTruncate = require('cli-truncate'); -const {download} = require('electron-dl'); -const isDev = require('electron-is-dev'); - -const webContents = win => win.webContents || (win.id && win); - -const decorateMenuItem = menuItem => { - return (options = {}) => { - if (options.transform && !options.click) { - menuItem.transform = options.transform; - } +import process from 'node:process'; +import electron from 'electron'; +import cliTruncate from 'cli-truncate'; +import {download} from 'electron-dl'; +import isDev from 'electron-is-dev'; - return menuItem; - }; +const webContents = win => win.webContents ?? (win.id && win); + +const decorateMenuItem = menuItem => (options = {}) => { + if (options.transform && !options.click) { + menuItem.transform = options.transform; + } + + return menuItem; }; const removeUnusedMenuItems = menuTemplate => { @@ -29,14 +27,14 @@ const removeUnusedMenuItems = menuTemplate => { }; const create = (win, options) => { - const handleContextMenu = (event, props) => { - if (typeof options.shouldShowMenu === 'function' && options.shouldShowMenu(event, props) === false) { + const handleContextMenu = (event, properties) => { + if (typeof options.shouldShowMenu === 'function' && options.shouldShowMenu(event, properties) === false) { return; } - const {editFlags} = props; - const hasText = props.selectionText.length > 0; - const isLink = Boolean(props.linkURL); + const {editFlags} = properties; + const hasText = properties.selectionText.length > 0; + const isLink = Boolean(properties.linkURL); const can = type => editFlags[`can${type}`] && hasText; const defaultActions = { @@ -44,11 +42,11 @@ const create = (win, options) => { learnSpelling: decorateMenuItem({ id: 'learnSpelling', label: '&Learn Spelling', - visible: Boolean(props.isEditable && hasText && props.misspelledWord), + visible: Boolean(properties.isEditable && hasText && properties.misspelledWord), click() { const target = webContents(win); - target.session.addWordToSpellCheckerDictionary(props.misspelledWord); - } + target.session.addWordToSpellCheckerDictionary(properties.misspelledWord); + }, }), lookUpSelection: decorateMenuItem({ id: 'lookUpSelection', @@ -58,7 +56,7 @@ const create = (win, options) => { if (process.platform === 'darwin') { webContents(win).showDefinitionForSelection(); } - } + }, }), searchWithGoogle: decorateMenuItem({ id: 'searchWithGoogle', @@ -66,175 +64,175 @@ const create = (win, options) => { visible: hasText, click() { const url = new URL('https://www.google.com/search'); - url.searchParams.set('q', props.selectionText); + url.searchParams.set('q', properties.selectionText); electron.shell.openExternal(url.toString()); - } + }, }), cut: decorateMenuItem({ id: 'cut', label: 'Cu&t', enabled: can('Cut'), - visible: props.isEditable, + visible: properties.isEditable, click(menuItem) { const target = webContents(win); if (!menuItem.transform && target) { target.cut(); } else { - props.selectionText = menuItem.transform ? menuItem.transform(props.selectionText) : props.selectionText; - electron.clipboard.writeText(props.selectionText); + properties.selectionText = menuItem.transform ? menuItem.transform(properties.selectionText) : properties.selectionText; + electron.clipboard.writeText(properties.selectionText); } - } + }, }), copy: decorateMenuItem({ id: 'copy', label: '&Copy', enabled: can('Copy'), - visible: props.isEditable || hasText, + visible: properties.isEditable || hasText, click(menuItem) { const target = webContents(win); if (!menuItem.transform && target) { target.copy(); } else { - props.selectionText = menuItem.transform ? menuItem.transform(props.selectionText) : props.selectionText; - electron.clipboard.writeText(props.selectionText); + properties.selectionText = menuItem.transform ? menuItem.transform(properties.selectionText) : properties.selectionText; + electron.clipboard.writeText(properties.selectionText); } - } + }, }), paste: decorateMenuItem({ id: 'paste', label: '&Paste', enabled: editFlags.canPaste, - visible: props.isEditable, + visible: properties.isEditable, click(menuItem) { const target = webContents(win); if (menuItem.transform) { - let clipboardContent = electron.clipboard.readText(props.selectionText); + let clipboardContent = electron.clipboard.readText(properties.selectionText); clipboardContent = menuItem.transform ? menuItem.transform(clipboardContent) : clipboardContent; target.insertText(clipboardContent); } else { target.paste(); } - } + }, }), selectAll: decorateMenuItem({ id: 'selectAll', label: 'Select &All', click() { webContents(win).selectAll(); - } + }, }), saveImage: decorateMenuItem({ id: 'saveImage', label: 'Save I&mage', - visible: props.mediaType === 'image', + visible: properties.mediaType === 'image', click(menuItem) { - props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; - download(win, props.srcURL); - } + properties.srcURL = menuItem.transform ? menuItem.transform(properties.srcURL) : properties.srcURL; + download(win, properties.srcURL); + }, }), saveImageAs: decorateMenuItem({ id: 'saveImageAs', label: 'Sa&ve Image As…', - visible: props.mediaType === 'image', + visible: properties.mediaType === 'image', click(menuItem) { - props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; - download(win, props.srcURL, {saveAs: true}); - } + properties.srcURL = menuItem.transform ? menuItem.transform(properties.srcURL) : properties.srcURL; + download(win, properties.srcURL, {saveAs: true}); + }, }), saveVideo: decorateMenuItem({ id: 'saveVideo', label: 'Save Vide&o', - visible: props.mediaType === 'video', + visible: properties.mediaType === 'video', click(menuItem) { - props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; - download(win, props.srcURL); - } + properties.srcURL = menuItem.transform ? menuItem.transform(properties.srcURL) : properties.srcURL; + download(win, properties.srcURL); + }, }), saveVideoAs: decorateMenuItem({ id: 'saveVideoAs', label: 'Save Video& As…', - visible: props.mediaType === 'video', + visible: properties.mediaType === 'video', click(menuItem) { - props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; - download(win, props.srcURL, {saveAs: true}); - } + properties.srcURL = menuItem.transform ? menuItem.transform(properties.srcURL) : properties.srcURL; + download(win, properties.srcURL, {saveAs: true}); + }, }), copyLink: decorateMenuItem({ id: 'copyLink', label: 'Copy Lin&k', - visible: props.linkURL.length > 0 && props.mediaType === 'none', + visible: properties.linkURL.length > 0 && properties.mediaType === 'none', click(menuItem) { - props.linkURL = menuItem.transform ? menuItem.transform(props.linkURL) : props.linkURL; + properties.linkURL = menuItem.transform ? menuItem.transform(properties.linkURL) : properties.linkURL; electron.clipboard.write({ - bookmark: props.linkText, - text: props.linkURL + bookmark: properties.linkText, + text: properties.linkURL, }); - } + }, }), saveLinkAs: decorateMenuItem({ id: 'saveLinkAs', label: 'Save Link As…', - visible: props.linkURL.length > 0 && props.mediaType === 'none', + visible: properties.linkURL.length > 0 && properties.mediaType === 'none', click(menuItem) { - props.linkURL = menuItem.transform ? menuItem.transform(props.linkURL) : props.linkURL; - download(win, props.linkURL, {saveAs: true}); - } + properties.linkURL = menuItem.transform ? menuItem.transform(properties.linkURL) : properties.linkURL; + download(win, properties.linkURL, {saveAs: true}); + }, }), copyImage: decorateMenuItem({ id: 'copyImage', label: 'Cop&y Image', - visible: props.mediaType === 'image', + visible: properties.mediaType === 'image', click() { - webContents(win).copyImageAt(props.x, props.y); - } + webContents(win).copyImageAt(properties.x, properties.y); + }, }), copyImageAddress: decorateMenuItem({ id: 'copyImageAddress', label: 'C&opy Image Address', - visible: props.mediaType === 'image', + visible: properties.mediaType === 'image', click(menuItem) { - props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; + properties.srcURL = menuItem.transform ? menuItem.transform(properties.srcURL) : properties.srcURL; electron.clipboard.write({ - bookmark: props.srcURL, - text: props.srcURL + bookmark: properties.srcURL, + text: properties.srcURL, }); - } + }, }), copyVideoAddress: decorateMenuItem({ id: 'copyVideoAddress', label: 'Copy Video Ad&dress', - visible: props.mediaType === 'video', + visible: properties.mediaType === 'video', click(menuItem) { - props.srcURL = menuItem.transform ? menuItem.transform(props.srcURL) : props.srcURL; + properties.srcURL = menuItem.transform ? menuItem.transform(properties.srcURL) : properties.srcURL; electron.clipboard.write({ - bookmark: props.srcURL, - text: props.srcURL + bookmark: properties.srcURL, + text: properties.srcURL, }); - } + }, }), inspect: () => ({ id: 'inspect', label: 'I&nspect Element', click() { - webContents(win).inspectElement(props.x, props.y); + webContents(win).inspectElement(properties.x, properties.y); if (webContents(win).isDevToolsOpened()) { webContents(win).devToolsWebContents.focus(); } - } + }, }), services: () => ({ id: 'services', label: 'Services', role: 'services', - visible: process.platform === 'darwin' && (props.isEditable || hasText) - }) + visible: process.platform === 'darwin' && (properties.isEditable || hasText), + }), }; const shouldShowInspectElement = typeof options.showInspectElement === 'boolean' ? options.showInspectElement : isDev; @@ -244,25 +242,25 @@ const create = (win, options) => { return { id: 'dictionarySuggestions', label: suggestion, - visible: Boolean(props.isEditable && hasText && props.misspelledWord), + visible: Boolean(properties.isEditable && hasText && properties.misspelledWord), click(menuItem) { const target = webContents(win); target.replaceMisspelling(menuItem.label); - } + }, }; } let dictionarySuggestions = []; - if (hasText && props.misspelledWord && props.dictionarySuggestions.length > 0) { - dictionarySuggestions = props.dictionarySuggestions.map(suggestion => word(suggestion)); + if (hasText && properties.misspelledWord && properties.dictionarySuggestions.length > 0) { + dictionarySuggestions = properties.dictionarySuggestions.map(suggestion => word(suggestion)); } else { dictionarySuggestions.push( { id: 'dictionarySuggestions', label: 'No Guesses Found', - visible: Boolean(hasText && props.misspelledWord), - enabled: false - } + visible: Boolean(hasText && properties.misspelledWord), + enabled: false, + }, ); } @@ -294,15 +292,15 @@ const create = (win, options) => { defaultActions.separator(), shouldShowInspectElement && defaultActions.inspect(), options.showServices && defaultActions.services(), - defaultActions.separator() + defaultActions.separator(), ]; if (options.menu) { - menuTemplate = options.menu(defaultActions, props, win, dictionarySuggestions, event); + menuTemplate = options.menu(defaultActions, properties, win, dictionarySuggestions, event); } if (options.prepend) { - const result = options.prepend(defaultActions, props, win, event); + const result = options.prepend(defaultActions, properties, win, event); if (Array.isArray(result)) { menuTemplate.unshift(...result); @@ -310,7 +308,7 @@ const create = (win, options) => { } if (options.append) { - const result = options.append(defaultActions, props, win, event); + const result = options.append(defaultActions, properties, win, event); if (Array.isArray(result)) { menuTemplate.push(...result); @@ -329,8 +327,8 @@ const create = (win, options) => { // Replace placeholders in menu item labels if (typeof menuItem.label === 'string' && menuItem.label.includes('{selection}')) { - const selectionString = typeof props.selectionText === 'string' ? props.selectionText.trim() : ''; - menuItem.label = menuItem.label.replace('{selection}', cliTruncate(selectionString, 25).replace(/&/g, '&&')); + const selectionString = typeof properties.selectionText === 'string' ? properties.selectionText.trim() : ''; + menuItem.label = menuItem.label.replace('{selection}', cliTruncate(selectionString, 25).replaceAll('&', '&&')); } } @@ -360,7 +358,7 @@ const create = (win, options) => { }; }; -module.exports = (options = {}) => { +export default function contextMenu(options = {}) { if (process.type === 'renderer') { throw new Error('Cannot use electron-context-menu in the renderer process!'); } @@ -383,7 +381,7 @@ module.exports = (options = {}) => { } }; - if (typeof win.once !== 'undefined') { // Support for BrowserView + if (win.once !== undefined) { // Support for BrowserView win.once('closed', removeDisposable); } @@ -410,7 +408,7 @@ module.exports = (options = {}) => { init(win); }; - const listenerFunction = win.addEventListener || win.addListener; + const listenerFunction = win.addEventListener ?? win.addListener; listenerFunction('dom-ready', onDomReady, {once: true}); disposables.push(() => { @@ -439,4 +437,4 @@ module.exports = (options = {}) => { }); return dispose; -}; +} diff --git a/index.test-d.ts b/index.test-d.ts deleted file mode 100644 index 82fcd0a..0000000 --- a/index.test-d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import {expectType} from 'tsd'; -import {app} from 'electron'; -import contextMenu = require('.'); - -expectType<() => void>(contextMenu()); - -contextMenu({ - append: () => [ - { - label: 'Unicorn', - enabled: false - } - ] -}); - -app.on('web-contents-created', (event, webContents) => { - contextMenu({ - prepend: (defaultActions, parameters) => [{ - label: 'Rainbow', - visible: parameters.mediaType === 'image' - }], - window: webContents - }); -}); diff --git a/package.json b/package.json index 812eeb2..bb19e46 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,18 @@ "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com" }, + "type": "module", + "exports": { + "types": "./index.d.ts", + "default": "./index.js" + }, + "sideEffects": false, + "engines": { + "node": ">=18" + }, "scripts": { "start": "electron fixtures/fixture.js", - "test": "xo && ava && tsd", + "test": "xo && ava && tsc index.d.ts", "start-fixture2": "electron fixtures/fixture-menu.js", "start-fixture3": "electron fixtures/fixture-toggle.js" }, @@ -40,29 +49,21 @@ "dictionary" ], "dependencies": { - "cli-truncate": "^2.1.0", - "electron-dl": "^3.2.1", - "electron-is-dev": "^2.0.0" + "cli-truncate": "^4.0.0", + "electron-dl": "^4.0.0", + "electron-is-dev": "^3.0.1" }, "devDependencies": { - "@types/node": "^15.0.1", - "ava": "^2.4.0", - "electron": "^12.0.6", - "tsd": "^0.14.0", - "xo": "^0.39.1" + "@types/node": "^20.12.7", + "ava": "^6.1.2", + "electron": "^30.0.1", + "typescript": "^5.4.5", + "xo": "^0.58.0" }, "xo": { "envs": [ "node", "browser" ] - }, - "tsd": { - "compilerOptions": { - "lib": [ - "es2019", - "dom" - ] - } } } diff --git a/readme.md b/readme.md index dd92ed8..8020ea5 100644 --- a/readme.md +++ b/readme.md @@ -10,17 +10,17 @@ This package can only be used in the main process. ## Install -``` -$ npm install electron-context-menu +```sh +npm install electron-context-menu ``` -*Requires Electron 10 or later.* +*Requires Electron 30 or later.* ## Usage ```js -const {app, BrowserWindow} = require('electron'); -const contextMenu = require('electron-context-menu'); +import {app, BrowserWindow} from 'electron'; +import contextMenu from 'electron-context-menu'; contextMenu({ showSaveImageAs: true @@ -37,8 +37,8 @@ let mainWindow; Advanced example: ```js -const {app, BrowserWindow, shell} = require('electron'); -const contextMenu = require('electron-context-menu'); +import {app, BrowserWindow, shell} from 'electron'; +import contextMenu from 'electron-context-menu'; contextMenu({ prepend: (defaultActions, parameters, browserWindow) => [ @@ -96,7 +96,7 @@ When not specified, the context menu will be added to all existing and new windo Type: `Function` -Should return an array of [MenuItem](https://electronjs.org/docs/api/menu-item/)'s to be prepended to the context menu. +Should return an array of [`MenuItem`](https://electronjs.org/docs/api/menu-item/)'s to be prepended to the context menu. The first argument is an array of default actions that can be used. The second argument is [this `parameters` object](https://electronjs.org/docs/api/web-contents/#event-context-menu). The third argument is the [BrowserWindow](https://electronjs.org/docs/api/browser-window/) the context menu was requested for. The fourth argument is the context menu event. @@ -106,7 +106,7 @@ The first argument is an array of default actions that can be used. The second a Type: `Function` -Should return an array of [MenuItem](https://electronjs.org/docs/api/menu-item/)'s to be appended to the context menu. +Should return an array of [`MenuItem`](https://electronjs.org/docs/api/menu-item/)'s to be appended to the context menu. The first argument is an array of default actions that can be used. The second argument is [this `parameters` object](https://electronjs.org/docs/api/web-contents/#event-context-menu). The third argument is the [BrowserWindow](https://electronjs.org/docs/api/browser-window/) the context menu was requested for. The fourth argument is the context menu event. @@ -361,7 +361,7 @@ The function receives an [`Event` object](https://developer.mozilla.org/en-US/do - [electron-util](https://github.com/sindresorhus/electron-util) - Useful utilities for developing Electron apps and modules - [electron-debug](https://github.com/sindresorhus/electron-debug) - Adds useful debug features to your Electron app -- [electron-store](https://github.com/sindresorhus/electron-store) - Save and load data like user preferences, app state, cache, etc +- [electron-store](https://github.com/sindresorhus/electron-store) - Save and load data like user settings, app state, cache, etc - [electron-reloader](https://github.com/sindresorhus/electron-reloader) - Simple auto-reloading for Electron apps during development - [electron-serve](https://github.com/sindresorhus/electron-serve) - Static file serving for Electron apps - [electron-unhandled](https://github.com/sindresorhus/electron-unhandled) - Catch unhandled errors and promise rejections in your Electron app diff --git a/test.js b/test.js index 3b9e94d..df3dbb1 100644 --- a/test.js +++ b/test.js @@ -1,3 +1,3 @@ import test from 'ava'; -test.todo('write tests with Spectron'); +test.todo('write proper tests'); From d48f868597a78b9faa51b3c48229466f22bfa913 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 1 May 2024 20:53:25 +0700 Subject: [PATCH 14/22] 4.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb19e46..bd8a4bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "3.6.1", + "version": "4.0.0", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From 3cfcb4b8b1142d2845224ca8e51ca85fe2659d37 Mon Sep 17 00:00:00 2001 From: Lynch Ye Date: Thu, 27 Jun 2024 07:30:39 +0800 Subject: [PATCH 15/22] Fix menu disposal (#180) --- index.js | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/index.js b/index.js index 4c9919a..aadfc6c 100644 --- a/index.js +++ b/index.js @@ -373,21 +373,14 @@ export default function contextMenu(options = {}) { const disposeMenu = create(win, options); - disposables.push(disposeMenu); - const removeDisposable = () => { - const index = disposables.indexOf(disposeMenu); - if (index !== -1) { - disposables.splice(index, 1); - } + const disposable = () => { + win.off('close', disposable); + disposeMenu(); }; if (win.once !== undefined) { // Support for BrowserView - win.once('closed', removeDisposable); + win.once('close', disposable); } - - disposables.push(() => { - win.off('closed', removeDisposable); - }); }; const dispose = () => { From 2193d7a6dbdd200b95b2389648d9ca85fee22752 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 27 Jun 2024 01:31:58 +0200 Subject: [PATCH 16/22] 4.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bd8a4bb..a7686be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "4.0.0", + "version": "4.0.1", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From a4be72ccadd24a2c4cf920f752dbcc49893f163d Mon Sep 17 00:00:00 2001 From: Lynch Ye Date: Fri, 23 Aug 2024 18:26:16 +0800 Subject: [PATCH 17/22] Fix clean up in the case of the window close event being prevented (#182) --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index aadfc6c..979b8a1 100644 --- a/index.js +++ b/index.js @@ -374,12 +374,12 @@ export default function contextMenu(options = {}) { const disposeMenu = create(win, options); const disposable = () => { - win.off('close', disposable); + win.webContents.off('destroyed', disposable); disposeMenu(); }; if (win.once !== undefined) { // Support for BrowserView - win.once('close', disposable); + win.webContents.once('destroyed', disposable); } }; From 125230e7a3489fb61eca6364efef90d35a279726 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 23 Aug 2024 17:27:49 +0700 Subject: [PATCH 18/22] 4.0.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a7686be..3fbad2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "4.0.1", + "version": "4.0.2", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From d2c3c7375fc51d636a536a98d80a3167da3d2200 Mon Sep 17 00:00:00 2001 From: Florent BENOIT Date: Wed, 28 Aug 2024 19:07:46 +0200 Subject: [PATCH 19/22] Fix cleaning up window (#183) --- index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.js b/index.js index 979b8a1..3393445 100644 --- a/index.js +++ b/index.js @@ -374,7 +374,6 @@ export default function contextMenu(options = {}) { const disposeMenu = create(win, options); const disposable = () => { - win.webContents.off('destroyed', disposable); disposeMenu(); }; From 691c307dcedd18f4c02dd385e98610c3a8d20dd1 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 29 Aug 2024 00:08:59 +0700 Subject: [PATCH 20/22] 4.0.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fbad2e..c63b573 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "4.0.2", + "version": "4.0.3", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu", From fe0e088eafdce8fb427f578edcc80d727b1a0412 Mon Sep 17 00:00:00 2001 From: Quang Lam Date: Thu, 29 Aug 2024 11:41:45 -0400 Subject: [PATCH 21/22] Fix the `window` option (#185) --- index.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/index.js b/index.js index 3393445..b10daea 100644 --- a/index.js +++ b/index.js @@ -377,9 +377,7 @@ export default function contextMenu(options = {}) { disposeMenu(); }; - if (win.once !== undefined) { // Support for BrowserView - win.webContents.once('destroyed', disposable); - } + webContents(win).once('destroyed', disposable); }; const dispose = () => { From 72da237f7bbc378a8e1918dd06f8b0438ea1aa86 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 29 Aug 2024 22:43:07 +0700 Subject: [PATCH 22/22] 4.0.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c63b573..df49adb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "electron-context-menu", - "version": "4.0.3", + "version": "4.0.4", "description": "Context menu for your Electron app", "license": "MIT", "repository": "sindresorhus/electron-context-menu",