| Index: chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java | 
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java | 
| index 09428c07607022ac3b53855c70553f103e64cdfe..7a7e5c125a29017108dab2dbfb3e6060d42b70d0 100644 | 
| --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java | 
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/TabularContextMenuUi.java | 
| @@ -5,7 +5,6 @@ | 
| package org.chromium.chrome.browser.contextmenu; | 
|  | 
| import android.app.Activity; | 
| -import android.app.Dialog; | 
| import android.content.DialogInterface; | 
| import android.content.res.Resources; | 
| import android.graphics.Bitmap; | 
| @@ -14,7 +13,6 @@ import android.graphics.Shader; | 
| import android.graphics.drawable.BitmapDrawable; | 
| import android.graphics.drawable.Drawable; | 
| import android.support.design.widget.TabLayout; | 
| -import android.support.v4.view.ViewPager; | 
| import android.support.v7.app.AlertDialog; | 
| import android.text.TextUtils; | 
| import android.util.Pair; | 
| @@ -31,6 +29,8 @@ import org.chromium.base.ApiCompatibilityUtils; | 
| import org.chromium.base.Callback; | 
| import org.chromium.base.VisibleForTesting; | 
| import org.chromium.chrome.R; | 
| +import org.chromium.chrome.browser.widget.ContextMenuDialog; | 
| +import org.chromium.content.browser.RenderCoordinates; | 
|  | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| @@ -39,71 +39,88 @@ import java.util.List; | 
| * A custom dialog that separates each group into separate tabs. It uses a dialog instead. | 
| */ | 
| public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemClickListener { | 
| -    private Dialog mDialog; | 
| +    private ContextMenuDialog mContextMenuDialog; | 
| private Callback<Integer> mCallback; | 
| private int mMenuItemHeight; | 
| private ImageView mHeaderImageView; | 
| private Runnable mOnShareItemClicked; | 
| +    private View mPagerView; | 
| +    private RenderCoordinates mRenderCoordinates; | 
|  | 
| public TabularContextMenuUi(Runnable onShareItemClicked) { | 
| mOnShareItemClicked = onShareItemClicked; | 
| } | 
|  | 
| @Override | 
| -    public void displayMenu(Activity activity, ContextMenuParams params, | 
| +    public void displayMenu(final Activity activity, ContextMenuParams params, | 
| List<Pair<Integer, List<ContextMenuItem>>> items, Callback<Integer> onItemClicked, | 
| final Runnable onMenuShown, final Runnable onMenuClosed) { | 
| mCallback = onItemClicked; | 
| -        mDialog = createDialog(activity, params, items); | 
|  | 
| -        mDialog.getWindow().setBackgroundDrawable(ApiCompatibilityUtils.getDrawable( | 
| -                activity.getResources(), R.drawable.white_with_rounded_corners)); | 
| +        float density = Resources.getSystem().getDisplayMetrics().density; | 
| +        final float touchPointXPx = params.getTriggeringTouchXDp() * density; | 
| +        final float touchPointYPx = params.getTriggeringTouchYDp() * density; | 
|  | 
| -        mDialog.setOnShowListener(new DialogInterface.OnShowListener() { | 
| +        mContextMenuDialog = | 
| +                createContextMenuDialog(activity, params, items, touchPointXPx, touchPointYPx); | 
| + | 
| +        mContextMenuDialog.setOnShowListener(new DialogInterface.OnShowListener() { | 
| @Override | 
| public void onShow(DialogInterface dialogInterface) { | 
| onMenuShown.run(); | 
| } | 
| }); | 
|  | 
| -        mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { | 
| +        mContextMenuDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { | 
| @Override | 
| public void onDismiss(DialogInterface dialogInterface) { | 
| onMenuClosed.run(); | 
| } | 
| }); | 
|  | 
| -        mDialog.show(); | 
| +        mContextMenuDialog.show(); | 
| } | 
|  | 
| /** | 
| * Returns the fully complete dialog based off the params and the itemGroups. | 
| +     * | 
| * @param activity Used to inflate the dialog. | 
| * @param params Used to get the header title. | 
| * @param itemGroups If there is more than one group it will create a paged view. | 
| +     * @param touchPointYPx The x-coordinate of the touch that triggered the context menu. | 
| +     * @param touchPointXPx The y-coordinate of the touch that triggered the context menu. | 
| * @return Returns a final dialog that does not have a background can be displayed using | 
| *         {@link AlertDialog#show()}. | 
| */ | 
| -    private Dialog createDialog(Activity activity, ContextMenuParams params, | 
| -            List<Pair<Integer, List<ContextMenuItem>>> itemGroups) { | 
| -        Dialog dialog = new Dialog(activity); | 
| -        dialog.setContentView(createPagerView(activity, params, itemGroups)); | 
| +    private ContextMenuDialog createContextMenuDialog(Activity activity, ContextMenuParams params, | 
| +            List<Pair<Integer, List<ContextMenuItem>>> itemGroups, float touchPointXPx, | 
| +            float touchPointYPx) { | 
| +        View view = LayoutInflater.from(activity).inflate(R.layout.tabular_context_menu, null); | 
| + | 
| +        mPagerView = initPagerView(activity, params, itemGroups, | 
| +                (TabularContextMenuViewPager) view.findViewById(R.id.custom_pager)); | 
| + | 
| +        final ContextMenuDialog dialog = new ContextMenuDialog(activity, R.style.DialogWhenLarge, | 
| +                touchPointXPx, touchPointYPx, mPagerView, mRenderCoordinates); | 
| +        dialog.setContentView(view); | 
| + | 
| return dialog; | 
| } | 
|  | 
| /** | 
| * Creates a ViewPageAdapter based off the given list of views. | 
| -     * @param activity Used to inflate the new ViewPager | 
| +     * | 
| +     * @param activity Used to inflate the new ViewPager. | 
| * @param params Used to get the header text. | 
| * @param itemGroups The list of views to put into the ViewPager. The string is the title of the | 
| -     *                   tab | 
| +     *                   tab. | 
| +     * @param viewPager The {@link TabularContextMenuViewPager} to initialize. | 
| * @return Returns a complete tabular context menu view. | 
| */ | 
| @VisibleForTesting | 
| -    View createPagerView(Activity activity, ContextMenuParams params, | 
| -            List<Pair<Integer, List<ContextMenuItem>>> itemGroups) { | 
| -        View view = LayoutInflater.from(activity).inflate(R.layout.tabular_context_menu, null); | 
| - | 
| +    View initPagerView(Activity activity, ContextMenuParams params, | 
| +            List<Pair<Integer, List<ContextMenuItem>>> itemGroups, | 
| +            TabularContextMenuViewPager viewPager) { | 
| List<Pair<String, ViewGroup>> viewGroups = new ArrayList<>(); | 
| int maxCount = 0; | 
| for (int i = 0; i < itemGroups.size(); i++) { | 
| @@ -118,30 +135,23 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl | 
| createContextMenuPageUi( | 
| activity, params, itemGroup.second, isImageTab, maxCount))); | 
| } | 
| -        if (itemGroups.size() == 1) { | 
| -            viewGroups.get(0) | 
| -                    .second.getChildAt(0) | 
| -                    .findViewById(R.id.context_header_layout) | 
| -                    .setBackgroundResource(R.color.google_grey_100); | 
| -        } | 
| - | 
| -        TabularContextMenuViewPager pager = | 
| -                (TabularContextMenuViewPager) view.findViewById(R.id.custom_pager); | 
| -        pager.setAdapter(new TabularContextMenuPagerAdapter(viewGroups)); | 
|  | 
| -        TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tab_layout); | 
| +        viewPager.setAdapter(new TabularContextMenuPagerAdapter(viewGroups)); | 
| +        TabLayout tabLayout = (TabLayout) viewPager.findViewById(R.id.tab_layout); | 
| if (itemGroups.size() <= 1) { | 
| tabLayout.setVisibility(View.GONE); | 
| } else { | 
| -            tabLayout.setupWithViewPager((ViewPager) view.findViewById(R.id.custom_pager)); | 
| +            tabLayout.setBackgroundResource(R.drawable.grey_with_top_rounded_corners); | 
| +            tabLayout.setupWithViewPager(viewPager); | 
| } | 
|  | 
| -        return view; | 
| +        return viewPager; | 
| } | 
|  | 
| /** | 
| * Creates the view of a context menu. Based off the Context Type, it'll adjust the list of | 
| * items and display only the ones that'll be on that specific group. | 
| +     * | 
| * @param activity Used to get the resources of an item. | 
| * @param params used to create the header text. | 
| * @param items A set of Items to display in a context menu. Filtered based off the type. | 
| @@ -172,7 +182,7 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl | 
| @Override | 
| public void run() { | 
| mOnShareItemClicked.run(); | 
| -                mDialog.dismiss(); | 
| +                mContextMenuDialog.dismiss(); | 
| } | 
| }; | 
| TabularContextMenuListAdapter listAdapter = | 
| @@ -245,6 +255,7 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl | 
| * To save time measuring the height, this method gets an item if the height has not been | 
| * previous measured and multiplies it by count of the total amount of items. It is fine if the | 
| * height too small as the ListView will scroll through the other values. | 
| +     * | 
| * @param listView The ListView to measure the surrounding padding. | 
| * @param listAdapter The adapter which contains the items within the list. | 
| * @return Returns the combined height of the padding of the ListView and the approximate height | 
| @@ -263,8 +274,8 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl | 
| } | 
|  | 
| /** | 
| -     * When an thumbnail is retrieved for the header of an image, this will set the header to | 
| -     * that particular bitmap. | 
| +     * When an thumbnail is retrieved for the header of an image, this will set the header to that | 
| +     * particular bitmap. | 
| */ | 
| public void onImageThumbnailRetrieved(Bitmap bitmap) { | 
| if (mHeaderImageView != null) { | 
| @@ -274,7 +285,15 @@ public class TabularContextMenuUi implements ContextMenuUi, AdapterView.OnItemCl | 
|  | 
| @Override | 
| public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { | 
| -        mDialog.dismiss(); | 
| +        mContextMenuDialog.dismiss(); | 
| mCallback.onResult((int) id); | 
| } | 
| + | 
| +    /** | 
| +     * Gives this class access to the render coordinates to allow access to the total size of the | 
| +     * toolbar and tab strip. | 
| +     */ | 
| +    public void setRenderCoordinates(RenderCoordinates renderCoordinates) { | 
| +        mRenderCoordinates = renderCoordinates; | 
| +    } | 
| } | 
|  |