Home | History | Annotate | Download | only in contextmenu
      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
      3 // found in the LICENSE file.
      4 
      5 package org.chromium.chrome.browser.contextmenu;
      6 
      7 import android.text.TextUtils;
      8 
      9 import org.chromium.base.CalledByNative;
     10 import org.chromium.base.JNINamespace;
     11 import org.chromium.content_public.Referrer;
     12 
     13 import java.util.ArrayList;
     14 
     15 /**
     16  * A list of parameters that explain what kind of context menu to show the user.  This data is
     17  * generated from content/public/common/context_menu_params.h.
     18  */
     19 @JNINamespace("ContextMenuParamsAndroid")
     20 public class ContextMenuParams {
     21     /** Must correspond to the MediaType enum in WebKit/chromium/public/WebContextMenuData.h */
     22     @SuppressWarnings("unused")
     23     private static interface MediaType {
     24         public static final int MEDIA_TYPE_NONE = 0;
     25         public static final int MEDIA_TYPE_IMAGE = 1;
     26         public static final int MEDIA_TYPE_VIDEO = 2;
     27         public static final int MEDIA_TYPE_AUDIO = 3;
     28         public static final int MEDIA_TYPE_FILE = 4;
     29         public static final int MEDIA_TYPE_PLUGIN = 5;
     30     }
     31 
     32     private static class CustomMenuItem {
     33         public final String label;
     34         public final int action;
     35 
     36         public CustomMenuItem(String label, int action) {
     37             this.label = label;
     38             this.action = action;
     39         }
     40     }
     41 
     42     private final String mLinkUrl;
     43     private final String mLinkText;
     44     private final String mUnfilteredLinkUrl;
     45     private final String mSrcUrl;
     46     private final boolean mIsEditable;
     47     private final Referrer mReferrer;
     48 
     49     private final boolean mIsAnchor;
     50     private final boolean mIsSelectedText;
     51     private final boolean mIsImage;
     52     private final boolean mIsVideo;
     53 
     54     private final ArrayList<CustomMenuItem> mCustomMenuItems = new ArrayList<CustomMenuItem>();
     55 
     56     /**
     57      * @return Whether or not the context menu should consist of custom items.
     58      */
     59     public boolean isCustomMenu() {
     60         return !mCustomMenuItems.isEmpty();
     61     }
     62 
     63     /**
     64      * @return The number of custom items in this context menu.
     65      */
     66     public int getCustomMenuSize() {
     67         return mCustomMenuItems.size();
     68     }
     69 
     70     /**
     71      * The label that should be shown for the custom menu item at {@code index}.
     72      * @param index The index of the custom menu item.
     73      * @return      The label to show.
     74      */
     75     public String getCustomLabelAt(int index) {
     76         assert index >= 0 && index < mCustomMenuItems.size();
     77         return mCustomMenuItems.get(index).label;
     78     }
     79 
     80     /**
     81      * The action that should be returned for the custom menu item at {@code index}.
     82      * @param index The index of the custom menu item.
     83      * @return      The action to return.
     84      */
     85     public int getCustomActionAt(int index) {
     86         assert index >= 0 && index < mCustomMenuItems.size();
     87         return mCustomMenuItems.get(index).action;
     88     }
     89 
     90     /**
     91      * @return The link URL, if any.
     92      */
     93     public String getLinkUrl() {
     94         return mLinkUrl;
     95     }
     96 
     97     /**
     98      * @return The link text, if any.
     99      */
    100     public String getLinkText() {
    101         return mLinkText;
    102     }
    103 
    104     /**
    105      * @return The unfiltered link URL, if any.
    106      */
    107     public String getUnfilteredLinkUrl() {
    108         return mUnfilteredLinkUrl;
    109     }
    110 
    111     /**
    112      * @return The source URL.
    113      */
    114     public String getSrcUrl() {
    115         return mSrcUrl;
    116     }
    117 
    118     /**
    119      * @return Whether or not the context menu is being shown for an editable piece of content.
    120      */
    121     public boolean isEditable() {
    122         return mIsEditable;
    123     }
    124 
    125     /**
    126      * @return the referrer associated with the frame on which the menu is invoked
    127      */
    128     public Referrer getReferrer() {
    129         return mReferrer;
    130     }
    131 
    132     /**
    133      * @return Whether or not the context menu is being shown for an anchor.
    134      */
    135     public boolean isAnchor() {
    136         return mIsAnchor;
    137     }
    138 
    139     /**
    140      * @return Whether or not the context menu is being shown for selected text.
    141      */
    142     public boolean isSelectedText() {
    143         return mIsSelectedText;
    144     }
    145 
    146     /**
    147      * @return Whether or not the context menu is being shown for an image.
    148      */
    149     public boolean isImage() {
    150         return mIsImage;
    151     }
    152 
    153     /**
    154      * @return Whether or not the context menu is being shown for a video.
    155      */
    156     public boolean isVideo() {
    157         return mIsVideo;
    158     }
    159 
    160     private ContextMenuParams(int mediaType, String linkUrl, String linkText,
    161             String unfilteredLinkUrl, String srcUrl, String selectionText, boolean isEditable,
    162             Referrer referrer) {
    163         mLinkUrl = linkUrl;
    164         mLinkText = linkText;
    165         mUnfilteredLinkUrl = unfilteredLinkUrl;
    166         mSrcUrl = srcUrl;
    167         mIsEditable = isEditable;
    168         mReferrer = referrer;
    169 
    170         mIsAnchor = !TextUtils.isEmpty(linkUrl);
    171         mIsSelectedText = !TextUtils.isEmpty(selectionText);
    172         mIsImage = mediaType == MediaType.MEDIA_TYPE_IMAGE;
    173         mIsVideo = mediaType == MediaType.MEDIA_TYPE_VIDEO;
    174     }
    175 
    176     @CalledByNative
    177     private static ContextMenuParams create(int mediaType, String linkUrl, String linkText,
    178             String unfilteredLinkUrl, String srcUrl, String selectionText, boolean isEditable,
    179             String sanitizedReferrer, int referrerPolicy) {
    180         Referrer referrer = TextUtils.isEmpty(sanitizedReferrer) ?
    181                 null : new Referrer(sanitizedReferrer, referrerPolicy);
    182         return new ContextMenuParams(mediaType, linkUrl, linkText, unfilteredLinkUrl, srcUrl,
    183                 selectionText, isEditable, referrer);
    184     }
    185 
    186     @CalledByNative
    187     private void addCustomItem(String label, int action) {
    188         mCustomMenuItems.add(new CustomMenuItem(label, action));
    189     }
    190 }
    191