Commit 45aa3996 authored by tedchoc's avatar tedchoc Committed by Commit bot

Only enable copy options before FRE is completed on Android.

BUG=722320,722307

Review-Url: https://codereview.chromium.org/2883983005
Cr-Commit-Position: refs/heads/master@{#472275}
parent 9146f39d
......@@ -249,13 +249,19 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
ContextMenu menu, Context context, ContextMenuParams params) {
// Add all items in a group
Set<ContextMenuItem> supportedOptions = new HashSet<>();
supportedOptions.addAll(BASE_WHITELIST);
if (mMode == FULLSCREEN_TAB_MODE) {
supportedOptions.addAll(FULLSCREEN_TAB_MODE_WHITELIST);
} else if (mMode == CUSTOM_TAB_MODE) {
supportedOptions.addAll(CUSTOM_TAB_MODE_WHITELIST);
if (FirstRunStatus.getFirstRunFlowComplete()) {
supportedOptions.addAll(BASE_WHITELIST);
if (mMode == FULLSCREEN_TAB_MODE) {
supportedOptions.addAll(FULLSCREEN_TAB_MODE_WHITELIST);
} else if (mMode == CUSTOM_TAB_MODE) {
supportedOptions.addAll(CUSTOM_TAB_MODE_WHITELIST);
} else {
supportedOptions.addAll(NORMAL_MODE_WHITELIST);
}
} else {
supportedOptions.addAll(NORMAL_MODE_WHITELIST);
supportedOptions.add(ContextMenuItem.COPY_LINK_ADDRESS);
supportedOptions.add(ContextMenuItem.COPY_LINK_TEXT);
supportedOptions.add(ContextMenuItem.COPY);
}
Set<ContextMenuItem> disabledOptions = getDisabledOptions(params);
......@@ -400,7 +406,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
disabledOptions.add(ContextMenuItem.COPY_LINK_TEXT);
}
if (params.isAnchor() && !UrlUtilities.isAcceptedScheme(params.getLinkUrl())) {
if (params.isAnchor() && !isAcceptedScheme(params.getLinkUrl())) {
disabledOptions.add(ContextMenuItem.OPEN_IN_OTHER_WINDOW);
disabledOptions.add(ContextMenuItem.OPEN_IN_NEW_TAB);
disabledOptions.add(ContextMenuItem.OPEN_IN_INCOGNITO_TAB);
......@@ -437,11 +443,11 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
}
}
if (!UrlUtilities.isDownloadableScheme(params.getLinkUrl())) {
if (!isDownloadableScheme(params.getLinkUrl())) {
disabledOptions.add(ContextMenuItem.SAVE_LINK_AS);
}
boolean isSrcDownloadableScheme = UrlUtilities.isDownloadableScheme(params.getSrcUrl());
boolean isSrcDownloadableScheme = isDownloadableScheme(params.getSrcUrl());
if (params.isVideo()) {
boolean saveableAndDownloadable = params.canSaveMedia() && isSrcDownloadableScheme;
if (!saveableAndDownloadable) {
......@@ -467,7 +473,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
if (mDelegate.getPageUrl().equals(params.getSrcUrl())) {
disabledOptions.add(ContextMenuItem.OPEN_IMAGE);
}
final TemplateUrlService templateUrlServiceInstance = TemplateUrlService.getInstance();
final TemplateUrlService templateUrlServiceInstance = getTemplateUrlService();
final boolean isSearchByImageAvailable = isSrcDownloadableScheme
&& templateUrlServiceInstance.isLoaded()
&& templateUrlServiceInstance.isSearchByImageAvailable()
......@@ -478,16 +484,6 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
}
}
// Hide all items that could spawn additional tabs until FRE has been completed.
if (!FirstRunStatus.getFirstRunFlowComplete()) {
disabledOptions.add(ContextMenuItem.OPEN_IMAGE_IN_NEW_TAB);
disabledOptions.add(ContextMenuItem.OPEN_IN_OTHER_WINDOW);
disabledOptions.add(ContextMenuItem.OPEN_IN_NEW_TAB);
disabledOptions.add(ContextMenuItem.OPEN_IN_INCOGNITO_TAB);
disabledOptions.add(ContextMenuItem.SEARCH_BY_IMAGE);
disabledOptions.add(ContextMenuItem.OPEN_IN_CHROME);
}
if (mMode == CUSTOM_TAB_MODE) {
try {
URI uri = new URI(getUrl(params));
......@@ -613,6 +609,27 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
return true;
}
/**
* @return Whether the scheme of the URL is valid .
*/
protected boolean isAcceptedScheme(String url) {
return UrlUtilities.isAcceptedScheme(url);
}
/**
* @return Whether the scheme of the URL is valid for downloading.
*/
protected boolean isDownloadableScheme(String url) {
return UrlUtilities.isDownloadableScheme(url);
}
/**
* @return The service that handles TemplateUrls.
*/
protected TemplateUrlService getTemplateUrlService() {
return TemplateUrlService.getInstance();
}
/**
* Checks whether a url is empty or blank.
* @param url The url need to be checked.
......
......@@ -20,7 +20,7 @@ import org.chromium.content_public.common.Referrer;
public class ContextMenuParams {
/** Must correspond to the MediaType enum in WebKit/chromium/public/WebContextMenuData.h */
@SuppressWarnings("unused")
private static interface MediaType {
static interface MediaType {
public static final int MEDIA_TYPE_NONE = 0;
public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;
......
......@@ -1676,6 +1676,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerTest.java",
"junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateTest.java",
"junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.java",
"junit/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java",
"junit/src/org/chromium/chrome/browser/cookies/CanonicalCookieTest.java",
"junit/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnableUnitTest.java",
"junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.java",
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.contextmenu;
import static org.mockito.Mockito.doReturn;
import android.util.Pair;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator.ContextMenuMode;
import org.chromium.chrome.browser.firstrun.FirstRunStatus;
import org.chromium.chrome.browser.search_engines.TemplateUrlService;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import java.util.ArrayList;
import java.util.List;
/**
* Unit tests for the context menu logic of Chrome.
*/
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
@Features(@Features.Register(value = ChromeFeatureList.CUSTOM_CONTEXT_MENU, enabled = false))
public class ChromeContextMenuPopulatorTest {
private static final String PAGE_URL = "http://www.blah.com";
private static final String LINK_URL = "http://www.blah.com/other_blah";
private static final String LINK_TEXT = "BLAH!";
private static final String IMAGE_SRC_URL = "http://www.blah.com/image.jpg";
private static final String IMAGE_TITLE_TEXT = "IMAGE!";
@Rule
public Features.Processor mFeaturesProcessor = new Features.Processor();
@Mock
private ContextMenuItemDelegate mItemDelegate;
@Mock
private TemplateUrlService mTemplateUrlService;
private ChromeContextMenuPopulator mPopulator;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
ContextUtils.initApplicationContextForTests(RuntimeEnvironment.application);
doReturn(PAGE_URL).when(mItemDelegate).getPageUrl();
initializePopulator(ChromeContextMenuPopulator.NORMAL_MODE);
}
private void initializePopulator(@ContextMenuMode int mode) {
mPopulator = Mockito.spy(new ChromeContextMenuPopulator(mItemDelegate, mode));
doReturn(true).when(mPopulator).isAcceptedScheme(Mockito.anyString());
doReturn(true).when(mPopulator).isDownloadableScheme(Mockito.anyString());
doReturn(mTemplateUrlService).when(mPopulator).getTemplateUrlService();
}
@Test
public void testBeforeFRE_Link() {
FirstRunStatus.setFirstRunFlowComplete(false);
final ContextMenuParams contextMenuParams = createLinkContextParams();
List<ContextMenuItem> enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(enabledItems,
Matchers.containsInAnyOrder(
ContextMenuItem.COPY_LINK_ADDRESS, ContextMenuItem.COPY_LINK_TEXT));
initializePopulator(ChromeContextMenuPopulator.CUSTOM_TAB_MODE);
enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(enabledItems,
Matchers.containsInAnyOrder(
ContextMenuItem.COPY_LINK_ADDRESS, ContextMenuItem.COPY_LINK_TEXT));
initializePopulator(ChromeContextMenuPopulator.FULLSCREEN_TAB_MODE);
enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(enabledItems,
Matchers.containsInAnyOrder(
ContextMenuItem.COPY_LINK_ADDRESS, ContextMenuItem.COPY_LINK_TEXT));
}
@Test
public void testBeforeFRE_Image() {
FirstRunStatus.setFirstRunFlowComplete(false);
final ContextMenuParams contextMenuParams = createImageContextParams();
List<ContextMenuItem> enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(enabledItems, Matchers.empty());
initializePopulator(ChromeContextMenuPopulator.CUSTOM_TAB_MODE);
enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(enabledItems, Matchers.empty());
initializePopulator(ChromeContextMenuPopulator.FULLSCREEN_TAB_MODE);
enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(enabledItems, Matchers.empty());
}
@Test
public void testBeforeFRE_ImageLink() {
FirstRunStatus.setFirstRunFlowComplete(false);
final ContextMenuParams contextMenuParams = createImageLinkContextParams();
List<ContextMenuItem> enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(
enabledItems, Matchers.containsInAnyOrder(ContextMenuItem.COPY_LINK_ADDRESS));
initializePopulator(ChromeContextMenuPopulator.CUSTOM_TAB_MODE);
enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(
enabledItems, Matchers.containsInAnyOrder(ContextMenuItem.COPY_LINK_ADDRESS));
initializePopulator(ChromeContextMenuPopulator.FULLSCREEN_TAB_MODE);
enabledItems = getEnabledItems(contextMenuParams);
Assert.assertThat(
enabledItems, Matchers.containsInAnyOrder(ContextMenuItem.COPY_LINK_ADDRESS));
}
private List<ContextMenuItem> getEnabledItems(ContextMenuParams params) {
List<Pair<Integer, List<ContextMenuItem>>> contextMenuState =
mPopulator.buildContextMenu(null, RuntimeEnvironment.application, params);
List<ContextMenuItem> enabledItems = new ArrayList<>();
for (int i = 0; i < contextMenuState.size(); i++) {
enabledItems.addAll(contextMenuState.get(i).second);
}
return enabledItems;
}
private static ContextMenuParams createLinkContextParams() {
return new ContextMenuParams(
0, PAGE_URL, LINK_URL, LINK_TEXT, "", "", "", false, null, false);
}
private static ContextMenuParams createImageContextParams() {
return new ContextMenuParams(ContextMenuParams.MediaType.MEDIA_TYPE_IMAGE, PAGE_URL, "", "",
IMAGE_SRC_URL, IMAGE_TITLE_TEXT, "", false, null, true);
}
private static ContextMenuParams createImageLinkContextParams() {
return new ContextMenuParams(ContextMenuParams.MediaType.MEDIA_TYPE_IMAGE, PAGE_URL,
PAGE_URL, LINK_URL, IMAGE_SRC_URL, IMAGE_TITLE_TEXT, "", false, null, true);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment