Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java

Issue 2710833002: Refactor ChromeContextMenuPopulator population (Closed)
Patch Set: Fixed based off rebase + tedchoc comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser.contextmenu; 5 package org.chromium.chrome.browser.contextmenu;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.net.MailTo; 8 import android.net.MailTo;
9 import android.support.annotation.IntDef; 9 import android.support.annotation.IntDef;
10 import android.text.TextUtils; 10 import android.text.TextUtils;
11 import android.view.ContextMenu; 11 import android.view.ContextMenu;
12 import android.view.MenuInflater; 12 import android.view.MenuInflater;
13 import android.view.MenuItem; 13 import android.view.MenuItem;
14 import android.webkit.MimeTypeMap; 14 import android.webkit.MimeTypeMap;
15 15
16 import org.chromium.base.metrics.RecordHistogram; 16 import org.chromium.base.metrics.RecordHistogram;
17 import org.chromium.chrome.R; 17 import org.chromium.chrome.R;
18 import org.chromium.chrome.browser.UrlConstants; 18 import org.chromium.chrome.browser.UrlConstants;
19 import org.chromium.chrome.browser.firstrun.FirstRunStatus; 19 import org.chromium.chrome.browser.firstrun.FirstRunStatus;
20 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; 20 import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
21 import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxyU ma; 21 import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxyU ma;
22 import org.chromium.chrome.browser.search_engines.TemplateUrlService; 22 import org.chromium.chrome.browser.search_engines.TemplateUrlService;
23 import org.chromium.chrome.browser.util.UrlUtilities; 23 import org.chromium.chrome.browser.util.UrlUtilities;
24 24
25 import java.lang.annotation.Retention; 25 import java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy; 26 import java.lang.annotation.RetentionPolicy;
27 import java.util.Arrays; 27 import java.util.Arrays;
28 import java.util.Collections;
29 import java.util.HashSet;
30 import java.util.Iterator;
31 import java.util.Set;
28 32
29 /** 33 /**
30 * A {@link ContextMenuPopulator} used for showing the default Chrome context me nu. 34 * A {@link ContextMenuPopulator} used for showing the default Chrome context me nu.
31 */ 35 */
32 public class ChromeContextMenuPopulator implements ContextMenuPopulator { 36 public class ChromeContextMenuPopulator implements ContextMenuPopulator {
33 37
34 private static final String TAG = "CCMenuPopulator"; 38 private static final String TAG = "CCMenuPopulator";
35 39
36 /** 40 /**
37 * Defines the context menu modes 41 * Defines the context menu modes
38 */ 42 */
39 @Retention(RetentionPolicy.SOURCE) 43 @Retention(RetentionPolicy.SOURCE)
40 @IntDef({ 44 @IntDef({
41 NORMAL_MODE, /* Default mode */ 45 NORMAL_MODE, /* Default mode */
42 CUSTOM_TAB_MODE, /* Custom tab mode */ 46 CUSTOM_TAB_MODE, /* Custom tab mode */
43 FULLSCREEN_TAB_MODE /* Full screen mode */ 47 FULLSCREEN_TAB_MODE /* Full screen mode */
44 }) 48 })
45 public @interface ContextMenuMode {} 49 public @interface ContextMenuMode {}
46 50
47 public static final int NORMAL_MODE = 0; 51 public static final int NORMAL_MODE = 0;
48 public static final int CUSTOM_TAB_MODE = 1; 52 public static final int CUSTOM_TAB_MODE = 1;
49 public static final int FULLSCREEN_TAB_MODE = 2; 53 public static final int FULLSCREEN_TAB_MODE = 2;
50 54
51 // Items that are included in all context menus. 55 // Items that are included in all context menus.
52 private static final int[] BASE_WHITELIST = { 56 private static final Integer[] BASE_WHITELIST = {
JJ 2017/03/01 01:41:04 cl format would not letup about changing this from
53 R.id.contextmenu_copy_link_address, 57 R.id.contextmenu_copy_link_address, R.id.contextmenu_call,
54 R.id.contextmenu_call, 58 R.id.contextmenu_send_message, R.id.contextmenu_add_to_contacts, R.i d.contextmenu_copy,
55 R.id.contextmenu_send_message, 59 R.id.contextmenu_copy_link_text, R.id.contextmenu_load_original_imag e,
56 R.id.contextmenu_add_to_contacts, 60 R.id.contextmenu_save_link_as, R.id.contextmenu_save_image,
57 R.id.contextmenu_copy, 61 R.id.contextmenu_share_image, R.id.contextmenu_save_video,
58 R.id.contextmenu_copy_link_text,
59 R.id.contextmenu_load_original_image,
60 R.id.contextmenu_save_link_as,
61 R.id.contextmenu_save_image,
62 R.id.contextmenu_share_image,
63 R.id.contextmenu_save_video,
64 }; 62 };
65 63
66 // Items that are included for normal Chrome browser mode. 64 // Items that are included for normal Chrome browser mode.
67 private static final int[] NORMAL_MODE_WHITELIST = { 65 private static final Integer[] NORMAL_MODE_WHITELIST = {
68 R.id.contextmenu_open_in_new_tab, 66 R.id.contextmenu_open_in_new_tab, R.id.contextmenu_open_in_other_win dow,
69 R.id.contextmenu_open_in_other_window, 67 R.id.contextmenu_open_in_incognito_tab, R.id.contextmenu_save_link_a s,
70 R.id.contextmenu_open_in_incognito_tab, 68 R.id.contextmenu_open_image_in_new_tab, R.id.contextmenu_search_by_i mage,
71 R.id.contextmenu_save_link_as,
72 R.id.contextmenu_open_image_in_new_tab,
73 R.id.contextmenu_search_by_image,
74 }; 69 };
75 70
76 // Additional items for custom tabs mode. 71 // Additional items for custom tabs mode.
77 private static final int[] CUSTOM_TAB_MODE_WHITELIST = { 72 private static final Integer[] CUSTOM_TAB_MODE_WHITELIST = {
78 R.id.contextmenu_open_image, R.id.contextmenu_search_by_image, 73 R.id.contextmenu_open_image, R.id.contextmenu_search_by_image,
79 R.id.contextmenu_open_in_new_chrome_tab, R.id.contextmenu_open_in_ch rome_incognito_tab, 74 R.id.contextmenu_open_in_new_chrome_tab, R.id.contextmenu_open_in_ch rome_incognito_tab,
80 R.id.contextmenu_open_in_browser_id, 75 R.id.contextmenu_open_in_browser_id,
81 }; 76 };
82 77
83 // Additional items for fullscreen tabs mode. 78 // Additional items for fullscreen tabs mode.
84 private static final int[] FULLSCREEN_TAB_MODE_WHITELIST = { 79 private static final Integer[] FULLSCREEN_TAB_MODE_WHITELIST = {R.id.menu_id _open_in_chrome};
85 R.id.menu_id_open_in_chrome
86 };
87 80
88 private final ContextMenuItemDelegate mDelegate; 81 private final ContextMenuItemDelegate mDelegate;
89 private MenuInflater mMenuInflater; 82 private MenuInflater mMenuInflater;
90 private final int mMode; 83 private final int mMode;
91 84
92 static class ContextMenuUma { 85 static class ContextMenuUma {
93 // Note: these values must match the ContextMenuOption enum in histogram s.xml. 86 // Note: these values must match the ContextMenuOption enum in histogram s.xml.
94 static final int ACTION_OPEN_IN_NEW_TAB = 0; 87 static final int ACTION_OPEN_IN_NEW_TAB = 0;
95 static final int ACTION_OPEN_IN_INCOGNITO_TAB = 1; 88 static final int ACTION_OPEN_IN_INCOGNITO_TAB = 1;
96 static final int ACTION_COPY_LINK_ADDRESS = 2; 89 static final int ACTION_COPY_LINK_ADDRESS = 2;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 setHeaderText(context, menu, params.getTitleText()); 191 setHeaderText(context, menu, params.getTitleText());
199 } 192 }
200 193
201 if (mMenuInflater == null) mMenuInflater = new MenuInflater(context); 194 if (mMenuInflater == null) mMenuInflater = new MenuInflater(context);
202 195
203 mMenuInflater.inflate(R.menu.chrome_context_menu, menu); 196 mMenuInflater.inflate(R.menu.chrome_context_menu, menu);
204 197
205 menu.setGroupVisible(R.id.contextmenu_group_anchor, params.isAnchor()); 198 menu.setGroupVisible(R.id.contextmenu_group_anchor, params.isAnchor());
206 menu.setGroupVisible(R.id.contextmenu_group_image, params.isImage()); 199 menu.setGroupVisible(R.id.contextmenu_group_image, params.isImage());
207 menu.setGroupVisible(R.id.contextmenu_group_video, params.isVideo()); 200 menu.setGroupVisible(R.id.contextmenu_group_video, params.isVideo());
201 menu.setGroupVisible(R.id.contextmenu_group_message,
202 MailTo.isMailTo(params.getLinkUrl())
203 || UrlUtilities.isTelScheme(params.getLinkUrl()));
208 204
205 Set<Integer> supportedOptions = new HashSet<>();
206 Collections.addAll(supportedOptions, BASE_WHITELIST);
207 if (mMode == FULLSCREEN_TAB_MODE) {
208 Collections.addAll(supportedOptions, FULLSCREEN_TAB_MODE_WHITELIST);
209 } else if (mMode == CUSTOM_TAB_MODE) {
210 Collections.addAll(supportedOptions, CUSTOM_TAB_MODE_WHITELIST);
211 if (!ChromePreferenceManager.getInstance().getCachedChromeDefaultBro wser()) {
212 menu.findItem(R.id.contextmenu_open_in_browser_id)
213 .setTitle(mDelegate.getTitleForOpenTabInExternalApp());
214 }
215 } else {
216 Collections.addAll(supportedOptions, NORMAL_MODE_WHITELIST);
217 }
218
219 trimInvisibleItems(supportedOptions, menu);
220 Set<Integer> disabledOptions = getDisabledOptions(params);
221
222 // Iterate through the entire menu list, if if doesn't exist in the map, don't show it.
223 for (int i = 0; i < menu.size(); i++) {
224 MenuItem item = menu.getItem(i);
225 item.setVisible(supportedOptions.contains(item.getItemId())
226 && !disabledOptions.contains(item.getItemId()));
227 }
228
229 // Special case for searching by image element.
230 if (supportedOptions.contains(R.id.contextmenu_search_by_image)) {
231 menu.findItem(R.id.contextmenu_search_by_image)
232 .setTitle(context.getString(R.string.contextmenu_search_web_ for_image,
233 TemplateUrlService.getInstance()
234 .getDefaultSearchEngineTemplateUrl()
235 .getShortName()));
236 }
237 }
238
239 /**
240 * Removes items from the list of supported items if they are not visible in the context menu.
241 */
242 private void trimInvisibleItems(Set<Integer> supportedItems, ContextMenu men u) {
243 for (Iterator<Integer> itemsIterator = supportedItems.iterator();
244 itemsIterator.hasNext();) {
245 Integer itemId = itemsIterator.next();
246 if (!menu.findItem(itemId).isVisible()) {
247 itemsIterator.remove();
248 }
249 }
250 }
251
252 /**
253 * Given a set of params and context, and a list of all the items. This meth od never adds items,
254 * only removes or edits them from the
255 * list.
256 * @param params The parameters used to create a list of items that should n ot be allowed.
257 */
258 private Set<Integer> getDisabledOptions(ContextMenuParams params) {
259 Set<Integer> disabledOptions = new HashSet<>();
209 if (params.isAnchor() && !mDelegate.isOpenInOtherWindowSupported()) { 260 if (params.isAnchor() && !mDelegate.isOpenInOtherWindowSupported()) {
210 menu.findItem(R.id.contextmenu_open_in_other_window).setVisible(fals e); 261 disabledOptions.add(R.id.contextmenu_open_in_other_window);
211 } 262 }
212 263
213 if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) { 264 if (mDelegate.isIncognito() || !mDelegate.isIncognitoSupported()) {
214 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(fal se); 265 disabledOptions.add(R.id.contextmenu_open_in_incognito_tab);
215 } 266 }
216 267
217 if (params.getLinkText().trim().isEmpty() || params.isImage()) { 268 if (params.getLinkText().trim().isEmpty() || params.isImage()) {
218 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false); 269 disabledOptions.add(R.id.contextmenu_copy_link_text);
219 } 270 }
220 271
221 if (params.isAnchor() && !UrlUtilities.isAcceptedScheme(params.getLinkUr l())) { 272 if (params.isAnchor() && !UrlUtilities.isAcceptedScheme(params.getLinkUr l())) {
222 menu.findItem(R.id.contextmenu_open_in_other_window).setVisible(fals e); 273 disabledOptions.add(R.id.contextmenu_open_in_other_window);
223 menu.findItem(R.id.contextmenu_open_in_new_tab).setVisible(false); 274 disabledOptions.add(R.id.contextmenu_open_in_new_tab);
224 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(fal se); 275 disabledOptions.add(R.id.contextmenu_open_in_incognito_tab);
225 } 276 }
226 277
227 if (MailTo.isMailTo(params.getLinkUrl())) { 278 if (MailTo.isMailTo(params.getLinkUrl())) {
228 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false); 279 disabledOptions.add(R.id.contextmenu_copy_link_text);
229 menu.findItem(R.id.contextmenu_copy_link_address).setVisible(false); 280 disabledOptions.add(R.id.contextmenu_copy_link_address);
230 menu.setGroupVisible(R.id.contextmenu_group_message, true);
231 if (!mDelegate.supportsSendEmailMessage()) { 281 if (!mDelegate.supportsSendEmailMessage()) {
232 menu.findItem(R.id.contextmenu_send_message).setVisible(false); 282 disabledOptions.add(R.id.contextmenu_send_message);
233 } 283 }
234 if (TextUtils.isEmpty(MailTo.parse(params.getLinkUrl()).getTo()) 284 if (TextUtils.isEmpty(MailTo.parse(params.getLinkUrl()).getTo())
235 || !mDelegate.supportsAddToContacts()) { 285 || !mDelegate.supportsAddToContacts()) {
236 menu.findItem(R.id.contextmenu_add_to_contacts).setVisible(false ); 286 disabledOptions.add(R.id.contextmenu_add_to_contacts);
237 } 287 }
238 menu.findItem(R.id.contextmenu_call).setVisible(false); 288 disabledOptions.add(R.id.contextmenu_call);
239 } else if (UrlUtilities.isTelScheme(params.getLinkUrl())) { 289 } else if (UrlUtilities.isTelScheme(params.getLinkUrl())) {
240 menu.findItem(R.id.contextmenu_copy_link_text).setVisible(false); 290 disabledOptions.add(R.id.contextmenu_copy_link_text);
241 menu.findItem(R.id.contextmenu_copy_link_address).setVisible(false); 291 disabledOptions.add(R.id.contextmenu_copy_link_address);
242 menu.setGroupVisible(R.id.contextmenu_group_message, true);
243 if (!mDelegate.supportsCall()) { 292 if (!mDelegate.supportsCall()) {
244 menu.findItem(R.id.contextmenu_call).setVisible(false); 293 disabledOptions.add(R.id.contextmenu_call);
245 } 294 }
246 if (!mDelegate.supportsSendTextMessage()) { 295 if (!mDelegate.supportsSendTextMessage()) {
247 menu.findItem(R.id.contextmenu_send_message).setVisible(false); 296 disabledOptions.add(R.id.contextmenu_send_message);
248 } 297 }
249 if (!mDelegate.supportsAddToContacts()) { 298 if (!mDelegate.supportsAddToContacts()) {
250 menu.findItem(R.id.contextmenu_add_to_contacts).setVisible(false ); 299 disabledOptions.add(R.id.contextmenu_add_to_contacts);
251 } 300 }
252 } else {
253 menu.setGroupVisible(R.id.contextmenu_group_message, false);
254 } 301 }
255 302
256 menu.findItem(R.id.contextmenu_save_link_as).setVisible( 303 if (!UrlUtilities.isDownloadableScheme(params.getLinkUrl())) {
257 UrlUtilities.isDownloadableScheme(params.getLinkUrl())); 304 disabledOptions.add(R.id.contextmenu_save_link_as);
305 }
258 306
307 boolean isSrcDownloadableScheme = UrlUtilities.isDownloadableScheme(para ms.getSrcUrl());
259 if (params.isVideo()) { 308 if (params.isVideo()) {
260 menu.findItem(R.id.contextmenu_save_video).setVisible( 309 boolean saveableAndDownloadable = params.canSaveMedia() && isSrcDown loadableScheme;
261 params.canSaveMedia() && UrlUtilities.isDownloadableScheme(p arams.getSrcUrl())); 310 if (!saveableAndDownloadable) {
311 disabledOptions.add(R.id.contextmenu_save_video);
312 }
262 } else if (params.isImage() && params.imageWasFetchedLoFi()) { 313 } else if (params.isImage() && params.imageWasFetchedLoFi()) {
263 DataReductionProxyUma.previewsLoFiContextMenuAction( 314 DataReductionProxyUma.previewsLoFiContextMenuAction(
264 DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_SH OWN); 315 DataReductionProxyUma.ACTION_LOFI_LOAD_IMAGE_CONTEXT_MENU_SH OWN);
265 // All image context menu items other than "Load image," "Open origi nal image in 316 // All image context menu items other than "Load image," "Open origi nal image in
266 // new tab," and "Copy image URL" should be disabled on Lo-Fi images . 317 // new tab," and "Copy image URL" should be disabled on Lo-Fi images .
267 menu.findItem(R.id.contextmenu_save_image).setVisible(false); 318 disabledOptions.add(R.id.contextmenu_save_image);
268 menu.findItem(R.id.contextmenu_open_image).setVisible(false); 319 disabledOptions.add(R.id.contextmenu_open_image);
269 menu.findItem(R.id.contextmenu_search_by_image).setVisible(false); 320 disabledOptions.add(R.id.contextmenu_search_by_image);
270 menu.findItem(R.id.contextmenu_share_image).setVisible(false); 321 disabledOptions.add(R.id.contextmenu_share_image);
271 } else if (params.isImage() && !params.imageWasFetchedLoFi()) { 322 } else if (params.isImage() && !params.imageWasFetchedLoFi()) {
272 menu.findItem(R.id.contextmenu_load_original_image).setVisible(false ); 323 disabledOptions.add(R.id.contextmenu_load_original_image);
273 324
274 menu.findItem(R.id.contextmenu_save_image).setVisible( 325 if (!isSrcDownloadableScheme) {
275 UrlUtilities.isDownloadableScheme(params.getSrcUrl())); 326 disabledOptions.add(R.id.contextmenu_save_image);
327 }
276 328
277 // Avoid showing open image option for same image which is already o pened. 329 // Avoid showing open image option for same image which is already o pened.
278 if (mDelegate.getPageUrl().equals(params.getSrcUrl())) { 330 if (mDelegate.getPageUrl().equals(params.getSrcUrl())) {
279 menu.findItem(R.id.contextmenu_open_image).setVisible(false); 331 disabledOptions.add(R.id.contextmenu_open_image);
280 } 332 }
281 final TemplateUrlService templateUrlServiceInstance = TemplateUrlSer vice.getInstance(); 333 final TemplateUrlService templateUrlServiceInstance = TemplateUrlSer vice.getInstance();
282 final boolean isSearchByImageAvailable = 334 final boolean isSearchByImageAvailable = isSrcDownloadableScheme
283 UrlUtilities.isDownloadableScheme(params.getSrcUrl()) 335 && templateUrlServiceInstance.isLoaded()
284 && templateUrlServiceInstance.isLoaded() 336 && templateUrlServiceInstance.isSearchByImageAvailable()
285 && templateUrlServiceInstance.isSearchByImageAvailab le() 337 && templateUrlServiceInstance.getDefaultSearchEngineTemplate Url() != null;
286 && templateUrlServiceInstance.getDefaultSearchEngine TemplateUrl()
287 != null;
288 338
289 menu.findItem(R.id.contextmenu_search_by_image).setVisible(isSearchB yImageAvailable); 339 if (!isSearchByImageAvailable) {
290 if (isSearchByImageAvailable) { 340 disabledOptions.add(R.id.contextmenu_search_by_image);
291 menu.findItem(R.id.contextmenu_search_by_image).setTitle(
292 context.getString(R.string.contextmenu_search_web_for_im age,
293 TemplateUrlService.getInstance()
294 .getDefaultSearchEngineTemplateUrl().get ShortName()));
295 } 341 }
296 } 342 }
297 343
298 // Hide all items that could spawn additional tabs until FRE has been co mpleted. 344 // Hide all items that could spawn additional tabs until FRE has been co mpleted.
299 if (!FirstRunStatus.getFirstRunFlowComplete()) { 345 if (!FirstRunStatus.getFirstRunFlowComplete()) {
300 menu.findItem(R.id.contextmenu_open_image_in_new_tab).setVisible(fal se); 346 disabledOptions.add(R.id.contextmenu_open_image_in_new_tab);
301 menu.findItem(R.id.contextmenu_open_in_other_window).setVisible(fals e); 347 disabledOptions.add(R.id.contextmenu_open_in_other_window);
302 menu.findItem(R.id.contextmenu_open_in_new_tab).setVisible(false); 348 disabledOptions.add(R.id.contextmenu_open_in_new_tab);
303 menu.findItem(R.id.contextmenu_open_in_incognito_tab).setVisible(fal se); 349 disabledOptions.add(R.id.contextmenu_open_in_incognito_tab);
304 menu.findItem(R.id.contextmenu_search_by_image).setVisible(false); 350 disabledOptions.add(R.id.contextmenu_search_by_image);
305 menu.findItem(R.id.menu_id_open_in_chrome).setVisible(false); 351 disabledOptions.add(R.id.menu_id_open_in_chrome);
306 } 352 }
307 353
308 if (mMode == FULLSCREEN_TAB_MODE) { 354 if (mMode == CUSTOM_TAB_MODE) {
309 removeUnsupportedItems(menu, FULLSCREEN_TAB_MODE_WHITELIST);
310 } else if (mMode == CUSTOM_TAB_MODE) {
311 removeUnsupportedItems(menu, CUSTOM_TAB_MODE_WHITELIST);
312 MenuItem defaultOpenMenuItem = menu.findItem(R.id.contextmenu_open_i n_browser_id);
313 if (ChromePreferenceManager.getInstance().getCachedChromeDefaultBrow ser()) { 355 if (ChromePreferenceManager.getInstance().getCachedChromeDefaultBrow ser()) {
314 defaultOpenMenuItem.setVisible(false); 356 disabledOptions.add(R.id.contextmenu_open_in_browser_id);
315 } else { 357 } else {
316 menu.findItem(R.id.contextmenu_open_in_new_chrome_tab).setVisibl e(false); 358 disabledOptions.add(R.id.contextmenu_open_in_new_chrome_tab);
317 menu.findItem(R.id.contextmenu_open_in_chrome_incognito_tab).set Visible(false); 359 disabledOptions.add(R.id.contextmenu_open_in_chrome_incognito_ta b);
318 defaultOpenMenuItem.setTitle(mDelegate.getTitleForOpenTabInExter nalApp());
319 } 360 }
320 } else {
321 removeUnsupportedItems(menu, NORMAL_MODE_WHITELIST);
322 } 361 }
362
363 return disabledOptions;
323 } 364 }
324 365
325 private void removeUnsupportedItems(ContextMenu menu, int[] whitelist) { 366 private void removeUnsupportedItems(Set<Integer> itemList, int[] whitelist) {
326 Arrays.sort(BASE_WHITELIST); 367 Arrays.sort(BASE_WHITELIST);
327 Arrays.sort(whitelist); 368 Arrays.sort(whitelist);
328 for (int i = 0; i < menu.size(); i++) { 369 for (Iterator<Integer> idIterator = itemList.iterator(); idIterator.hasN ext();) {
329 MenuItem item = menu.getItem(i); 370 int itemId = idIterator.next();
330 if (Arrays.binarySearch(whitelist, item.getItemId()) < 0 371 if (Arrays.binarySearch(whitelist, itemId) < 0
331 && Arrays.binarySearch(BASE_WHITELIST, item.getItemId()) < 0 ) { 372 && Arrays.binarySearch(BASE_WHITELIST, itemId) < 0) {
332 menu.removeItem(item.getItemId()); 373 idIterator.remove();
333 i--;
334 } 374 }
335 } 375 }
336 } 376 }
337 377
338 @Override 378 @Override
339 public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams pa rams, int itemId) { 379 public boolean onItemSelected(ContextMenuHelper helper, ContextMenuParams pa rams, int itemId) {
340 if (itemId == R.id.contextmenu_open_in_other_window) { 380 if (itemId == R.id.contextmenu_open_in_other_window) {
341 ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_OTHER_WI NDOW); 381 ContextMenuUma.record(params, ContextMenuUma.ACTION_OPEN_IN_OTHER_WI NDOW);
342 mDelegate.onOpenInOtherWindow(params.getLinkUrl(), params.getReferre r()); 382 mDelegate.onOpenInOtherWindow(params.getLinkUrl(), params.getReferre r());
343 } else if (itemId == R.id.contextmenu_open_in_new_tab) { 383 } else if (itemId == R.id.contextmenu_open_in_new_tab) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 } 470 }
431 471
432 return true; 472 return true;
433 } 473 }
434 474
435 private void setHeaderText(Context context, ContextMenu menu, String text) { 475 private void setHeaderText(Context context, ContextMenu menu, String text) {
436 ContextMenuTitleView title = new ContextMenuTitleView(context, text); 476 ContextMenuTitleView title = new ContextMenuTitleView(context, text);
437 menu.setHeaderView(title); 477 menu.setHeaderView(title);
438 } 478 }
439 } 479 }
OLDNEW
« no previous file with comments | « no previous file | chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698