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();
}
...@@ -92,41 +92,6 @@ content::OpenURLParams MakeOpenURLParams(content::NavigationHandle* handle, ...@@ -92,41 +92,6 @@ content::OpenURLParams MakeOpenURLParams(content::NavigationHandle* handle,
return url_params; 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 } // namespace
class WebContentsLifetimeHelper class WebContentsLifetimeHelper
...@@ -349,12 +314,21 @@ bool PreviewsLitePageNavigationThrottle::IsEligibleForPreview() const { ...@@ -349,12 +314,21 @@ bool PreviewsLitePageNavigationThrottle::IsEligibleForPreview() const {
if (!blacklist_reasons.empty()) if (!blacklist_reasons.empty())
return false; return false;
// This should always be at the end, but before the control group check.
if (manager_->NeedsToNotifyUser()) { if (manager_->NeedsToNotifyUser()) {
manager_->NotifyUser(navigation_handle()->GetWebContents()); manager_->NotifyUser(navigation_handle()->GetWebContents());
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.IneligibleReasons", UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.IneligibleReasons",
IneligibleReason::kInfoBarNotSeen); IneligibleReason::kInfoBarNotSeen);
return false; 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; return true;
} }
...@@ -426,8 +400,8 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const { ...@@ -426,8 +400,8 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
content::BrowserContext* browser_context = content::BrowserContext* browser_context =
navigation_handle()->GetWebContents()->GetBrowserContext(); navigation_handle()->GetWebContents()->GetBrowserContext();
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info = previews::PreviewsUserData::ServerLitePageInfo* info =
GetOrCreateServerLitePageInfo(navigation_handle()); GetOrCreateServerLitePageInfo();
// Set DRP headers. // Set DRP headers.
DataReductionProxyChromeSettings* drp_settings = DataReductionProxyChromeSettings* drp_settings =
...@@ -444,22 +418,13 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const { ...@@ -444,22 +418,13 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
// Add in the page id to the chrome-proxy header. // Add in the page id to the chrome-proxy header.
if (request_headers.HasHeader(kChromeProxyHeader)) { 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; std::string header_value;
request_headers.GetHeader(kChromeProxyHeader, &header_value); request_headers.GetHeader(kChromeProxyHeader, &header_value);
// 64 bit uint fits in 16 characters when represented in hexadecimal, but // 64 bit uint fits in 16 characters when represented in hexadecimal, but
// there needs to be a trailing null terminated character in the buffer. // there needs to be a trailing null terminated character in the buffer.
char page_id_buffer[17]; 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); header_value += ", pid=" + std::string(page_id_buffer);
request_headers.SetHeader(kChromeProxyHeader, header_value); request_headers.SetHeader(kChromeProxyHeader, header_value);
} }
...@@ -475,6 +440,10 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const { ...@@ -475,6 +440,10 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
// load the original page. // load the original page.
const base::TimeDelta timeout = const base::TimeDelta timeout =
previews::params::LitePagePreviewsNavigationTimeoutDuration(); 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()) { if (timeout > base::TimeDelta()) {
base::PostDelayedTaskWithTraits( base::PostDelayedTaskWithTraits(
FROM_HERE, {content::BrowserThread::UI}, FROM_HERE, {content::BrowserThread::UI},
...@@ -486,7 +455,7 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const { ...@@ -486,7 +455,7 @@ PreviewsLitePageNavigationThrottle::TriggerPreview() const {
base::Unretained(web_contents), manager_, base::Unretained(web_contents), manager_,
MakeOpenURLParams(navigation_handle(), MakeOpenURLParams(navigation_handle(),
navigation_handle()->GetURL(), std::string()), navigation_handle()->GetURL(), std::string()),
info->Clone(), false)), std::move(timed_out_info), false)),
timeout); timeout);
} }
...@@ -539,7 +508,7 @@ PreviewsLitePageNavigationThrottle::WillStartRequest() { ...@@ -539,7 +508,7 @@ PreviewsLitePageNavigationThrottle::WillStartRequest() {
helper->GetWeakPtr(), helper->GetWeakPtr(),
MakeOpenURLParams(navigation_handle(), MakeOpenURLParams(navigation_handle(),
GURL(original_url), std::string()), GURL(original_url), std::string()),
GetOrCreateServerLitePageInfo(navigation_handle()))); GetOrCreateServerLitePageInfo()->Clone()));
return content::NavigationThrottle::CANCEL; return content::NavigationThrottle::CANCEL;
} }
...@@ -569,6 +538,8 @@ PreviewsLitePageNavigationThrottle::WillRedirectRequest() { ...@@ -569,6 +538,8 @@ PreviewsLitePageNavigationThrottle::WillRedirectRequest() {
// it is pointing towards the original page, it is considered a bypass. // it is pointing towards the original page, it is considered a bypass.
// Otherwise it is just a forwarded bypass. // Otherwise it is just a forwarded bypass.
if (GURL(original_url) == navigation_handle()->GetURL()) { if (GURL(original_url) == navigation_handle()->GetURL()) {
GetServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kBypass;
manager_->AddSingleBypass(navigation_handle()->GetURL().spec()); manager_->AddSingleBypass(navigation_handle()->GetURL().spec());
UMA_HISTOGRAM_MEDIUM_TIMES( UMA_HISTOGRAM_MEDIUM_TIMES(
"Previews.ServerLitePage.HttpOnlyFallbackPenalty", "Previews.ServerLitePage.HttpOnlyFallbackPenalty",
...@@ -578,6 +549,8 @@ PreviewsLitePageNavigationThrottle::WillRedirectRequest() { ...@@ -578,6 +549,8 @@ PreviewsLitePageNavigationThrottle::WillRedirectRequest() {
} else { } else {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse", UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
ServerResponse::kRedirect); ServerResponse::kRedirect);
GetServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kRedirect;
} }
// Check if the original host should be blacklisted, as directed by the // Check if the original host should be blacklisted, as directed by the
...@@ -614,17 +587,16 @@ PreviewsLitePageNavigationThrottle::WillFailRequest() { ...@@ -614,17 +587,16 @@ PreviewsLitePageNavigationThrottle::WillFailRequest() {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse", UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
ServerResponse::kFailed); ServerResponse::kFailed);
GetServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kError;
// The Preview was triggered but there was some irrecoverable issue (like // The Preview was triggered but there was some irrecoverable issue (like
// there is no network connection). Load the original page and let it go // there is no network connection). Load the original page and let it go
// through the normal process for whatever error it is. // through the normal process for whatever error it is.
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info =
GetServerLitePageInfo(navigation_handle());
DCHECK(info);
LoadAndBypass( LoadAndBypass(
navigation_handle()->GetWebContents(), manager_, navigation_handle()->GetWebContents(), manager_,
MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()), MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()),
std::move(info), true); GetServerLitePageInfo()->Clone(), true);
return content::NavigationThrottle::CANCEL; return content::NavigationThrottle::CANCEL;
} }
...@@ -659,6 +631,8 @@ PreviewsLitePageNavigationThrottle::WillProcessResponse() { ...@@ -659,6 +631,8 @@ PreviewsLitePageNavigationThrottle::WillProcessResponse() {
UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse", UMA_HISTOGRAM_ENUMERATION("Previews.ServerLitePage.ServerResponse",
ServerResponse::kOk); ServerResponse::kOk);
GetOrCreateServerLitePageInfo()->status =
previews::PreviewsUserData::ServerLitePageStatus::kSuccess;
return content::NavigationThrottle::PROCEED; return content::NavigationThrottle::PROCEED;
} }
...@@ -689,16 +663,68 @@ PreviewsLitePageNavigationThrottle::WillProcessResponse() { ...@@ -689,16 +663,68 @@ PreviewsLitePageNavigationThrottle::WillProcessResponse() {
ServerResponse::kOther); ServerResponse::kOther);
} }
std::unique_ptr<previews::PreviewsUserData::ServerLitePageInfo> info = previews::PreviewsUserData::ServerLitePageInfo* info =
GetServerLitePageInfo(navigation_handle()); GetOrCreateServerLitePageInfo();
DCHECK(info); info->status = previews::PreviewsUserData::ServerLitePageStatus::kError;
LoadAndBypass( LoadAndBypass(
navigation_handle()->GetWebContents(), manager_, navigation_handle()->GetWebContents(), manager_,
MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()), MakeOpenURLParams(navigation_handle(), GURL(original_url), std::string()),
std::move(info), true); info->Clone(), true);
return content::NavigationThrottle::CANCEL; 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() { const char* PreviewsLitePageNavigationThrottle::GetNameForLogging() {
return "PreviewsLitePageNavigationThrottle"; return "PreviewsLitePageNavigationThrottle";
} }
...@@ -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