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 { ...@@ -115,12 +115,12 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
} }
void SetUp() override { void SetUp() override {
SetUpLitePageTest(false /* use_timeout */); SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp(); InProcessBrowserTest::SetUp();
} }
void SetUpLitePageTest(bool use_timeout) { void SetUpLitePageTest(bool use_timeout, bool is_control) {
https_server_ = std::make_unique<net::EmbeddedTestServer>( https_server_ = std::make_unique<net::EmbeddedTestServer>(
net::EmbeddedTestServer::TYPE_HTTPS); net::EmbeddedTestServer::TYPE_HTTPS);
https_server_->ServeFilesFromSourceDirectory("chrome/test/data"); https_server_->ServeFilesFromSourceDirectory("chrome/test/data");
...@@ -191,7 +191,8 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest { ...@@ -191,7 +191,8 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
{"blacklisted_path_suffixes", ".mp4,.jpg"}, {"blacklisted_path_suffixes", ".mp4,.jpg"},
{"trigger_on_localhost", "true"}, {"trigger_on_localhost", "true"},
{"navigation_timeout_milliseconds", {"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( base::FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
"TrialName1", "GroupName1", feature_parameters); "TrialName1", "GroupName1", feature_parameters);
...@@ -244,6 +245,17 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest { ...@@ -244,6 +245,17 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
return GetWebContents()->GetController().GetVisibleEntry()->GetURL(); 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 { void VerifyPreviewLoaded() const {
// The Virtual URL is set in a WebContentsObserver::OnFinishNavigation. // The Virtual URL is set in a WebContentsObserver::OnFinishNavigation.
// Since |ui_test_utils::NavigationToURL| uses the same signal to stop // Since |ui_test_utils::NavigationToURL| uses the same signal to stop
...@@ -545,8 +557,7 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest { ...@@ -545,8 +557,7 @@ class PreviewsLitePageServerBrowserTest : public InProcessBrowserTest {
break; break;
case kRedirect: case kRedirect:
response->set_code(net::HTTP_TEMPORARY_REDIRECT); response->set_code(net::HTTP_TEMPORARY_REDIRECT);
response->AddCustomHeader("Location", response->AddCustomHeader("Location", HttpLitePageURL(kSuccess).spec());
HttpsLitePageURL(kSuccess).spec());
break; break;
case kBypass: case kBypass:
response->set_code(net::HTTP_TEMPORARY_REDIRECT); response->set_code(net::HTTP_TEMPORARY_REDIRECT);
...@@ -643,6 +654,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -643,6 +654,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded(); VerifyPreviewLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
} }
...@@ -779,9 +792,11 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -779,9 +792,11 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
DISABLE_ON_WIN_MAC(LitePagePreviewsReload)) { DISABLE_ON_WIN_MAC(LitePagePreviewsReload)) {
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded(); VerifyPreviewLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
GetWebContents()->GetController().Reload(content::ReloadType::NORMAL, false); GetWebContents()->GetController().Reload(content::ReloadType::NORMAL, false);
VerifyPreviewLoaded(); VerifyPreviewLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
// Set the ECT so that a preview won't be triggered on the reload. // Set the ECT so that a preview won't be triggered on the reload.
g_browser_process->network_quality_tracker() g_browser_process->network_quality_tracker()
...@@ -801,6 +816,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -801,6 +816,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
DISABLE_ON_WIN_MAC(LitePagePreviewsLoadOriginal)) { DISABLE_ON_WIN_MAC(LitePagePreviewsLoadOriginal)) {
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewLoaded(); VerifyPreviewLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
PreviewsUITabHelper::FromWebContents(GetWebContents()) PreviewsUITabHelper::FromWebContents(GetWebContents())
->ReloadWithoutPreviews(); ->ReloadWithoutPreviews();
...@@ -814,6 +830,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -814,6 +830,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), redirect_url()); ui_test_utils::NavigateToURL(browser(), redirect_url());
VerifyPreviewLoaded(); VerifyPreviewLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
} }
...@@ -823,6 +841,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -823,6 +841,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), https_redirect_url()); ui_test_utils::NavigateToURL(browser(), https_redirect_url());
VerifyPreviewLoaded(); VerifyPreviewLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kSuccess);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
} }
...@@ -832,6 +852,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -832,6 +852,8 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kRedirect)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kRedirect));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(
previews::PreviewsUserData::ServerLitePageStatus::kRedirect);
ClearDeciderState(); ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
...@@ -849,6 +871,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -849,6 +871,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kBypass)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kBypass));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kBypass);
ClearDeciderState(); ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
...@@ -868,6 +891,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -868,6 +891,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kHostBlacklist)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kHostBlacklist));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kBypass);
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
...@@ -897,6 +921,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -897,6 +921,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kAuthFailure)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kAuthFailure));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState(); ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
...@@ -912,6 +937,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest, ...@@ -912,6 +937,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kLoadshed)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kLoadshed));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState(); ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
true, 1); true, 1);
...@@ -1021,7 +1047,7 @@ class PreviewsLitePageServerTimeoutBrowserTest ...@@ -1021,7 +1047,7 @@ class PreviewsLitePageServerTimeoutBrowserTest
~PreviewsLitePageServerTimeoutBrowserTest() override = default; ~PreviewsLitePageServerTimeoutBrowserTest() override = default;
void SetUp() override { void SetUp() override {
SetUpLitePageTest(true /* use_timeout */); SetUpLitePageTest(true /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp(); InProcessBrowserTest::SetUp();
} }
...@@ -1036,6 +1062,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerTimeoutBrowserTest, ...@@ -1036,6 +1062,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerTimeoutBrowserTest,
ui_test_utils::NavigateToURL(browser(), ui_test_utils::NavigateToURL(browser(),
HttpsLitePageURL(kSuccess, nullptr, -1)); HttpsLitePageURL(kSuccess, nullptr, -1));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState(); ClearDeciderState();
histogram_tester.ExpectBucketCount( histogram_tester.ExpectBucketCount(
"Previews.ServerLitePage.ServerResponse", "Previews.ServerLitePage.ServerResponse",
...@@ -1079,6 +1106,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBadServerBrowserTest, ...@@ -1079,6 +1106,7 @@ IN_PROC_BROWSER_TEST_F(PreviewsLitePageServerBadServerBrowserTest,
base::HistogramTester histogram_tester; base::HistogramTester histogram_tester;
ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess)); ui_test_utils::NavigateToURL(browser(), HttpsLitePageURL(kSuccess));
VerifyPreviewNotLoaded(); VerifyPreviewNotLoaded();
VerifyInfoStatus(previews::PreviewsUserData::ServerLitePageStatus::kError);
ClearDeciderState(); ClearDeciderState();
histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered", histogram_tester.ExpectBucketCount("Previews.ServerLitePage.Triggered",
...@@ -1159,7 +1187,7 @@ class PreviewsLitePageNotificationDSEnabledBrowserTest ...@@ -1159,7 +1187,7 @@ class PreviewsLitePageNotificationDSEnabledBrowserTest
~PreviewsLitePageNotificationDSEnabledBrowserTest() override = default; ~PreviewsLitePageNotificationDSEnabledBrowserTest() override = default;
void SetUp() override { void SetUp() override {
SetUpLitePageTest(false /* use_timeout */); SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp(); InProcessBrowserTest::SetUp();
} }
...@@ -1210,7 +1238,7 @@ class PreviewsLitePageNotificationDSDisabledBrowserTest ...@@ -1210,7 +1238,7 @@ class PreviewsLitePageNotificationDSDisabledBrowserTest
~PreviewsLitePageNotificationDSDisabledBrowserTest() override = default; ~PreviewsLitePageNotificationDSDisabledBrowserTest() override = default;
void SetUp() override { void SetUp() override {
SetUpLitePageTest(false /* use_timeout */); SetUpLitePageTest(false /* use_timeout */, false /* is_control */);
InProcessBrowserTest::SetUp(); InProcessBrowserTest::SetUp();
} }
...@@ -1246,3 +1274,25 @@ IN_PROC_BROWSER_TEST_F( ...@@ -1246,3 +1274,25 @@ IN_PROC_BROWSER_TEST_F(
ClearDeciderState(); ClearDeciderState();
EXPECT_EQ(0U, GetInfoBarService()->infobar_count()); 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();
}
...@@ -138,6 +138,17 @@ class PreviewsLitePageNavigationThrottle : public content::NavigationThrottle { ...@@ -138,6 +138,17 @@ class PreviewsLitePageNavigationThrottle : public content::NavigationThrottle {
// method to return. // method to return.
content::NavigationThrottle::ThrottleCheckResult TriggerPreview() const; 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 implementation:
content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override; content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override;
content::NavigationThrottle::ThrottleCheckResult WillRedirectRequest() content::NavigationThrottle::ThrottleCheckResult WillRedirectRequest()
......
...@@ -22,6 +22,34 @@ class PreviewsUserData { ...@@ -22,6 +22,34 @@ class PreviewsUserData {
public: public:
explicit PreviewsUserData(uint64_t page_id); 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 { struct ServerLitePageInfo {
std::unique_ptr<ServerLitePageInfo> Clone() { std::unique_ptr<ServerLitePageInfo> Clone() {
return std::make_unique<ServerLitePageInfo>(*this); return std::make_unique<ServerLitePageInfo>(*this);
...@@ -36,6 +64,9 @@ class PreviewsUserData { ...@@ -36,6 +64,9 @@ class PreviewsUserData {
// The DRP session key used for this preview. // The DRP session key used for this preview.
std::string drp_session_key = std::string(); std::string drp_session_key = std::string();
// The current state of the preview.
ServerLitePageStatus status = ServerLitePageStatus::kUnknown;
}; };
~PreviewsUserData(); ~PreviewsUserData();
......
...@@ -206,6 +206,11 @@ std::string LitePageRedirectPreviewExperiment() { ...@@ -206,6 +206,11 @@ std::string LitePageRedirectPreviewExperiment() {
"lite_page_preview_experiment"); "lite_page_preview_experiment");
} }
bool IsInLitePageRedirectControl() {
return base::GetFieldTrialParamByFeatureAsBool(
features::kLitePageServerPreviews, "control_group", false);
}
net::EffectiveConnectionType GetECTThresholdForPreview( net::EffectiveConnectionType GetECTThresholdForPreview(
previews::PreviewsType type) { previews::PreviewsType type) {
switch (type) { switch (type) {
......
...@@ -118,6 +118,10 @@ int PreviewServerLoadshedMaxSeconds(); ...@@ -118,6 +118,10 @@ int PreviewServerLoadshedMaxSeconds();
// The experimental config to send to the previews server. // The experimental config to send to the previews server.
std::string LitePageRedirectPreviewExperiment(); 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 // The threshold of EffectiveConnectionType above which preview |type| will be
// triggered. // triggered.
net::EffectiveConnectionType GetECTThresholdForPreview( 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