@@ -57,6 +57,7 @@ export class GmailElementReplacer extends WebmailElementReplacer {
5757 msgInnerText : 'table.cf.An' ,
5858 msgInnerContainingPgp : "div.a3s:not(.undefined):contains('" + PgpArmor . headers ( 'null' ) . begin + "')" ,
5959 msgActionsBtn : '.Wsq5Cf' ,
60+ msgActionsBtnExpanded : '.Wsq5Cf[aria-expanded="true"]' ,
6061 msgActionsMenu : '.tB5Jxf-M-S5Cmsd, ul.aqdrmf-Kf[role="menu"]' ,
6162 attachmentsContainerOuter : 'div.hq.gt' ,
6263 attachmentsContainerInner : 'div.aQH' ,
@@ -298,12 +299,18 @@ export class GmailElementReplacer extends WebmailElementReplacer {
298299 } ;
299300
300301 private addMenuButton = ( replyOption : ReplyOption , gmailContextMenuBtn : Element | null ) => {
301- if ( gmailContextMenuBtn && $ ( gmailContextMenuBtn ) . is ( ':visible' ) && ! document . querySelector ( `.action_${ replyOption . replace ( 'a_' , '' ) } _message_button` ) ) {
302- const button = $ ( this . factory . btnSecureMenuBtn ( replyOption ) ) . insertAfter ( gmailContextMenuBtn ) ; // xss-safe-factory
303- button . on (
304- 'click' ,
305- Ui . event . handle ( ( el , ev : JQuery . Event ) => this . actionActivateSecureReplyHandler ( el , ev ) )
306- ) ;
302+ if ( gmailContextMenuBtn && $ ( gmailContextMenuBtn ) . is ( ':visible' ) ) {
303+ const btnClass = `action_${ replyOption . replace ( 'a_' , '' ) } _message_button` ;
304+ // Check if button already exists in this specific menu (sibling of the target button)
305+ const alreadyExists = $ ( gmailContextMenuBtn ) . parent ( ) . find ( `.${ btnClass } ` ) . length > 0 ;
306+
307+ if ( ! alreadyExists ) {
308+ const button = $ ( this . factory . btnSecureMenuBtn ( replyOption ) ) . insertAfter ( gmailContextMenuBtn ) ; // xss-safe-factory
309+ button . on (
310+ 'click' ,
311+ Ui . event . handle ( ( el , ev : JQuery . Event ) => this . actionActivateSecureReplyHandler ( el , ev ) )
312+ ) ;
313+ }
307314 }
308315 } ;
309316
@@ -402,7 +409,7 @@ export class GmailElementReplacer extends WebmailElementReplacer {
402409 this . insertEncryptedReplyBox ( messageContainer , replyOption ) ;
403410 }
404411 if ( secureReplyInvokedFromMenu ) {
405- $ ( this . sel . msgActionsBtn ) . trigger ( 'click' ) ;
412+ $ ( this . sel . msgActionsBtnExpanded ) . trigger ( 'click' ) ;
406413 }
407414 } ;
408415
@@ -970,7 +977,25 @@ export class GmailElementReplacer extends WebmailElementReplacer {
970977 }
971978
972979 // Find the message container from the menu's position or context
973- const messageContainer = $ ( 'div.h7:visible' ) . last ( ) ; // Get the last visible message container
980+ let messageContainer ;
981+
982+ // Try to find the trigger button that opened this menu (it should have aria-expanded="true")
983+ const messageContainerSelector = 'div.h7:visible' ;
984+ const menuTrigger = document . querySelector ( this . sel . msgActionsBtnExpanded ) ;
985+
986+ if ( menuTrigger ) {
987+ if ( this . debug ) {
988+ console . debug ( 'addSecureActionsToMessageMenu found menu trigger:' , menuTrigger ) ;
989+ }
990+ messageContainer = $ ( menuTrigger ) . closest ( this . sel . msgOuter ) . closest ( messageContainerSelector ) ;
991+ if ( ! messageContainer . length ) {
992+ // Fallback
993+ messageContainer = $ ( messageContainerSelector ) . last ( ) ;
994+ }
995+ } else {
996+ messageContainer = $ ( messageContainerSelector ) . last ( ) ; // Get the last visible message container
997+ }
998+
974999 const msgIdElement = messageContainer . find ( '[data-legacy-message-id], [data-message-id]' ) ;
9751000 const msgId = msgIdElement . attr ( 'data-legacy-message-id' ) || msgIdElement . attr ( 'data-message-id' ) ;
9761001
0 commit comments