Commit 266b083e authored by Eric Stevenson's avatar Eric Stevenson Committed by Commit Bot

JNI refactor: @NativeMethods conversion for more //chrome classes.

This CL was partially generated by
//base/android/jni_generator/jni_refactorer.py.

Two classes converted in this CL:
  * UrlUtilities.java
  * DevUiModuleProvider.java

The tests were manually refactored to not use robolectric shadows
for UrlUtilities native methods.

Bug: 929661
Change-Id: Id3fbe2f7e53f3c0aa454aa51e1e94a2a6f0f1cb6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1815344Reviewed-by: default avatarTibor Goldschwendt <tiborg@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Commit-Queue: Eric Stevenson <estevenson@chromium.org>
Auto-Submit: Eric Stevenson <estevenson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#698556}
parent 44b4f630
......@@ -10,7 +10,7 @@ import androidx.annotation.Nullable;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import java.net.MalformedURLException;
import java.net.URL;
......@@ -234,7 +234,7 @@ class ContextualSearchRequest {
*/
@VisibleForTesting
boolean isGoogleUrl(@Nullable String someUrl) {
return !TextUtils.isEmpty(someUrl) && UrlUtilities.nativeIsGoogleSubDomainUrl(someUrl);
return !TextUtils.isEmpty(someUrl) && UrlUtilitiesJni.get().isGoogleSubDomainUrl(someUrl);
}
/**
......
......@@ -45,6 +45,7 @@ import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.tab.TabObserverRegistrar;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.content_public.browser.UiThreadTaskTraits;
import org.chromium.content_public.browser.WebContents;
......@@ -422,7 +423,7 @@ public class DynamicModuleCoordinator implements NativeInitObserver, Destroyable
if (!UrlConstants.HTTPS_SCHEME.equals(scheme)) {
return false;
}
if (!UrlUtilities.nativeIsGoogleDomainUrl(url, sAllowNonStandardPortNumber)) {
if (!UrlUtilitiesJni.get().isGoogleDomainUrl(url, sAllowNonStandardPortNumber)) {
return false;
}
return true;
......
......@@ -48,6 +48,7 @@ import org.chromium.chrome.browser.tab.TabRedirectHandler;
import org.chromium.chrome.browser.util.IntentUtils;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import org.chromium.chrome.browser.webapps.WebappActivity;
import org.chromium.chrome.browser.webapps.WebappScopePolicy;
import org.chromium.content_public.browser.LoadUrlParams;
......@@ -633,7 +634,7 @@ public class ExternalNavigationDelegateImpl implements ExternalNavigationDelegat
NavigationEntry entry = nController.getEntryAtIndex(index);
if (entry == null) return false;
return UrlUtilities.nativeIsGoogleSearchUrl(entry.getUrl());
return UrlUtilitiesJni.get().isGoogleSearchUrl(entry.getUrl());
}
@Override
......
......@@ -21,7 +21,7 @@ import org.chromium.chrome.browser.AppHooks;
import org.chromium.chrome.browser.feedback.FeedbackCollector;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import javax.annotation.Nonnull;
......@@ -138,7 +138,7 @@ public class HelpAndFeedback {
} else if (url.equals(UrlConstants.HISTORY_URL)) {
return context.getString(R.string.help_context_history);
// Note: For www.google.com the following function returns false.
} else if (UrlUtilities.nativeIsGoogleSearchUrl(url)) {
} else if (UrlUtilitiesJni.get().isGoogleSearchUrl(url)) {
return context.getString(R.string.help_context_search_results);
// For incognito NTP, we want to show incognito help.
} else if (isIncognito) {
......
......@@ -21,7 +21,7 @@ import org.chromium.chrome.browser.rappor.RapporServiceBridge;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import org.chromium.net.NetworkChangeNotifier;
import org.chromium.ui.base.PageTransition;
......@@ -176,7 +176,7 @@ public final class NewTabPageUma {
if ((transitionType & PageTransition.CORE_MASK) == PageTransition.GENERATED) {
recordAction(ACTION_SEARCHED_USING_OMNIBOX);
} else {
if (UrlUtilities.nativeIsGoogleHomePageUrl(destinationUrl)) {
if (UrlUtilitiesJni.get().isGoogleHomePageUrl(destinationUrl)) {
recordAction(ACTION_NAVIGATED_TO_GOOGLE_HOMEPAGE);
} else {
recordAction(ACTION_NAVIGATED_USING_OMNIBOX);
......
......@@ -33,7 +33,7 @@ import org.chromium.chrome.browser.preferences.website.PermissionInfo;
import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.UrlConstants;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
......@@ -250,7 +250,7 @@ public class GeolocationHeader {
if (isIncognito) return HeaderState.INCOGNITO;
// Only send X-Geo header to Google domains.
if (!UrlUtilities.nativeIsGoogleSearchUrl(url)) return HeaderState.UNSUITABLE_URL;
if (!UrlUtilitiesJni.get().isGoogleSearchUrl(url)) return HeaderState.UNSUITABLE_URL;
Uri uri = Uri.parse(url);
if (!UrlConstants.HTTPS_SCHEME.equals(uri.getScheme())) return HeaderState.NOT_HTTPS;
......
......@@ -26,11 +26,15 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.test.ShadowUrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.testing.local.LocalRobolectricTestRunner;
......@@ -39,9 +43,8 @@ import org.chromium.testing.local.LocalRobolectricTestRunner;
* properly loaded in Custom Tabs in different conditions.
*/
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowUrlUtilities.class})
@Config(manifest = Config.NONE)
public class CustomTabActivityUrlLoadingTest {
@Rule
public final CustomTabActivityContentTestEnvironment env =
new CustomTabActivityContentTestEnvironment();
......@@ -50,8 +53,16 @@ public class CustomTabActivityUrlLoadingTest {
private CustomTabActivityNavigationController mNavigationController;
private CustomTabIntentHandler mIntentHandler;
@Rule
public JniMocker mocker = new JniMocker();
@Mock
UrlUtilities.Natives mUrlUtilitiesJniMock;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mocker.mock(UrlUtilitiesJni.TEST_HOOKS, mUrlUtilitiesJniMock);
mTabController = env.createTabController();
mNavigationController = env.createNavigationController(mTabController);
mIntentHandler = env.createIntentHandler(mNavigationController);
......
......@@ -32,7 +32,6 @@ import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordHistogramJni;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.omnibox.geo.GeolocationHeaderUnitTest.ShadowUrlUtilities;
import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleCell;
import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleWifi;
import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
......@@ -40,6 +39,7 @@ import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridgeJni;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.util.UrlUtilitiesJni;
import org.chromium.chrome.test.util.browser.Features;
import java.util.Arrays;
......@@ -49,7 +49,7 @@ import java.util.HashSet;
* Robolectric tests for {@link GeolocationHeader}.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowUrlUtilities.class})
@Config(manifest = Config.NONE)
public class GeolocationHeaderUnitTest {
private static final String SEARCH_URL = "https://www.google.com/search?q=potatoes";
......@@ -102,10 +102,13 @@ public class GeolocationHeaderUnitTest {
public JniMocker mocker = new JniMocker();
@Mock
RecordHistogram.Natives mRecordHistogramMock;
RecordHistogram.Natives mRecordHistogramJniMock;
@Mock
WebsitePreferenceBridge.Natives mWebsitePreferenceBridgeMock;
UrlUtilities.Natives mUrlUtilitiesJniMock;
@Mock
WebsitePreferenceBridge.Natives mWebsitePreferenceBridgeJniMock;
@Mock
private Tab mTab;
......@@ -113,19 +116,21 @@ public class GeolocationHeaderUnitTest {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mocker.mock(RecordHistogramJni.TEST_HOOKS, mRecordHistogramMock);
mocker.mock(WebsitePreferenceBridgeJni.TEST_HOOKS, mWebsitePreferenceBridgeMock);
mocker.mock(RecordHistogramJni.TEST_HOOKS, mRecordHistogramJniMock);
mocker.mock(UrlUtilitiesJni.TEST_HOOKS, mUrlUtilitiesJniMock);
mocker.mock(WebsitePreferenceBridgeJni.TEST_HOOKS, mWebsitePreferenceBridgeJniMock);
GeolocationTracker.setLocationAgeForTesting(null);
GeolocationHeader.setLocationSourceForTesting(
GeolocationHeader.LocationSource.HIGH_ACCURACY);
GeolocationHeader.setAppPermissionGrantedForTesting(true);
when(mTab.isIncognito()).thenReturn(false);
when(mWebsitePreferenceBridgeMock.getGeolocationSettingForOrigin(
when(mWebsitePreferenceBridgeJniMock.getGeolocationSettingForOrigin(
anyString(), anyString(), anyBoolean()))
.thenReturn(ContentSettingValues.ALLOW);
when(mWebsitePreferenceBridgeMock.isPermissionControlledByDSE(
when(mWebsitePreferenceBridgeJniMock.isPermissionControlledByDSE(
anyInt(), anyString(), anyBoolean()))
.thenReturn(true);
when(mUrlUtilitiesJniMock.isGoogleSearchUrl(anyString())).thenReturn(true);
sRefreshVisibleNetworksRequests = 0;
sRefreshLastKnownLocation = 0;
}
......@@ -297,28 +302,6 @@ public class GeolocationHeaderUnitTest {
return location;
}
/**
* Shadow for UrlUtilities
*/
@Implements(UrlUtilities.class)
public static class ShadowUrlUtilities {
@Implementation
public static boolean nativeIsGoogleSearchUrl(String url) {
return true;
}
}
/**
* Shadow for RecordHistogram
*/
@Implements(RecordHistogram.class)
public static class ShadowRecordHistogram {
@Implementation
public static void recordEnumeratedHistogram(String name, int sample, int boundary) {
// Noop.
}
}
/**
* Shadow for VisibleNetworksTracker
*/
......
......@@ -7,9 +7,11 @@ import("//build/config/android/rules.gni")
android_library("java") {
deps = [
"//base:base_java",
"//base:jni_java",
"//chrome/android/features/dev_ui/public:java",
"//components/module_installer/android:module_installer_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
java_files = [
"java/src/org/chromium/chrome/features/dev_ui/DevUiModuleProvider.java",
]
......
......@@ -7,6 +7,7 @@ package org.chromium.chrome.features.dev_ui;
import org.chromium.base.Log;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.annotations.UsedByReflection;
/** Helpers for DevUI DFM installation. */
......@@ -32,7 +33,8 @@ public class DevUiModuleProvider {
DevUiModule.install((success) -> {
Log.i(TAG, "Install status: %s", success);
if (mNativeDevUiModuleProvider != 0) {
nativeOnInstallResult(mNativeDevUiModuleProvider, success);
DevUiModuleProviderJni.get().onInstallResult(
mNativeDevUiModuleProvider, DevUiModuleProvider.this, success);
}
});
}
......@@ -42,5 +44,9 @@ public class DevUiModuleProvider {
mNativeDevUiModuleProvider = 0;
}
private native void nativeOnInstallResult(long nativeDevUiModuleProvider, boolean success);
@NativeMethods
interface Natives {
void onInstallResult(
long nativeDevUiModuleProvider, DevUiModuleProvider caller, boolean success);
}
}
......@@ -7,11 +7,13 @@ import("//build/config/android/rules.gni")
android_library("java") {
deps = [
"//base:base_java",
"//base:jni_java",
"//content/public/android:content_java",
"//third_party/android_deps:com_android_support_collections_java",
"//third_party/android_deps:com_android_support_support_compat_java",
"//third_party/android_deps:com_android_support_support_core_utils_java",
]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
java_files = [
"java/src/org/chromium/chrome/browser/util/BitmapCache.java",
"java/src/org/chromium/chrome/browser/util/ConversionUtils.java",
......
......@@ -12,6 +12,7 @@ import androidx.annotation.NonNull;
import org.chromium.base.CollectionUtil;
import org.chromium.base.Log;
import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.content_public.common.ContentUrlConstants;
import java.io.UnsupportedEncodingException;
......@@ -76,7 +77,7 @@ public class UrlUtilities {
* @return True if the URI's scheme is one that ContentView can handle.
*/
public static boolean isAcceptedScheme(String uri) {
return nativeIsAcceptedScheme(uri);
return UrlUtilitiesJni.get().isAcceptedScheme(uri);
}
/**
......@@ -85,7 +86,7 @@ public class UrlUtilities {
* @return True if the URI is valid for Intent fallback navigation.
*/
public static boolean isValidForIntentFallbackNavigation(String uri) {
return nativeIsValidForIntentFallbackNavigation(uri);
return UrlUtilitiesJni.get().isValidForIntentFallbackNavigation(uri);
}
/**
......@@ -94,7 +95,7 @@ public class UrlUtilities {
* @return True if the URI's scheme is one that Chrome can download.
*/
public static boolean isDownloadableScheme(String uri) {
return nativeIsDownloadable(uri);
return UrlUtilitiesJni.get().isDownloadable(uri);
}
/**
......@@ -145,7 +146,8 @@ public class UrlUtilities {
*/
public static boolean sameDomainOrHost(
String primaryUrl, String secondaryUrl, boolean includePrivateRegistries) {
return nativeSameDomainOrHost(primaryUrl, secondaryUrl, includePrivateRegistries);
return UrlUtilitiesJni.get().sameDomainOrHost(
primaryUrl, secondaryUrl, includePrivateRegistries);
}
/**
......@@ -162,27 +164,27 @@ public class UrlUtilities {
*/
public static String getDomainAndRegistry(String uri, boolean includePrivateRegistries) {
if (TextUtils.isEmpty(uri)) return uri;
return nativeGetDomainAndRegistry(uri, includePrivateRegistries);
return UrlUtilitiesJni.get().getDomainAndRegistry(uri, includePrivateRegistries);
}
/** Returns whether a URL is within another URL's scope. */
@VisibleForTesting
public static boolean isUrlWithinScope(String url, String scopeUrl) {
return nativeIsUrlWithinScope(url, scopeUrl);
return UrlUtilitiesJni.get().isUrlWithinScope(url, scopeUrl);
}
/** @return whether two URLs match, ignoring the #fragment. */
@VisibleForTesting
public static boolean urlsMatchIgnoringFragments(String url, String url2) {
if (TextUtils.equals(url, url2)) return true;
return nativeUrlsMatchIgnoringFragments(url, url2);
return UrlUtilitiesJni.get().urlsMatchIgnoringFragments(url, url2);
}
/** @return whether the #fragmant differs in two URLs. */
@VisibleForTesting
public static boolean urlsFragmentsDiffer(String url, String url2) {
if (TextUtils.equals(url, url2)) return false;
return nativeUrlsFragmentsDiffer(url, url2);
return UrlUtilitiesJni.get().urlsFragmentsDiffer(url, url2);
}
/**
......@@ -358,23 +360,28 @@ public class UrlUtilities {
return noScheme;
}
private static native boolean nativeIsDownloadable(String url);
private static native boolean nativeIsValidForIntentFallbackNavigation(String url);
private static native boolean nativeIsAcceptedScheme(String url);
private static native boolean nativeSameDomainOrHost(
String primaryUrl, String secondaryUrl, boolean includePrivateRegistries);
private static native String nativeGetDomainAndRegistry(
String url, boolean includePrivateRegistries);
/** Returns whether the given URL uses the Google.com domain. */
public static native boolean nativeIsGoogleDomainUrl(String url, boolean allowNonStandardPort);
/** Returns whether the given URL is a Google.com domain or sub-domain. */
public static native boolean nativeIsGoogleSubDomainUrl(String url);
/** Returns whether the given URL is a Google.com Search URL. */
public static native boolean nativeIsGoogleSearchUrl(String url);
/** Returns whether the given URL is the Google Web Search URL. */
public static native boolean nativeIsGoogleHomePageUrl(String url);
private static native boolean nativeIsUrlWithinScope(String url, String scopeUrl);
private static native boolean nativeUrlsMatchIgnoringFragments(String url, String url2);
private static native boolean nativeUrlsFragmentsDiffer(String url, String url2);
@NativeMethods
public interface Natives {
boolean isDownloadable(String url);
boolean isValidForIntentFallbackNavigation(String url);
boolean isAcceptedScheme(String url);
boolean sameDomainOrHost(
String primaryUrl, String secondaryUrl, boolean includePrivateRegistries);
String getDomainAndRegistry(String url, boolean includePrivateRegistries);
/** Returns whether the given URL uses the Google.com domain. */
boolean isGoogleDomainUrl(String url, boolean allowNonStandardPort);
/** Returns whether the given URL is a Google.com domain or sub-domain. */
boolean isGoogleSubDomainUrl(String url);
/** Returns whether the given URL is a Google.com Search URL. */
boolean isGoogleSearchUrl(String url);
/** Returns whether the given URL is the Google Web Search URL. */
boolean isGoogleHomePageUrl(String url);
boolean isUrlWithinScope(String url, String scopeUrl);
boolean urlsMatchIgnoringFragments(String url, String url2);
boolean urlsFragmentsDiffer(String url, String url2);
}
}
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