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,6 +249,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -249,6 +249,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
ContextMenu menu, Context context, ContextMenuParams params) { ContextMenu menu, Context context, ContextMenuParams params) {
// Add all items in a group // Add all items in a group
Set<ContextMenuItem> supportedOptions = new HashSet<>(); Set<ContextMenuItem> supportedOptions = new HashSet<>();
if (FirstRunStatus.getFirstRunFlowComplete()) {
supportedOptions.addAll(BASE_WHITELIST); supportedOptions.addAll(BASE_WHITELIST);
if (mMode == FULLSCREEN_TAB_MODE) { if (mMode == FULLSCREEN_TAB_MODE) {
supportedOptions.addAll(FULLSCREEN_TAB_MODE_WHITELIST); supportedOptions.addAll(FULLSCREEN_TAB_MODE_WHITELIST);
...@@ -257,6 +258,11 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -257,6 +258,11 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
} else { } else {
supportedOptions.addAll(NORMAL_MODE_WHITELIST); supportedOptions.addAll(NORMAL_MODE_WHITELIST);
} }
} else {
supportedOptions.add(ContextMenuItem.COPY_LINK_ADDRESS);
supportedOptions.add(ContextMenuItem.COPY_LINK_TEXT);
supportedOptions.add(ContextMenuItem.COPY);
}
Set<ContextMenuItem> disabledOptions = getDisabledOptions(params); Set<ContextMenuItem> disabledOptions = getDisabledOptions(params);
// Split the items into their respective groups. // Split the items into their respective groups.
...@@ -400,7 +406,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -400,7 +406,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
disabledOptions.add(ContextMenuItem.COPY_LINK_TEXT); 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_OTHER_WINDOW);
disabledOptions.add(ContextMenuItem.OPEN_IN_NEW_TAB); disabledOptions.add(ContextMenuItem.OPEN_IN_NEW_TAB);
disabledOptions.add(ContextMenuItem.OPEN_IN_INCOGNITO_TAB); disabledOptions.add(ContextMenuItem.OPEN_IN_INCOGNITO_TAB);
...@@ -437,11 +443,11 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -437,11 +443,11 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
} }
} }
if (!UrlUtilities.isDownloadableScheme(params.getLinkUrl())) { if (!isDownloadableScheme(params.getLinkUrl())) {
disabledOptions.add(ContextMenuItem.SAVE_LINK_AS); disabledOptions.add(ContextMenuItem.SAVE_LINK_AS);
} }
boolean isSrcDownloadableScheme = UrlUtilities.isDownloadableScheme(params.getSrcUrl()); boolean isSrcDownloadableScheme = isDownloadableScheme(params.getSrcUrl());
if (params.isVideo()) { if (params.isVideo()) {
boolean saveableAndDownloadable = params.canSaveMedia() && isSrcDownloadableScheme; boolean saveableAndDownloadable = params.canSaveMedia() && isSrcDownloadableScheme;
if (!saveableAndDownloadable) { if (!saveableAndDownloadable) {
...@@ -467,7 +473,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -467,7 +473,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
if (mDelegate.getPageUrl().equals(params.getSrcUrl())) { if (mDelegate.getPageUrl().equals(params.getSrcUrl())) {
disabledOptions.add(ContextMenuItem.OPEN_IMAGE); disabledOptions.add(ContextMenuItem.OPEN_IMAGE);
} }
final TemplateUrlService templateUrlServiceInstance = TemplateUrlService.getInstance(); final TemplateUrlService templateUrlServiceInstance = getTemplateUrlService();
final boolean isSearchByImageAvailable = isSrcDownloadableScheme final boolean isSearchByImageAvailable = isSrcDownloadableScheme
&& templateUrlServiceInstance.isLoaded() && templateUrlServiceInstance.isLoaded()
&& templateUrlServiceInstance.isSearchByImageAvailable() && templateUrlServiceInstance.isSearchByImageAvailable()
...@@ -478,16 +484,6 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -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) { if (mMode == CUSTOM_TAB_MODE) {
try { try {
URI uri = new URI(getUrl(params)); URI uri = new URI(getUrl(params));
...@@ -613,6 +609,27 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { ...@@ -613,6 +609,27 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
return true; 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. * Checks whether a url is empty or blank.
* @param url The url need to be checked. * @param url The url need to be checked.
......
...@@ -20,7 +20,7 @@ import org.chromium.content_public.common.Referrer; ...@@ -20,7 +20,7 @@ import org.chromium.content_public.common.Referrer;
public class ContextMenuParams { public class ContextMenuParams {
/** Must correspond to the MediaType enum in WebKit/chromium/public/WebContextMenuData.h */ /** Must correspond to the MediaType enum in WebKit/chromium/public/WebContextMenuData.h */
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static interface MediaType { static interface MediaType {
public static final int MEDIA_TYPE_NONE = 0; public static final int MEDIA_TYPE_NONE = 0;
public static final int MEDIA_TYPE_IMAGE = 1; public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2; public static final int MEDIA_TYPE_VIDEO = 2;
......
...@@ -1676,6 +1676,7 @@ chrome_junit_test_java_sources = [ ...@@ -1676,6 +1676,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerTest.java", "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/ContextualSearchInternalStateTest.java",
"junit/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionControllerTest.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/cookies/CanonicalCookieTest.java",
"junit/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnableUnitTest.java", "junit/src/org/chromium/chrome/browser/crash/LogcatExtractionRunnableUnitTest.java",
"junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.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