Commit 58d10a96 authored by Mehran Mahmoudi's avatar Mehran Mahmoudi Committed by Commit Bot

[Paint Preview] Add capture experiment

This implements the logic for the paint preview capture experiment.
The experiment is behind a chrome flag that is disabled by default.
Experiment doc: http://go/fdt-sample-experiment

Bug: 1039810
Change-Id: I0b9db1ebe06d5b10da482ca1105c88d33afd1bc4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2044064Reviewed-by: default avatarHenrique Nakashima <hnakashima@chromium.org>
Reviewed-by: default avatarCalder Kitagawa <ckitagawa@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Commit-Queue: Mehran Mahmoudi <mahmoudi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743392}
parent 414a2324
...@@ -1211,6 +1211,8 @@ chrome_java_sources = [ ...@@ -1211,6 +1211,8 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java", "java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java",
"java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java", "java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java",
"java/src/org/chromium/chrome/browser/page_info/SystemSettingsActivityRequiredListener.java", "java/src/org/chromium/chrome/browser/page_info/SystemSettingsActivityRequiredListener.java",
"java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewExperiments.java",
"java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmark.java", "java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmark.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottle.java", "java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottle.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java", "java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java",
......
...@@ -390,7 +390,7 @@ public class CachedFeatureFlags { ...@@ -390,7 +390,7 @@ public class CachedFeatureFlags {
} }
/** /**
* @return Whether the Paint Preview tapture test is enabled * @return Whether the Paint Preview capture test is enabled.
*/ */
public static boolean isPaintPreviewTestEnabled() { public static boolean isPaintPreviewTestEnabled() {
return isEnabled(ChromeFeatureList.PAINT_PREVIEW_TEST); return isEnabled(ChromeFeatureList.PAINT_PREVIEW_TEST);
......
file://components/paint_preview/OWNERS
# COMPONENT: Internals>FreezeDriedTabs
// 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.chrome.browser.paint_preview;
import org.chromium.base.library_loader.LibraryLoader;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.components.paintpreview.browser.PaintPreviewUtils;
import org.chromium.content_public.browser.WebContents;
import java.util.Random;
/**
* Contains experiments related to the Paint Preview feature.
*/
public class PaintPreviewExperiments {
private static Random sRandom = new Random();
/**
* Param name for field trial param that determines capture experiment trigger probability
* threshold.
**/
private static final String CAPTURE_EXPERIMENT_TRIGGER_PROBABILITY_THRESHOLD =
"capture_trigger_probability_threshold";
/**
* Runs the Paint Preview capture experiment if the experiment is enabled and a probability
* threshold is met. The probability threshold is determined by a field trial param.
* @param contents The WebContents of the page to capture.
*/
public static void runCaptureExperiment(WebContents contents) {
// ChromeFeatureList and the Paint Preview component rely on native.
if (!LibraryLoader.getInstance().isInitialized()) {
return;
}
if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PAINT_PREVIEW_CAPTURE_EXPERIMENT)) {
return;
}
double captureTriggerProbabilityThreshold =
ChromeFeatureList.getFieldTrialParamByFeatureAsDouble(
ChromeFeatureList.PAINT_PREVIEW_CAPTURE_EXPERIMENT,
CAPTURE_EXPERIMENT_TRIGGER_PROBABILITY_THRESHOLD, 0);
if (sRandom.nextDouble() >= captureTriggerProbabilityThreshold) {
return;
}
PaintPreviewUtils.capturePaintPreview(contents);
}
}
// 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.chrome.browser.paint_preview;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.content_public.browser.NavigationHandle;
/**
* Manages the Paint Preview component for a given {@link Tab}. Destroyed together with the tab.
*/
public class PaintPreviewTabHelper extends EmptyTabObserver {
public static void createForTab(Tab tab) {
new PaintPreviewTabHelper(tab);
}
private PaintPreviewTabHelper(Tab tab) {
tab.addObserver(this);
}
@Override
public void onDestroyed(Tab tab) {
tab.removeObserver(this);
}
@Override
public void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) {
if (qualifiesForCapture(tab)) {
PaintPreviewExperiments.runCaptureExperiment(tab.getWebContents());
}
}
/**
* Checks whether a given {@link Tab} qualifies for Paint Preview capture.
*/
private boolean qualifiesForCapture(Tab tab) {
return !tab.isIncognito() && !tab.isNativePage() && !tab.isShowingErrorPage()
&& tab.getWebContents() != null;
}
}
...@@ -5,6 +5,7 @@ include_rules = [ ...@@ -5,6 +5,7 @@ include_rules = [
"+chrome/android/java/src/org/chromium/chrome/browser/TabHidingType.java", "+chrome/android/java/src/org/chromium/chrome/browser/TabHidingType.java",
"+chrome/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java", "+chrome/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java",
"+chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoUtils.java", "+chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoUtils.java",
"+chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java",
"+chrome/android/java/src/org/chromium/chrome/browser/previews/Previews.java", "+chrome/android/java/src/org/chromium/chrome/browser/previews/Previews.java",
"+chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java", "+chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java",
"+chrome/android/java/src/org/chromium/chrome/browser/tab", "+chrome/android/java/src/org/chromium/chrome/browser/tab",
......
...@@ -13,6 +13,7 @@ import org.chromium.chrome.browser.dom_distiller.TabDistillabilityProvider; ...@@ -13,6 +13,7 @@ import org.chromium.chrome.browser.dom_distiller.TabDistillabilityProvider;
import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.infobar.InfoBarContainer; import org.chromium.chrome.browser.infobar.InfoBarContainer;
import org.chromium.chrome.browser.media.ui.MediaSessionTabHelper; import org.chromium.chrome.browser.media.ui.MediaSessionTabHelper;
import org.chromium.chrome.browser.paint_preview.PaintPreviewTabHelper;
import org.chromium.chrome.browser.tab.TabUma.TabCreationState; import org.chromium.chrome.browser.tab.TabUma.TabCreationState;
import org.chromium.chrome.browser.tasks.TaskRecognizer; import org.chromium.chrome.browser.tasks.TaskRecognizer;
import org.chromium.content_public.browser.SelectionPopupController; import org.chromium.content_public.browser.SelectionPopupController;
...@@ -44,6 +45,7 @@ public final class TabHelpers { ...@@ -44,6 +45,7 @@ public final class TabHelpers {
MediaSessionTabHelper.createForTab(tab); MediaSessionTabHelper.createForTab(tab);
TaskTabHelper.createForTab(tab, parentTab); TaskTabHelper.createForTab(tab, parentTab);
TabBrowserControlsConstraintsHelper.createForTab(tab); TabBrowserControlsConstraintsHelper.createForTab(tab);
PaintPreviewTabHelper.createForTab(tab);
// TODO(jinsukkim): Do this by having something observe new tab creation. // TODO(jinsukkim): Do this by having something observe new tab creation.
if (tab.isIncognito()) CipherFactory.getInstance().triggerKeyGeneration(); if (tab.isIncognito()) CipherFactory.getInstance().triggerKeyGeneration();
......
...@@ -212,6 +212,7 @@ const base::Feature* kFeaturesExposedToJava[] = { ...@@ -212,6 +212,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kWebApkAdaptiveIcon, &kWebApkAdaptiveIcon,
&net::features::kSameSiteByDefaultCookies, &net::features::kSameSiteByDefaultCookies,
&net::features::kCookiesWithoutSameSiteMustBeSecure, &net::features::kCookiesWithoutSameSiteMustBeSecure,
&paint_preview::kPaintPreviewCaptureExperiment,
&paint_preview::kPaintPreviewTest, &paint_preview::kPaintPreviewTest,
&payments::features::kAlwaysAllowJustInTimePaymentApp, &payments::features::kAlwaysAllowJustInTimePaymentApp,
&payments::features::kPaymentRequestSkipToGPay, &payments::features::kPaymentRequestSkipToGPay,
......
...@@ -305,6 +305,7 @@ public abstract class ChromeFeatureList { ...@@ -305,6 +305,7 @@ public abstract class ChromeFeatureList {
public static final String OMNIBOX_SEARCH_ENGINE_LOGO = "OmniboxSearchEngineLogo"; public static final String OMNIBOX_SEARCH_ENGINE_LOGO = "OmniboxSearchEngineLogo";
public static final String OVERLAY_NEW_LAYOUT = "OverlayNewLayout"; public static final String OVERLAY_NEW_LAYOUT = "OverlayNewLayout";
public static final String OVERSCROLL_HISTORY_NAVIGATION = "OverscrollHistoryNavigation"; public static final String OVERSCROLL_HISTORY_NAVIGATION = "OverscrollHistoryNavigation";
public static final String PAINT_PREVIEW_CAPTURE_EXPERIMENT = "PaintPreviewCaptureExperiment";
public static final String PAINT_PREVIEW_TEST = "PaintPreviewTest"; public static final String PAINT_PREVIEW_TEST = "PaintPreviewTest";
public static final String PASSWORD_EDITING_ANDROID = "PasswordEditingAndroid"; public static final String PASSWORD_EDITING_ANDROID = "PasswordEditingAndroid";
public static final String PASSWORD_MANAGER_ONBOARDING_ANDROID = public static final String PASSWORD_MANAGER_ONBOARDING_ANDROID =
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
namespace paint_preview { namespace paint_preview {
const base::Feature kPaintPreviewCaptureExperiment{
"PaintPreviewCaptureExperiment", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kPaintPreviewTest{"PaintPreviewTest", const base::Feature kPaintPreviewTest{"PaintPreviewTest",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
......
...@@ -9,10 +9,17 @@ ...@@ -9,10 +9,17 @@
namespace paint_preview { namespace paint_preview {
// Used to enable the paint preview capture experiment on Android. If enabled,
// paint preview capture will be triggered for a fraction of page loads, with
// accordance to a probability threshold that is set by a field trial param.
// Metrics for the capture are logged and the resulting paint preview is then
// deleted.
extern const base::Feature kPaintPreviewCaptureExperiment;
// Used to enable a main menu item on Android that captures a paint preview for // Used to enable a main menu item on Android that captures a paint preview for
// the current page. Metrics for the capture are logged and a toast is raised. // the current page. Metrics for the capture are logged. The resulting paint
// The resulting paint preview is then deleted. This intended to test whether // preview is then deleted. This intended to test whether capturing works on a
// capturing works on a specific site. // specific site.
extern const base::Feature kPaintPreviewTest; extern const base::Feature kPaintPreviewTest;
} // namespace paint_preview } // namespace paint_preview
......
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