Commit a0ddfab7 authored by Robert Ogden's avatar Robert Ogden Committed by Commit Bot

HTTPS Previews: Record the preview status during the load

This preview status will be copied into the DRP pingback. This CL is
factored out for sake of timing WRT branch later today.

This CL also adds basic control-group variations support since that is
an important part of the preview status in the pingback.

Bug: 864665
Change-Id: Ib8ee672e4247da42b97015b89e85240122bc696e
Reviewed-on: https://chromium-review.googlesource.com/c/1355550Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Commit-Queue: Robert Ogden <robertogden@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612572}
parent 51a04f82
......@@ -115,12 +115,12 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
}
void SetUp() override {
SetUpLitePageTest(false /* use_timeout */);
SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp();
}
void SetUpLitePageTest(bool use_timeout) {
void SetUpLitePageTest(bool use_timeout, bool is_control) {
https_server_ = std::make_unique<net::EmbeddedTestServer>(
net::EmbeddedTestServer::TYPE_HTTPS);
https_server_->ServeFilesFromSourceDirectory("chrome/test/data");
......@@ -191,7 +191,8 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
{"blacklisted_path_suffixes", ".mp4,.jpg"},
{"trigger_on_localhost", "true"},
{"navigation_timeout_milliseconds",
use_timeout ? base::IntToString(kTimeoutMs) : "0"}};
use_timeout ? base::IntToString(kTimeoutMs) : "0"},
{"control_group", is_control ? "true" : "false"}};
base::FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
"TrialName1", "GroupName1", feature_parameters);
......@@ -244,6 +245,17 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
return GetWebContents()->GetController().GetVisibleEntry()->GetURL();
}
void VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus status) {
PreviewsUITabHelper* ui_tab_helper =
PreviewsUITabHelper::FromWebContents(GetWebContents());
previews::PreviewsUserData* previews_data =
ui_tab_helper->previews_user_data();
EXPECT_TRUE(previews_data->server_lite_page_info());
EXPECT_EQ(previews_data->server_lite_page_info()->status, status);
}
void VerifyPreviewLoaded() const {
// The Virtual URL is set in a WebContentsObserver::OnFinishNavigation.
// Since |ui_test_utils::NavigationToURL| uses the same signal to stop
......@@ -545,8 +557,7 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
break;
case kRedirect:
response->set_code(net::HTTP_TEMPORARY_REDIRECT);
response->AddCustomHeader("Location",
HttpsLitePageURL(kSuccess).spec());
response->AddCustomHeader("Location", HttpLitePageURL(kSuccess).spec());
break;
case kBypass:
response->set_code(net::HTTP_TEMPORARY_REDIRECT);
......@@ -643,6 +654,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
}
......@@ -779,9 +792,11 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
DISABLE_ON_WIN_MAC(LitePagePreviewsReload)) {
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
GetWebContents()->GetController().Reload(content::ReloadType::NORMAL, false);
VerifyPreviewLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
// Set the ECT so that a preview won't be triggered on the reload.
g_browser_process->network_quality_tracker()
......@@ -801,6 +816,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
DISABLE_ON_WIN_MAC(LitePagePreviewsLoadOriginal)) {
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
PreviewsUITabHelper::FromWebContents(GetWebContents())
->ReloadWithoutPreviews();
......@@ -814,6 +830,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), redirect_url());
VerifyPreviewLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
}
......@@ -823,6 +841,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), https_redirect_url());
VerifyPreviewLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
}
......@@ -832,6 +852,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kRedirect));
VerifyPreviewNotLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kRedirect);
ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
......@@ -849,6 +871,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kBypass));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kBypass);
ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
......@@ -868,6 +891,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kHostBlacklist));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kBypass);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
......@@ -897,6 +921,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kAuthFailure));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
......@@ -912,6 +937,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kLoadshed));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1);
......@@ -1021,7 +1047,7 @@ class PreviewsLitePageServerTimeoutBrowserTest
~PreviewsLitePageServerTimeoutBrowserTest() override = default;
void SetUp() override {
SetUpLitePageTest(true /* use_timeout */);
SetUpLitePageTest(true /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp();
}
......@@ -1036,6 +1062,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerTimeoutBrowserTest,
ui_test_utils::NavigateToURL(browser(),
HttpsLitePageURL(kSuccess, nullptr, -1));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState();
histogram_tester.ExpectBucketCount(
"Previews.ServerLitePage.ServerResponse",
......@@ -1079,6 +1106,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBadServerBrowserTest,
base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
......@@ -1159,7 +1187,7 @@ class PreviewsLitePageNotificationDSEnabledBrowserTest
~PreviewsLitePageNotificationDSEnabledBrowserTest() override = default;
void SetUp() override {
SetUpLitePageTest(false /* use_timeout */);
SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp();
}
......@@ -1210,7 +1238,7 @@ class PreviewsLitePageNotificationDSDisabledBrowserTest
~PreviewsLitePageNotificationDSDisabledBrowserTest() override = default;
void SetUp() override {
SetUpLitePageTest(false /* use_timeout */);
SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp();
}
......@@ -1246,3 +1274,25 @@ IN_PROC_BROWSER_TEST_F(
ClearDeciderState();
EXPECT_EQ(0U, GetInfoBarService()->infobar_count());
}
class PreviewsLitePageControlBrowserTest
: public PreviewsLitePageServerBrowserTest {
public:
PreviewsLitePageControlBrowserTest() = default;
~PreviewsLitePageControlBrowserTest() override = default;
void SetUp() override {
SetUpLitePageTest(false /* use_timeout */, true /* is_control */);
InProcessBrowserTest::SetUp();
}
};
IN_PROC_BROWSER_TEST_F(PreviewsLitePageControlBrowserTest,
DISABLE_ON_WIN_MAC(LitePagePreviewsControlGroup)) {
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kControl);
ClearDeciderState();
}
......@@ -92,41 +92,6 @@ content::OpenURLParams MakeOpenURLParams(content::NavigationHandle* handle,
return url_params;
}
// Gets the ServerLitePageInfo struct from an existing attempted lite page
// navigation, if there is one. If not, returns nullptr.
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo>
GetServerLitePageInfo(content::NavigationHandle* handle) {
PreviewsUITabHelper* ui_tab_helper =
PreviewsUITabHelper::FromWebContents(handle->GetWebContents());
if (!ui_tab_helper)
return nullptr;
previews::PreviewsUserData* previews_data =
ui_tab_helper->GetPreviewsUserData(handle);
if (!previews_data)
return nullptr;
if (!previews_data->server_lite_page_info())
return nullptr;
return std::make_unique<previews::PreviewsUserData::ServerLitePageInfo>(
*previews_data->server_lite_page_info());
}
// Gets the ServerLitePageInfo struct from an existing attempted lite page
// navigation, if there is one. If not, returns a new ServerLitePageInfo
// initialized with |handle| that is not associated with a PreviewsUserData.
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo>
GetOrCreateServerLitePageInfo(content::NavigationHandle* handle) {
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
GetServerLitePageInfo(handle);
if (!info) {
info = std::make_unique<previews::PreviewsUserData::ServerLitePageInfo>();
info->original_navigation_start = handle->NavigationStart();
}
return info;
}
} // namespace
class WebContentsLifetimeHelper
......@@ -349,12 +314,21 @@ bool PreviewsLitePageNavigationThrottle::IsEligibleForPreview() const {
if (!blacklist_reasons.empty())
return false;
// This should always be at the end, but before the control group check.
if (manager_->NeedsToNotifyUser()) {
manager_->NotifyUser(navigation_handle()->GetWebContents());
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.IneligibleReasons",
IneligibleReason::kInfoBarNotSeen);
return false;
}
// This should always be last.
if (previews::params::IsInLitePageRedirectControl()) {
previews::PreviewsUserData::ServerLitePageInfo* info =
GetOrCreateServerLitePageInfo();
info->status = previews::PreviewsUserData::ServerLitePageStatus::kControl;
return false;
}
return true;
}
......@@ -426,8 +400,8 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
content::BrowserContext* browser_context =
navigation_handle()->GetWebContents()->GetBrowserContext();
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
GetOrCreateServerLitePageInfo(navigation_handle());
previews::PreviewsUserData::ServerLitePageInfo* info =
GetOrCreateServerLitePageInfo();
// Set DRP headers.
DataReductionProxyChromeSettings* drp_settings =
......@@ -444,22 +418,13 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
// Add in the page id to the chrome-proxy header.
if (request_headers.HasHeader(kChromeProxyHeader)) {
// Persist some state in |info| so it can be used by metrics later on.
base::Optional<std::string> session_id =
data_reduction_proxy::DataReductionProxyRequestOptions::
GetSessionKeyFromRequestHeaders(request_headers);
if (session_id.has_value())
info->drp_session_key = session_id.value();
uint64_t page_id = manager_->GeneratePageID();
info->page_id = page_id;
std::string header_value;
request_headers.GetHeader(kChromeProxyHeader, &header_value);
// 64 bit uint fits in 16 characters when represented in hexadecimal, but
// there needs to be a trailing null terminated character in the buffer.
char page_id_buffer[17];
base::strings::SafeSPrintf(page_id_buffer, "%x", page_id);
base::strings::SafeSPrintf(page_id_buffer, "%x", info->page_id);
header_value += ", pid=" + std::string(page_id_buffer);
request_headers.SetHeader(kChromeProxyHeader, header_value);
}
......@@ -475,6 +440,10 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
// load the original page.
const base::TimeDelta timeout =
previews::params::LitePagePreviewsNavigationTimeoutDuration();
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo>
timed_out_info = info->Clone();
timed_out_info->status =
previews::PreviewsUserData::ServerLitePageStatus::kError;
if (timeout > base::TimeDelta()) {
base::PostDelayedTaskWithTraits(
FROM_HERE, {content::BrowserThread::UI},
......@@ -486,7 +455,7 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
base::Unretained(web_contents), manager_,
MakeOpenURLParams(navigation_handle(),
navigation_handle()->GetURL(), std::string()),
info->Clone(), false)),
std::move(timed_out_info), false)),
timeout);
}
......@@ -539,7 +508,7 @@ PreviewsLitePageNavigationThrottle::WillStartRequest() {
helper->GetWeakPtr(),
MakeOpenURLParams(navigation_handle(),
GURL(original_url), std::string()),
GetOrCreateServerLitePageInfo(navigation_handle())));
GetOrCreateServerLitePageInfo()->Clone()));
return content::NavigationThrottle::CANCEL;
}
......@@ -569,6 +538,8 @@ PreviewsLitePageNavigationThrottle::WillRedirectRequest() {
// it is pointing towards the original page, it is considered a bypass.
// Otherwise it is just a forwarded bypass.
if (GURL(original_url) == navigation_handle()->GetURL()) {
GetServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kBypass;
manager_->AddSingleBypass(navigation_handle()->GetURL().spec());
UMA_HISTOGRAM_MEDIUM_TIMES(
"Previews.ServerLitePage.HttpOnlyFallbackPenalty",
......@@ -578,6 +549,8 @@ PreviewsLitePageNavigationThrottle::WillRedirectRequest() {
} else {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
ServerResponse::kRedirect);
GetServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kRedirect;
}
// Check if the original host should be blacklisted, as directed by the
......@@ -614,17 +587,16 @@ PreviewsLitePageNavigationThrottle::WillFailRequest() {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
ServerResponse::kFailed);
GetServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kError;
// The Preview was triggered but there was some irrecoverable issue (like
// there is no network connection). Load the original page and let it go
// through the normal process for whatever error it is.
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
GetServerLitePageInfo(navigation_handle());
DCHECK(info);
LoadAndBypass(
navigation_handle()->GetWebContents(), manager_,
MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()),
std::move(info), true);
GetServerLitePageInfo()->Clone(), true);
return content::NavigationThrottle::CANCEL;
}
......@@ -659,6 +631,8 @@ PreviewsLitePageNavigationThrottle::WillProcessResponse() {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
ServerResponse::kOk);
GetOrCreateServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kSuccess;
return content::NavigationThrottle::PROCEED;
}
......@@ -689,16 +663,68 @@ PreviewsLitePageNavigationThrottle::WillProcessResponse() {
ServerResponse::kOther);
}
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
GetServerLitePageInfo(navigation_handle());
DCHECK(info);
previews::PreviewsUserData::ServerLitePageInfo* info =
GetOrCreateServerLitePageInfo();
info->status = previews::PreviewsUserData::ServerLitePageStatus::kError;
LoadAndBypass(
navigation_handle()->GetWebContents(), manager_,
MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()),
std::move(info), true);
info->Clone(), true);
return content::NavigationThrottle::CANCEL;
}
previews::PreviewsUserData::ServerLitePageInfo*
PreviewsLitePageNavigationThrottle::GetServerLitePageInfo() const {
PreviewsUITabHelper* ui_tab_helper = PreviewsUITabHelper::FromWebContents(
navigation_handle()->GetWebContents());
if (!ui_tab_helper)
return nullptr;
previews::PreviewsUserData* previews_data =
ui_tab_helper->GetPreviewsUserData(navigation_handle());
if (!previews_data)
return nullptr;
return previews_data->server_lite_page_info();
}
previews::PreviewsUserData::ServerLitePageInfo*
PreviewsLitePageNavigationThrottle::GetOrCreateServerLitePageInfo() const {
PreviewsUITabHelper* ui_tab_helper = PreviewsUITabHelper::FromWebContents(
navigation_handle()->GetWebContents());
if (!ui_tab_helper)
return nullptr;
previews::PreviewsUserData* previews_data =
ui_tab_helper->GetPreviewsUserData(navigation_handle());
if (!previews_data)
return nullptr;
if (previews_data->server_lite_page_info()) {
return previews_data->server_lite_page_info();
}
previews_data->set_server_lite_page_info(
std::make_unique<previews::PreviewsUserData::ServerLitePageInfo>());
DataReductionProxyChromeSettings* drp_settings =
DataReductionProxyChromeSettingsFactory::GetForBrowserContext(
navigation_handle()->GetWebContents()->GetBrowserContext());
base::Optional<std::string> session_id;
if (drp_settings) {
session_id = data_reduction_proxy::DataReductionProxyRequestOptions::
GetSessionKeyFromRequestHeaders(drp_settings->GetProxyRequestHeaders());
}
previews::PreviewsUserData::ServerLitePageInfo* info =
previews_data->server_lite_page_info();
info->original_navigation_start = navigation_handle()->NavigationStart();
if (session_id.has_value())
info->drp_session_key = session_id.value();
info->page_id = manager_->GeneratePageID();
return info;
}
const char* PreviewsLitePageNavigationThrottle::GetNameForLogging() {
return "PreviewsLitePageNavigationThrottle";
}
......@@ -138,6 +138,17 @@ class PreviewsLitePageNavigationThrottle : public content::NavigationThrottle {
// method to return.
content::NavigationThrottle::ThrottleCheckResult TriggerPreview() const;
// Gets the ServerLitePageInfo struct from an existing attempted lite page
// navigation, if there is one. If not, returns nullptr.
previews::PreviewsUserData::ServerLitePageInfo* GetServerLitePageInfo() const;
// Gets the ServerLitePageInfo struct from an existing attempted lite page
// navigation, if there is one. If not, returns a new ServerLitePageInfo
// initialized with metadata from navigation_handle() and |this| that is owned
// by the PreviewsUserData associated with navigation_handle().
previews::PreviewsUserData::ServerLitePageInfo*
GetOrCreateServerLitePageInfo() const;
// content::NavigationThrottle implementation:
content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override;
content::NavigationThrottle::ThrottleCheckResult WillRedirectRequest()
......
......@@ -22,6 +22,34 @@ class PreviewsUserData {
public:
explicit PreviewsUserData(uint64_t page_id);
enum class ServerLitePageStatus {
// The preview has been attempted yet or we have not received a response
// from the server yet.
kUnknown = 0,
// A preview was committed.
kSuccess = 1,
// The server bypassed the request and the preview was not committed.
kBypass = 2,
// The server redirected to another site. If this is the state at commit,
// the preview was not committed. Before commit, this indicates that we
// attempted the preview and may attempt another one if triggered later in
// the redirect
// chain.
kRedirect = 3,
// The server responded with some error, or didn't respond at all, and the
// original page was loaded.
kError = 4,
// This navigation met all triggering criteria, but the configured
// variations indicate that we were in a control group, so the preview was
// not triggered or committed.
kControl = 5,
};
struct ServerLitePageInfo {
std::unique_ptr<ServerLitePageInfo> Clone() {
return std::make_unique<ServerLitePageInfo>(*this);
......@@ -36,6 +64,9 @@ class PreviewsUserData {
// The DRP session key used for this preview.
std::string drp_session_key = std::string();
// The current state of the preview.
ServerLitePageStatus status = ServerLitePageStatus::kUnknown;
};
~PreviewsUserData();
......
......@@ -206,6 +206,11 @@ std::string LitePageRedirectPreviewExperiment() {
"lite_page_preview_experiment");
}
bool IsInLitePageRedirectControl() {
return base::GetFieldTrialParamByFeatureAsBool(
features::kLitePageServerPreviews, "control_group", false);
}
net::EffectiveConnectionType GetECTThresholdForPreview(
previews::PreviewsType type) {
switch (type) {
......
......@@ -118,6 +118,10 @@ int PreviewServerLoadshedMaxSeconds();
// The experimental config to send to the previews server.
std::string LitePageRedirectPreviewExperiment();
// Returns true if we should only report metrics and not trigger when the Lite
// Page Redirect preview is enabled.
bool IsInLitePageRedirectControl();
// The threshold of EffectiveConnectionType above which preview |type| will be
// triggered.
net::EffectiveConnectionType GetECTThresholdForPreview(
......
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