@@ -82,9 +82,10 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
82
82
Collections .unmodifiableSet (CollectionUtil .newHashSet (
83
83
ChromeContextMenuItem .COPY_LINK_ADDRESS , ChromeContextMenuItem .CALL ,
84
84
ChromeContextMenuItem .SEND_MESSAGE , ChromeContextMenuItem .ADD_TO_CONTACTS ,
85
- ChromeContextMenuItem .COPY , ChromeContextMenuItem .LOAD_ORIGINAL_IMAGE ,
86
- ChromeContextMenuItem .SAVE_LINK_AS , ChromeContextMenuItem .SAVE_IMAGE ,
87
- SHARE_IMAGE , ChromeContextMenuItem .SAVE_VIDEO , SHARE_LINK ));
85
+ ChromeContextMenuItem .COPY , ChromeContextMenuItem .COPY_LINK_TEXT ,
86
+ ChromeContextMenuItem .LOAD_ORIGINAL_IMAGE , ChromeContextMenuItem .SAVE_LINK_AS ,
87
+ ChromeContextMenuItem .SAVE_IMAGE , SHARE_IMAGE , ChromeContextMenuItem .SAVE_VIDEO ,
88
+ SHARE_LINK ));
88
89
89
90
// Items that are included for normal Chrome browser mode.
90
91
private static final Set <? extends ContextMenuItem > NORMAL_MODE_WHITELIST =
@@ -118,8 +119,9 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
118
119
private static final List <? extends ContextMenuItem > LINK_GROUP = Collections .unmodifiableList (
119
120
CollectionUtil .newArrayList (ChromeContextMenuItem .OPEN_IN_OTHER_WINDOW ,
120
121
ChromeContextMenuItem .OPEN_IN_NEW_TAB ,
121
- ChromeContextMenuItem .OPEN_IN_INCOGNITO_TAB , ChromeContextMenuItem .SAVE_LINK_AS ,
122
- ChromeContextMenuItem .COPY_LINK_ADDRESS , SHARE_LINK ));
122
+ ChromeContextMenuItem .OPEN_IN_INCOGNITO_TAB ,
123
+ ChromeContextMenuItem .COPY_LINK_ADDRESS , ChromeContextMenuItem .COPY_LINK_TEXT ,
124
+ ChromeContextMenuItem .SAVE_LINK_AS , SHARE_LINK ));
123
125
124
126
private static final List <? extends ContextMenuItem > IMAGE_GROUP =
125
127
Collections .unmodifiableList (CollectionUtil .newArrayList (
@@ -147,6 +149,7 @@ static class ContextMenuUma {
147
149
static final int ACTION_OPEN_IN_INCOGNITO_TAB = 1 ;
148
150
static final int ACTION_COPY_LINK_ADDRESS = 2 ;
149
151
static final int ACTION_COPY_EMAIL_ADDRESS = 3 ;
152
+ static final int ACTION_COPY_LINK_TEXT = 4 ;
150
153
static final int ACTION_SAVE_LINK = 5 ;
151
154
static final int ACTION_SAVE_IMAGE = 6 ;
152
155
static final int ACTION_OPEN_IMAGE = 7 ;
@@ -295,6 +298,7 @@ public List<Pair<Integer, List<ContextMenuItem>>> buildContextMenu(
295
298
}
296
299
} else {
297
300
supportedOptions .add (ChromeContextMenuItem .COPY_LINK_ADDRESS );
301
+ supportedOptions .add (ChromeContextMenuItem .COPY_LINK_TEXT );
298
302
supportedOptions .add (ChromeContextMenuItem .COPY );
299
303
}
300
304
@@ -375,6 +379,7 @@ public List<Pair<Integer, List<ContextMenuItem>>> buildContextMenu(
375
379
}
376
380
}
377
381
}
382
+
378
383
return groupedItems ;
379
384
}
380
385
@@ -460,6 +465,10 @@ private Set<ContextMenuItem> getDisabledOptions(ContextMenuParams params) {
460
465
disabledOptions .add (ChromeContextMenuItem .OPEN_IN_INCOGNITO_TAB );
461
466
}
462
467
468
+ if (params .getLinkText ().trim ().isEmpty () || params .isImage ()) {
469
+ disabledOptions .add (ChromeContextMenuItem .COPY_LINK_TEXT );
470
+ }
471
+
463
472
if (params .isAnchor () && !isAcceptedScheme (params .getLinkUrl ())) {
464
473
disabledOptions .add (ChromeContextMenuItem .OPEN_IN_OTHER_WINDOW );
465
474
disabledOptions .add (ChromeContextMenuItem .OPEN_IN_NEW_TAB );
@@ -473,6 +482,7 @@ private Set<ContextMenuItem> getDisabledOptions(ContextMenuParams params) {
473
482
}
474
483
475
484
if (MailTo .isMailTo (params .getLinkUrl ())) {
485
+ disabledOptions .add (ChromeContextMenuItem .COPY_LINK_TEXT );
476
486
disabledOptions .add (ChromeContextMenuItem .COPY_LINK_ADDRESS );
477
487
if (!mDelegate .supportsSendEmailMessage ()) {
478
488
disabledOptions .add (ChromeContextMenuItem .SEND_MESSAGE );
@@ -483,6 +493,7 @@ private Set<ContextMenuItem> getDisabledOptions(ContextMenuParams params) {
483
493
}
484
494
disabledOptions .add (ChromeContextMenuItem .CALL );
485
495
} else if (UrlUtilities .isTelScheme (params .getLinkUrl ())) {
496
+ disabledOptions .add (ChromeContextMenuItem .COPY_LINK_TEXT );
486
497
disabledOptions .add (ChromeContextMenuItem .COPY_LINK_ADDRESS );
487
498
if (!mDelegate .supportsCall ()) {
488
499
disabledOptions .add (ChromeContextMenuItem .CALL );
@@ -559,6 +570,10 @@ private Set<ContextMenuItem> getDisabledOptions(ContextMenuParams params) {
559
570
}
560
571
}
561
572
573
+ if (ChromeFeatureList .isEnabled (ChromeFeatureList .CUSTOM_CONTEXT_MENU )) {
574
+ disabledOptions .add (ChromeContextMenuItem .COPY_LINK_TEXT );
575
+ }
576
+
562
577
return disabledOptions ;
563
578
}
564
579
@@ -616,6 +631,10 @@ public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams params
616
631
mDelegate .onSaveToClipboard (UrlUtilities .getTelNumber (params .getLinkUrl ()),
617
632
ContextMenuItemDelegate .CLIPBOARD_TYPE_LINK_URL );
618
633
}
634
+ } else if (itemId == R .id .contextmenu_copy_link_text ) {
635
+ ContextMenuUma .record (params , ContextMenuUma .ACTION_COPY_LINK_TEXT );
636
+ mDelegate .onSaveToClipboard (
637
+ params .getLinkText (), ContextMenuItemDelegate .CLIPBOARD_TYPE_LINK_TEXT );
619
638
} else if (itemId == R .id .contextmenu_save_image ) {
620
639
ContextMenuUma .record (params , ContextMenuUma .ACTION_SAVE_IMAGE );
621
640
if (mDelegate .startDownload (params .getSrcUrl (), false )) {
@@ -663,6 +682,7 @@ public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams params
663
682
} else {
664
683
assert false ;
665
684
}
685
+
666
686
return true ;
667
687
}
668
688
0 commit comments