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 = [
"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/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/PartnerBookmarksFaviconThrottle.java",
"java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java",
......
......@@ -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() {
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 = [
"+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/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/ssl/SecurityStateModel.java",
"+chrome/android/java/src/org/chromium/chrome/browser/tab",
......
......@@ -13,6 +13,7 @@ import org.chromium.chrome.browser.dom_distiller.TabDistillabilityProvider;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.infobar.InfoBarContainer;
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.tasks.TaskRecognizer;
import org.chromium.content_public.browser.SelectionPopupController;
......@@ -44,6 +45,7 @@ public final class TabHelpers {
MediaSessionTabHelper.createForTab(tab);
TaskTabHelper.createForTab(tab, parentTab);
TabBrowserControlsConstraintsHelper.createForTab(tab);
PaintPreviewTabHelper.createForTab(tab);
// TODO(jinsukkim): Do this by having something observe new tab creation.
if (tab.isIncognito()) CipherFactory.getInstance().triggerKeyGeneration();
......
......@@ -212,6 +212,7 @@ const base::Feature* kFeaturesExposedToJava[] = {
&kWebApkAdaptiveIcon,
&net::features::kSameSiteByDefaultCookies,
&net::features::kCookiesWithoutSameSiteMustBeSecure,
&paint_preview::kPaintPreviewCaptureExperiment,
&paint_preview::kPaintPreviewTest,
&payments::features::kAlwaysAllowJustInTimePaymentApp,
&payments::features::kPaymentRequestSkipToGPay,
......
......@@ -305,6 +305,7 @@ public abstract class ChromeFeatureList {
public static final String OMNIBOX_SEARCH_ENGINE_LOGO = "OmniboxSearchEngineLogo";
public static final String OVERLAY_NEW_LAYOUT = "OverlayNewLayout";
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 PASSWORD_EDITING_ANDROID = "PasswordEditingAndroid";
public static final String PASSWORD_MANAGER_ONBOARDING_ANDROID =
......
......@@ -8,6 +8,8 @@
namespace paint_preview {
const base::Feature kPaintPreviewCaptureExperiment{
"PaintPreviewCaptureExperiment", base::FEATURE_DISABLED_BY_DEFAULT};
const base::Feature kPaintPreviewTest{"PaintPreviewTest",
base::FEATURE_DISABLED_BY_DEFAULT};
......
......@@ -9,10 +9,17 @@
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
// the current page. Metrics for the capture are logged and a toast is raised.
// The resulting paint preview is then deleted. This intended to test whether
// capturing works on a specific site.
// the current page. Metrics for the capture are logged. The resulting paint
// preview is then deleted. This intended to test whether capturing works on a
// specific site.
extern const base::Feature kPaintPreviewTest;
} // 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