@@ -102,42 +102,59 @@ const isMatchingContextMenuRequest = (context, request) => {
102102 context . createdAt - request . requestedAt < 1000 ;
103103} ;
104104
105+ const NATIVE_TEXT_CONTEXT_MENU_ROLES = new Set ( [
106+ "undo" , "redo" , "cut" , "copy" , "paste" , "pasteAndMatchStyle" , "delete" , "selectAll" ,
107+ ] ) ;
108+
109+ const getNativeTextContextMenuItems = ( contents , request = { } , params ) => {
110+ const items = [ ] ;
111+ if ( ! Array . isArray ( request . items ) ) {
112+ return items ;
113+ }
114+ const misspelledWord = params ?. misspelledWord ;
115+ request . items . forEach ( ( item ) => {
116+ if ( ! item || typeof item !== "object" ) {
117+ return ;
118+ }
119+ if ( item . type === "addToDictionary" ) {
120+ if ( ! misspelledWord ) {
121+ return ;
122+ }
123+ ( params . dictionarySuggestions || [ ] ) . forEach ( ( suggestion ) => {
124+ items . push ( new MenuItem ( {
125+ label : suggestion ,
126+ click : ( ) => contents . replaceMisspelling ( suggestion ) ,
127+ } ) ) ;
128+ } ) ;
129+ items . push ( new MenuItem ( {
130+ label : item . label ,
131+ click : ( ) => {
132+ if ( ! contents . session . addWordToSpellCheckerDictionary ( misspelledWord ) ) {
133+ writeLog ( "failed to add word to spell checker dictionary" ) ;
134+ }
135+ } ,
136+ } ) , { type : "separator" } ) ;
137+ return ;
138+ }
139+ if ( item . type === "separator" ) {
140+ items . push ( { type : "separator" } ) ;
141+ return ;
142+ }
143+ if ( ! NATIVE_TEXT_CONTEXT_MENU_ROLES . has ( item . role ) ) {
144+ return ;
145+ }
146+ items . push ( new MenuItem ( {
147+ role : item . role ,
148+ label : item . label ,
149+ } ) ) ;
150+ } ) ;
151+ return items ;
152+ } ;
153+
105154const popupNativeTextContextMenu = ( contents , context , request ) => {
155+ request = request || { } ;
106156 const params = context ?. params ;
107- const template = [ ] ;
108- if ( params ?. misspelledWord ) {
109- params . dictionarySuggestions . forEach ( ( suggestion ) => {
110- template . push ( new MenuItem ( {
111- label : suggestion ,
112- click : ( ) => contents . replaceMisspelling ( suggestion ) ,
113- } ) ) ;
114- } ) ;
115- template . push ( new MenuItem ( {
116- label : request . addToDictionary ,
117- click : ( ) => {
118- if ( ! contents . session . addWordToSpellCheckerDictionary ( params . misspelledWord ) ) {
119- writeLog ( "failed to add word to spell checker dictionary" ) ;
120- }
121- } ,
122- } ) , { type : "separator" } ) ;
123- }
124- template . push ( new MenuItem ( {
125- role : "undo" , label : request . undo
126- } ) , new MenuItem ( {
127- role : "redo" , label : request . redo
128- } ) , { type : "separator" } , new MenuItem ( {
129- role : "copy" , label : request . copy
130- } ) , new MenuItem ( {
131- role : "cut" , label : request . cut
132- } ) , new MenuItem ( {
133- role : "delete" , label : request . delete
134- } ) , new MenuItem ( {
135- role : "paste" , label : request . paste
136- } ) , new MenuItem ( {
137- role : "pasteAndMatchStyle" , label : request . pasteAsPlainText
138- } ) , new MenuItem ( {
139- role : "selectAll" , label : request . selectAll
140- } ) ) ;
157+ const template = getNativeTextContextMenuItems ( contents , request , params ) ;
141158 const menu = Menu . buildFromTemplate ( template ) ;
142159 const options = {
143160 window : BrowserWindow . fromWebContents ( contents ) ,
0 commit comments