Commit 8bed3c10 authored by Peter E Conn's avatar Peter E Conn Committed by Commit Bot

Read experiment ids from Intent.

This CL builds on:
  https://chromium-review.googlesource.com/c/chromium/src/+/2324172

Change-Id: I5bb5544411ce5e88f8f5dd7dd3fe5aeb2c27f5e5
Bug: 1111941
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2338934
Auto-Submit: Peter Conn <peconn@chromium.org>
Reviewed-by: default avatarAlexei Svitkine <asvitkine@chromium.org>
Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Reviewed-by: default avatarPeter Beverloo <peter@chromium.org>
Commit-Queue: Peter Conn <peconn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795887}
parent f13329d9
...@@ -500,4 +500,9 @@ public abstract class BrowserServicesIntentDataProvider { ...@@ -500,4 +500,9 @@ public abstract class BrowserServicesIntentDataProvider {
public int getTwaDisclosureUi() { public int getTwaDisclosureUi() {
return TwaDisclosureUi.DEFAULT; return TwaDisclosureUi.DEFAULT;
} }
@Nullable
public int[] getGsaExperimentIds() {
return null;
}
} }
...@@ -157,6 +157,9 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid ...@@ -157,6 +157,9 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
+ "To make locally-built Chrome a first-party app, sign with release-test " + "To make locally-built Chrome a first-party app, sign with release-test "
+ "signing keys and run on userdebug devices. See use_signing_keys GN arg."; + "signing keys and run on userdebug devices. See use_signing_keys GN arg.";
private static final String EXPERIMENT_IDS =
"org.chromium.chrome.browser.customtabs.AGA_EXPERIMENT_IDS";
private final Intent mIntent; private final Intent mIntent;
private final CustomTabsSessionToken mSession; private final CustomTabsSessionToken mSession;
private final boolean mIsTrustedIntent; private final boolean mIsTrustedIntent;
...@@ -209,6 +212,9 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid ...@@ -209,6 +212,9 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
private final String mTranslateLanguage; private final String mTranslateLanguage;
private final int mDefaultOrientation; private final int mDefaultOrientation;
@Nullable
private final int[] mGsaExperimentIds;
/** /**
* Add extras to customize menu items for opening payment request UI custom tab from Chrome. * Add extras to customize menu items for opening payment request UI custom tab from Chrome.
*/ */
...@@ -354,6 +360,8 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid ...@@ -354,6 +360,8 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
mDefaultOrientation = convertOrientationType(IntentUtils.safeGetIntExtra(intent, mDefaultOrientation = convertOrientationType(IntentUtils.safeGetIntExtra(intent,
TrustedWebActivityIntentBuilder.EXTRA_SCREEN_ORIENTATION, TrustedWebActivityIntentBuilder.EXTRA_SCREEN_ORIENTATION,
ScreenOrientation.DEFAULT)); ScreenOrientation.DEFAULT));
mGsaExperimentIds = IntentUtils.safeGetIntArrayExtra(intent, EXPERIMENT_IDS);
} }
/** /**
...@@ -857,4 +865,10 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid ...@@ -857,4 +865,10 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid
return version; return version;
} }
@Override
@Nullable
public int[] getGsaExperimentIds() {
return mGsaExperimentIds;
}
} }
...@@ -1607,6 +1607,11 @@ public class CustomTabsConnection { ...@@ -1607,6 +1607,11 @@ public class CustomTabsConnection {
sessionToken, uri, purpose, extras); sessionToken, uri, purpose, extras);
} }
@VisibleForTesting
public static void setInstanceForTesting(CustomTabsConnection connection) {
sInstance = connection;
}
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void createAndStartDetachedResourceRequest(Profile profile, CustomTabsSessionToken session, void createAndStartDetachedResourceRequest(Profile profile, CustomTabsSessionToken session,
......
...@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.dependency_injection.ActivityScope; ...@@ -41,6 +41,7 @@ import org.chromium.chrome.browser.dependency_injection.ActivityScope;
import org.chromium.chrome.browser.init.StartupTabPreloader; import org.chromium.chrome.browser.init.StartupTabPreloader;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.lifecycle.InflationObserver; import org.chromium.chrome.browser.lifecycle.InflationObserver;
import org.chromium.chrome.browser.metrics.UmaSessionStats;
import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.RedirectHandlerTabHelper; import org.chromium.chrome.browser.tab.RedirectHandlerTabHelper;
...@@ -86,6 +87,8 @@ public class CustomTabActivityTabController implements InflationObserver { ...@@ -86,6 +87,8 @@ public class CustomTabActivityTabController implements InflationObserver {
int NUM_ENTRIES = 4; int NUM_ENTRIES = 4;
} }
private static final String GSA_STUDY_NAME = "GsaExperiments";
private final Lazy<CustomTabDelegateFactory> mCustomTabDelegateFactory; private final Lazy<CustomTabDelegateFactory> mCustomTabDelegateFactory;
private final ChromeActivity<?> mActivity; private final ChromeActivity<?> mActivity;
private final CustomTabsConnection mConnection; private final CustomTabsConnection mConnection;
...@@ -383,6 +386,16 @@ public class CustomTabActivityTabController implements InflationObserver { ...@@ -383,6 +386,16 @@ public class CustomTabActivityTabController implements InflationObserver {
} }
private Tab createTab() { private Tab createTab() {
// At this point we know native has been loaded, but we haven't kicked off a navigation yet.
// Experiment ids for GSA are normally set a bit later in the process, but this resulted in
// them being absent for the initial request. We set them here early.
int[] experimentIds = mIntentDataProvider.getGsaExperimentIds();
if (experimentIds != null) {
// When ids are set through the intent, we don't want them to override the existing ids.
boolean override = false;
UmaSessionStats.registerExternalExperiment(GSA_STUDY_NAME, experimentIds, override);
}
WebContents webContents = takeWebContents(); WebContents webContents = takeWebContents();
// clang-format off // clang-format off
Tab tab = mTabFactory.createTab(webContents, mCustomTabDelegateFactory.get(), Tab tab = mTabFactory.createTab(webContents, mCustomTabDelegateFactory.get(),
......
...@@ -209,8 +209,16 @@ public class UmaSessionStats { ...@@ -209,8 +209,16 @@ public class UmaSessionStats {
} }
public static void registerExternalExperiment(String fallbackStudyName, int[] experimentIds) { public static void registerExternalExperiment(String fallbackStudyName, int[] experimentIds) {
// TODO(https://crbug.com/1111941): Remove this method once all callers have moved onto
// the overload below.
registerExternalExperiment(fallbackStudyName, experimentIds, true);
}
public static void registerExternalExperiment(
String fallbackStudyName, int[] experimentIds, boolean overrideExistingIds) {
assert isMetricsServiceAvailable(); assert isMetricsServiceAvailable();
UmaSessionStatsJni.get().registerExternalExperiment(fallbackStudyName, experimentIds); UmaSessionStatsJni.get().registerExternalExperiment(
fallbackStudyName, experimentIds, overrideExistingIds);
} }
public static void registerSyntheticFieldTrial(String trialName, String groupName) { public static void registerSyntheticFieldTrial(String trialName, String groupName) {
...@@ -246,7 +254,8 @@ public class UmaSessionStats { ...@@ -246,7 +254,8 @@ public class UmaSessionStats {
void updateMetricsServiceState(boolean mayUpload); void updateMetricsServiceState(boolean mayUpload);
void umaResumeSession(long nativeUmaSessionStats, UmaSessionStats caller); void umaResumeSession(long nativeUmaSessionStats, UmaSessionStats caller);
void umaEndSession(long nativeUmaSessionStats, UmaSessionStats caller); void umaEndSession(long nativeUmaSessionStats, UmaSessionStats caller);
void registerExternalExperiment(String studyName, int[] experimentIds); void registerExternalExperiment(
String studyName, int[] experimentIds, boolean overrideExistingIds);
void registerSyntheticFieldTrial(String trialName, String groupName); void registerSyntheticFieldTrial(String trialName, String groupName);
void recordTabCountPerLoad(int numTabsOpen); void recordTabCountPerLoad(int numTabsOpen);
void recordPageLoaded(boolean isDesktopUserAgent); void recordPageLoaded(boolean isDesktopUserAgent);
......
...@@ -112,6 +112,10 @@ public class CustomTabActivityContentTestEnvironment extends TestWatcher { ...@@ -112,6 +112,10 @@ public class CustomTabActivityContentTestEnvironment extends TestWatcher {
protected void starting(Description description) { protected void starting(Description description) {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
// There are a number of places that call CustomTabsConnection.getInstance(), which would
// otherwise result in a real CustomTabsConnection being created.
CustomTabsConnection.setInstanceForTesting(connection);
tabFromFactory = prepareTab(); tabFromFactory = prepareTab();
when(intentDataProvider.getIntent()).thenReturn(intent); when(intentDataProvider.getIntent()).thenReturn(intent);
......
...@@ -276,7 +276,8 @@ static void JNI_UmaSessionStats_UpdateMetricsServiceState( ...@@ -276,7 +276,8 @@ static void JNI_UmaSessionStats_UpdateMetricsServiceState(
static void JNI_UmaSessionStats_RegisterExternalExperiment( static void JNI_UmaSessionStats_RegisterExternalExperiment(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jstring>& jfallback_study_name, const JavaParamRef<jstring>& jfallback_study_name,
const JavaParamRef<jintArray>& jexperiment_ids) { const JavaParamRef<jintArray>& jexperiment_ids,
jboolean override_existing_ids) {
std::string fallback_study_name( std::string fallback_study_name(
ConvertJavaStringToUTF8(env, jfallback_study_name)); ConvertJavaStringToUTF8(env, jfallback_study_name));
std::vector<int> experiment_ids; std::vector<int> experiment_ids;
...@@ -286,11 +287,15 @@ static void JNI_UmaSessionStats_RegisterExternalExperiment( ...@@ -286,11 +287,15 @@ static void JNI_UmaSessionStats_RegisterExternalExperiment(
&experiment_ids); &experiment_ids);
} }
auto override_mode =
override_existing_ids
? variations::SyntheticTrialRegistry::kOverrideExistingIds
: variations::SyntheticTrialRegistry::kDoNotOverrideExistingIds;
g_browser_process->metrics_service() g_browser_process->metrics_service()
->synthetic_trial_registry() ->synthetic_trial_registry()
->RegisterExternalExperiments( ->RegisterExternalExperiments(fallback_study_name, experiment_ids,
fallback_study_name, experiment_ids, override_mode);
variations::SyntheticTrialRegistry::kOverrideExistingIds);
} }
static void JNI_UmaSessionStats_RegisterSyntheticFieldTrial( static void JNI_UmaSessionStats_RegisterSyntheticFieldTrial(
......
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