From 69a4df60efb0e1623e26f4fbdef15ac3cfde0ad6 Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Wed, 22 Apr 2020 20:09:03 +0200 Subject: [PATCH] Fixes #3168 Context menu fixes (#3207) * Don't show context menu for blob elements * Context menu fixes --- .../vrbrowser/ui/widgets/WindowWidget.java | 5 +++ .../ui/widgets/menus/ContextMenuWidget.java | 42 +++++++++++-------- .../org/mozilla/vrbrowser/utils/UrlUtils.java | 4 ++ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index b91c246ee..47d30466e 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -1589,6 +1589,11 @@ public void onFullScreen(@NonNull GeckoSession session, boolean aFullScreen) { public void onContextMenu(GeckoSession session, int screenX, int screenY, ContextElement element) { hideContextMenus(); + // We don't show the menu for blobs + if (UrlUtils.isBlobUri(element.srcUri)) { + return; + } + mContextMenu = new ContextMenuWidget(getContext()); mContextMenu.mWidgetPlacement.parentHandle = getHandle(); mContextMenu.setDismissCallback(this::hideContextMenus); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/ContextMenuWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/ContextMenuWidget.java index 70945a478..42b9d8d8d 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/ContextMenuWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/menus/ContextMenuWidget.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.res.Configuration; import android.net.Uri; +import android.webkit.URLUtil; import androidx.annotation.StringRes; @@ -20,6 +21,7 @@ import org.mozilla.vrbrowser.ui.widgets.WidgetManagerDelegate; import org.mozilla.vrbrowser.ui.widgets.WidgetPlacement; import org.mozilla.vrbrowser.utils.StringUtils; +import org.mozilla.vrbrowser.utils.UrlUtils; import java.util.ArrayList; @@ -79,32 +81,36 @@ public void setDismissCallback(Runnable aCallback) { public void setContextElement(ContextElement aContextElement) { mItems = new ArrayList<>(); - mItems.add(new MenuWidget.MenuItem(aContextElement.linkUri, 0, null)); final WidgetManagerDelegate widgetManager = mWidgetManager; - if (mWidgetManager.canOpenNewWindow()) { - mItems.add(new MenuWidget.MenuItem(getContext().getString(R.string.context_menu_open_new_window_1), 0, () -> { + if (aContextElement.linkUri != null && !aContextElement.linkUri.isEmpty()) { + mItems.add(new MenuWidget.MenuItem(aContextElement.linkUri, 0, null)); + if (mWidgetManager.canOpenNewWindow()) { + mItems.add(new MenuWidget.MenuItem(getContext().getString(R.string.context_menu_open_new_window_1), 0, () -> { + if (!StringUtils.isEmpty(aContextElement.linkUri)) { + widgetManager.openNewWindow(aContextElement.linkUri); + } + onDismiss(); + })); + } + mItems.add(new MenuWidget.MenuItem(getContext().getString(R.string.context_menu_open_new_tab_1), 0, () -> { if (!StringUtils.isEmpty(aContextElement.linkUri)) { - widgetManager.openNewWindow(aContextElement.linkUri); + widgetManager.openNewTab(aContextElement.linkUri); + GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.CONTEXT_MENU); } onDismiss(); })); - } - mItems.add(new MenuWidget.MenuItem(getContext().getString(R.string.context_menu_open_new_tab_1), 0, () -> { if (!StringUtils.isEmpty(aContextElement.linkUri)) { - widgetManager.openNewTab(aContextElement.linkUri); - GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.CONTEXT_MENU); + mItems.add(new MenuWidget.MenuItem(getContext().getString(R.string.context_menu_download_link), 0, () -> { + DownloadJob job = DownloadJob.fromLink(aContextElement); + widgetManager.getFocusedWindow().startDownload(job, false); + // TODO Add Download from context menu Telemetry + onDismiss(); + })); } - onDismiss(); - })); - if (!StringUtils.isEmpty(aContextElement.linkUri)) { - mItems.add(new MenuWidget.MenuItem(getContext().getString(R.string.context_menu_download_link), 0, () -> { - DownloadJob job = DownloadJob.fromLink(aContextElement); - widgetManager.getFocusedWindow().startDownload(job, false); - // TODO Add Download from context menu Telemetry - onDismiss(); - })); + } else { + mItems.add(new MenuWidget.MenuItem(aContextElement.srcUri, 0, null)); } - if (!StringUtils.isEmpty(aContextElement.srcUri)) { + if (URLUtil.isHttpUrl(aContextElement.srcUri) || URLUtil.isHttpsUrl(aContextElement.srcUri)) { @StringRes int srcText; switch (aContextElement.type) { case ContextElement.TYPE_IMAGE: diff --git a/app/src/common/shared/org/mozilla/vrbrowser/utils/UrlUtils.java b/app/src/common/shared/org/mozilla/vrbrowser/utils/UrlUtils.java index 627bc522b..edb208719 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/utils/UrlUtils.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/utils/UrlUtils.java @@ -114,6 +114,10 @@ public static Boolean isFileUri(@Nullable String aUri) { return aUri != null && aUri.startsWith("file"); } + public static Boolean isBlobUri(@Nullable String aUri) { + return aUri != null && aUri.startsWith("blob"); + } + public static Boolean isBlankUri(@Nullable Context context, @Nullable String aUri) { return context != null && aUri != null && aUri.equals(context.getString(R.string.about_blank)); }