Commit cdf90872 authored by Colin Blundell's avatar Colin Blundell Committed by Commit Bot

[Android] Create and use feature list for //components/external_intents

This CL eliminates the last //chrome dependence of
ExternalNavigationHandler.java, on ChromeFeatureList.java. To do so it
componentizes the one feature that ExternalNavigationHandler uses into
//components/external_intents via a minimal
ExternalIntentsFeatureList.java.

Bug: 1031465
Change-Id: If3c81a1d03516a4d71a98126c939255f74296616
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2096559
Commit-Queue: Colin Blundell <blundell@chromium.org>
Reviewed-by: default avatarHenrique Nakashima <hnakashima@chromium.org>
Reviewed-by: default avatarMichael Thiessen <mthiesse@chromium.org>
Cr-Commit-Position: refs/heads/master@{#749130}
parent 4d113f83
...@@ -26,9 +26,9 @@ import org.chromium.base.IntentUtils; ...@@ -26,9 +26,9 @@ import org.chromium.base.IntentUtils;
import org.chromium.base.Log; import org.chromium.base.Log;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.embedder_support.util.UrlUtilities;
import org.chromium.components.external_intents.ExternalIntentsFeatureList;
import org.chromium.components.external_intents.ExternalIntentsSwitches; import org.chromium.components.external_intents.ExternalIntentsSwitches;
import org.chromium.components.external_intents.ExternalNavigationParams; import org.chromium.components.external_intents.ExternalNavigationParams;
import org.chromium.components.external_intents.RedirectHandler; import org.chromium.components.external_intents.RedirectHandler;
...@@ -361,8 +361,8 @@ public class ExternalNavigationHandler { ...@@ -361,8 +361,8 @@ public class ExternalNavigationHandler {
/** Wrapper of check against the feature to support overriding for testing. */ /** Wrapper of check against the feature to support overriding for testing. */
@VisibleForTesting @VisibleForTesting
boolean blockExternalFormRedirectsWithoutGesture() { boolean blockExternalFormRedirectsWithoutGesture() {
return ChromeFeatureList.isEnabled( return ExternalIntentsFeatureList.isEnabled(
ChromeFeatureList.INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE); ExternalIntentsFeatureList.INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE);
} }
/** /**
......
...@@ -2999,6 +2999,7 @@ jumbo_static_library("browser") { ...@@ -2999,6 +2999,7 @@ jumbo_static_library("browser") {
"//components/crash/android:crash_android", "//components/crash/android:crash_android",
"//components/embedder_support/android:util", "//components/embedder_support/android:util",
"//components/embedder_support/android:web_contents_delegate", "//components/embedder_support/android:web_contents_delegate",
"//components/external_intents/android",
"//components/feed:buildflags", "//components/feed:buildflags",
"//components/feed:feature_list", "//components/feed:feature_list",
"//components/invalidation/impl:feature_list", "//components/invalidation/impl:feature_list",
......
...@@ -98,6 +98,7 @@ include_rules = [ ...@@ -98,6 +98,7 @@ include_rules = [
"+components/embedder_support", "+components/embedder_support",
"+components/encrypted_messages", "+components/encrypted_messages",
"+components/exo", "+components/exo",
"+components/external_intents",
"+components/favicon_base", "+components/favicon_base",
"+components/favicon/content", "+components/favicon/content",
"+components/favicon/core", "+components/favicon/core",
......
...@@ -177,6 +177,7 @@ ...@@ -177,6 +177,7 @@
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "chrome/browser/android/explore_sites/explore_sites_feature.h" #include "chrome/browser/android/explore_sites/explore_sites_feature.h"
#include "chrome/browser/flags/android/chrome_feature_list.h" #include "chrome/browser/flags/android/chrome_feature_list.h"
#include "components/external_intents/android/external_intents_feature_list.h"
#else // OS_ANDROID #else // OS_ANDROID
#include "chrome/browser/media/router/media_router_feature.h" #include "chrome/browser/media/router/media_router_feature.h"
#endif // OS_ANDROID #endif // OS_ANDROID
...@@ -4861,7 +4862,7 @@ const FeatureEntry kFeatureEntries[] = { ...@@ -4861,7 +4862,7 @@ const FeatureEntry kFeatureEntries[] = {
flag_descriptions::kIntentBlockExternalFormRedirectsNoGestureDescription, flag_descriptions::kIntentBlockExternalFormRedirectsNoGestureDescription,
kOsAndroid, kOsAndroid,
FEATURE_VALUE_TYPE( FEATURE_VALUE_TYPE(
chrome::android::kIntentBlockExternalFormRedirectsNoGesture)}, external_intents::kIntentBlockExternalFormRedirectsNoGesture)},
{"recover-from-never-save-android", {"recover-from-never-save-android",
flag_descriptions::kRecoverFromNeverSaveAndroidName, flag_descriptions::kRecoverFromNeverSaveAndroidName,
flag_descriptions::kRecoverFromNeverSaveAndroidDescription, kOsAndroid, flag_descriptions::kRecoverFromNeverSaveAndroidDescription, kOsAndroid,
......
...@@ -157,7 +157,6 @@ const base::Feature* kFeaturesExposedToJava[] = { ...@@ -157,7 +157,6 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kHorizontalTabSwitcherAndroid, &kHorizontalTabSwitcherAndroid,
&kImmersiveUiMode, &kImmersiveUiMode,
&kInlineUpdateFlow, &kInlineUpdateFlow,
&kIntentBlockExternalFormRedirectsNoGesture,
&kKitKatSupported, &kKitKatSupported,
&kNewPhotoPicker, &kNewPhotoPicker,
&kNotificationSuspender, &kNotificationSuspender,
...@@ -458,10 +457,6 @@ const base::Feature kImmersiveUiMode{"ImmersiveUiMode", ...@@ -458,10 +457,6 @@ const base::Feature kImmersiveUiMode{"ImmersiveUiMode",
const base::Feature kInlineUpdateFlow{"InlineUpdateFlow", const base::Feature kInlineUpdateFlow{"InlineUpdateFlow",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kIntentBlockExternalFormRedirectsNoGesture{
"IntentBlockExternalFormRedirectsNoGesture",
base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kKitKatSupported{"KitKatSupported", const base::Feature kKitKatSupported{"KitKatSupported",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
......
...@@ -78,7 +78,6 @@ extern const base::Feature kHorizontalTabSwitcherAndroid; ...@@ -78,7 +78,6 @@ extern const base::Feature kHorizontalTabSwitcherAndroid;
extern const base::Feature kImmersiveUiMode; extern const base::Feature kImmersiveUiMode;
extern const base::Feature kImprovedA2HS; extern const base::Feature kImprovedA2HS;
extern const base::Feature kInlineUpdateFlow; extern const base::Feature kInlineUpdateFlow;
extern const base::Feature kIntentBlockExternalFormRedirectsNoGesture;
extern const base::Feature kKitKatSupported; extern const base::Feature kKitKatSupported;
extern const base::Feature kLanguagesPreference; extern const base::Feature kLanguagesPreference;
extern const base::Feature kNewPhotoPicker; extern const base::Feature kNewPhotoPicker;
......
...@@ -310,8 +310,6 @@ public abstract class ChromeFeatureList { ...@@ -310,8 +310,6 @@ public abstract class ChromeFeatureList {
"ImprovedCookieControlsForThirdPartyCookieBlocking"; "ImprovedCookieControlsForThirdPartyCookieBlocking";
public static final String INLINE_UPDATE_FLOW = "InlineUpdateFlow"; public static final String INLINE_UPDATE_FLOW = "InlineUpdateFlow";
public static final String INSTALLABLE_AMBIENT_BADGE_INFOBAR = "InstallableAmbientBadgeInfoBar"; public static final String INSTALLABLE_AMBIENT_BADGE_INFOBAR = "InstallableAmbientBadgeInfoBar";
public static final String INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE =
"IntentBlockExternalFormRedirectsNoGesture";
public static final String INTEREST_FEED_CONTENT_SUGGESTIONS = "InterestFeedContentSuggestions"; public static final String INTEREST_FEED_CONTENT_SUGGESTIONS = "InterestFeedContentSuggestions";
public static final String INTEREST_FEED_FEEDBACK = "InterestFeedFeedback"; public static final String INTEREST_FEED_FEEDBACK = "InterestFeedFeedback";
public static final String KITKAT_SUPPORTED = "KitKatSupported"; public static final String KITKAT_SUPPORTED = "KitKatSupported";
......
...@@ -6,8 +6,31 @@ import("//build/config/android/rules.gni") ...@@ -6,8 +6,31 @@ import("//build/config/android/rules.gni")
android_library("java") { android_library("java") {
sources = [ sources = [
"java/src/org/chromium/components/external_intents/ExternalIntentsFeatureList.java",
"java/src/org/chromium/components/external_intents/ExternalIntentsSwitches.java", "java/src/org/chromium/components/external_intents/ExternalIntentsSwitches.java",
"java/src/org/chromium/components/external_intents/ExternalNavigationParams.java", "java/src/org/chromium/components/external_intents/ExternalNavigationParams.java",
"java/src/org/chromium/components/external_intents/RedirectHandler.java", "java/src/org/chromium/components/external_intents/RedirectHandler.java",
] ]
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
deps = [
"//base:base_java",
"//base:jni_java",
]
}
generate_jni("jni_headers") {
sources = [ "java/src/org/chromium/components/external_intents/ExternalIntentsFeatureList.java" ]
}
static_library("android") {
sources = [
"external_intents_feature_list.cc",
"external_intents_feature_list.h",
]
deps = [
":jni_headers",
"//base",
]
} }
// Copyright 2020 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.
#include "components/external_intents/android/external_intents_feature_list.h"
#include <jni.h>
#include <stddef.h>
#include <string>
#include "base/android/jni_string.h"
#include "components/external_intents/android/jni_headers/ExternalIntentsFeatureList_jni.h"
namespace external_intents {
namespace {
// Array of features exposed through the Java ExternalIntentsFeatureList API.
const base::Feature* kFeaturesExposedToJava[] = {
&kIntentBlockExternalFormRedirectsNoGesture,
};
const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
for (const auto* feature : kFeaturesExposedToJava) {
if (feature->name == feature_name)
return feature;
}
NOTREACHED()
<< "Queried feature cannot be found in ExternalIntentsFeatureList: "
<< feature_name;
return nullptr;
}
} // namespace
// Alphabetical:
const base::Feature kIntentBlockExternalFormRedirectsNoGesture{
"IntentBlockExternalFormRedirectsNoGesture",
base::FEATURE_DISABLED_BY_DEFAULT};
static jboolean JNI_ExternalIntentsFeatureList_IsInitialized(JNIEnv* env) {
return !!base::FeatureList::GetInstance();
}
static jboolean JNI_ExternalIntentsFeatureList_IsEnabled(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& jfeature_name) {
const base::Feature* feature = FindFeatureExposedToJava(
base::android::ConvertJavaStringToUTF8(env, jfeature_name));
return base::FeatureList::IsEnabled(*feature);
}
} // namespace external_intents
// Copyright 2020 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.
#ifndef COMPONENTS_EXTERNAL_INTENTS_ANDROID_EXTERNAL_INTENTS_FEATURE_LIST_H_
#define COMPONENTS_EXTERNAL_INTENTS_ANDROID_EXTERNAL_INTENTS_FEATURE_LIST_H_
#include "base/feature_list.h"
namespace external_intents {
// Alphabetical:
extern const base::Feature kIntentBlockExternalFormRedirectsNoGesture;
} // namespace external_intents
#endif // COMPONENTS_EXTERNAL_INTENTS_ANDROID_EXTERNAL_INTENTS_FEATURE_LIST_H_
// Copyright 2020 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.components.external_intents;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.MainDex;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.library_loader.LibraryLoader;
/**
* Java accessor for base/feature_list.h state.
*
* This class provides methods to access values of feature flags registered in
* |kFeaturesExposedToJava| in components/external_intents/android/external_intents_feature_list.cc.
*
*/
@JNINamespace("external_intents")
@MainDex
public abstract class ExternalIntentsFeatureList {
/** Prevent instantiation. */
private ExternalIntentsFeatureList() {}
/**
* @return Whether the native FeatureList is initialized or not.
*/
private static boolean isNativeInitialized() {
if (!LibraryLoader.getInstance().isInitialized()) return false;
// Even if the native library is loaded, the C++ FeatureList might not be initialized yet.
// In that case, accessing it will not immediately fail, but instead cause a crash later
// when it is initialized. Return whether the native FeatureList has been initialized,
// so the return value can be tested, or asserted for a more actionable stack trace
// on failure.
//
// The FeatureList is however guaranteed to be initialized by the time
// AsyncInitializationActivity#finishNativeInitialization is called.
return ExternalIntentsFeatureListJni.get().isInitialized();
}
/**
* Returns whether the specified feature is enabled or not.
*
* Note: Features queried through this API must be added to the array
* |kFeaturesExposedToJava| in
* components/external_intents/android/external_intents_feature_list.cc.
*
* Calling this has the side effect of bucketing this client, which may cause an experiment to
* be marked as active.
*
* Should be called only after native is loaded.
*
* @param featureName The name of the feature to query.
* @return Whether the feature is enabled or not.
*/
public static boolean isEnabled(String featureName) {
assert isNativeInitialized();
return ExternalIntentsFeatureListJni.get().isEnabled(featureName);
}
/** Alphabetical: */
public static final String INTENT_BLOCK_EXTERNAL_FORM_REDIRECT_NO_GESTURE =
"IntentBlockExternalFormRedirectsNoGesture";
@NativeMethods
interface Natives {
boolean isInitialized();
boolean isEnabled(String featureName);
}
}
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