Commit 96903cd1 authored by Doug Arnett's avatar Doug Arnett Committed by Commit Bot

[Previews] Adds DeferAllScript support to Decider and OptGuide

Adds new opt guide proto optimization type for DeferAllScript with
whitelist checking for it from PreviewsDeciderImpl thru PreviewsHints.

Bug: 965277
Change-Id: I7be59e6eda9b64d310027ac2c3ddfb7f91ac76eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1673754Reviewed-by: default avatarRobert Ogden <robertogden@chromium.org>
Reviewed-by: default avatarTarun Bansal <tbansal@chromium.org>
Commit-Queue: Doug Arnett <dougarnett@chromium.org>
Cr-Commit-Position: refs/heads/master@{#672122}
parent c68f0923
...@@ -118,6 +118,9 @@ enum OptimizationType { ...@@ -118,6 +118,9 @@ enum OptimizationType {
LITE_PAGE_REDIRECT = 3; LITE_PAGE_REDIRECT = 3;
// This optimization does nothing (no-op). // This optimization does nothing (no-op).
OPTIMIZATION_NONE = 4; OPTIMIZATION_NONE = 4;
// This optimization defers execution of parser-blocking script until after
// parsing completes.
DEFER_ALL_SCRIPT = 5;
} }
// Presents semantics for how page load URLs should be matched. // Presents semantics for how page load URLs should be matched.
......
...@@ -55,7 +55,8 @@ bool HintsFetcher::FetchOptimizationGuideServiceHints( ...@@ -55,7 +55,8 @@ bool HintsFetcher::FetchOptimizationGuideServiceHints(
optimization_guide::proto::NOSCRIPT); optimization_guide::proto::NOSCRIPT);
get_hints_request_->add_supported_optimizations( get_hints_request_->add_supported_optimizations(
optimization_guide::proto::RESOURCE_LOADING); optimization_guide::proto::RESOURCE_LOADING);
// TODO(dougarnett): Add DEFER_ALL_SCRIPT once supported. get_hints_request_->add_supported_optimizations(
optimization_guide::proto::DEFER_ALL_SCRIPT);
static_assert(static_cast<int>(PreviewsType::DEFER_ALL_SCRIPT) + 1 == static_assert(static_cast<int>(PreviewsType::DEFER_ALL_SCRIPT) + 1 ==
static_cast<int>(PreviewsType::LAST), static_cast<int>(PreviewsType::LAST),
"PreviewsType has been updated, make sure Optimization Guide " "PreviewsType has been updated, make sure Optimization Guide "
......
...@@ -51,11 +51,11 @@ bool ShouldCheckOptimizationHints(PreviewsType type) { ...@@ -51,11 +51,11 @@ bool ShouldCheckOptimizationHints(PreviewsType type) {
case PreviewsType::NOSCRIPT: case PreviewsType::NOSCRIPT:
case PreviewsType::RESOURCE_LOADING_HINTS: case PreviewsType::RESOURCE_LOADING_HINTS:
case PreviewsType::LITE_PAGE_REDIRECT: case PreviewsType::LITE_PAGE_REDIRECT:
case PreviewsType::DEFER_ALL_SCRIPT:
return true; return true;
// These types do not have server optimization hints. // These types do not have server optimization hints.
case PreviewsType::OFFLINE: case PreviewsType::OFFLINE:
case PreviewsType::LITE_PAGE: case PreviewsType::LITE_PAGE:
case PreviewsType::DEFER_ALL_SCRIPT:
return false; return false;
case PreviewsType::NONE: case PreviewsType::NONE:
case PreviewsType::UNSPECIFIED: case PreviewsType::UNSPECIFIED:
...@@ -333,7 +333,8 @@ PreviewsEligibilityReason PreviewsDeciderImpl::DeterminePreviewEligibility( ...@@ -333,7 +333,8 @@ PreviewsEligibilityReason PreviewsDeciderImpl::DeterminePreviewEligibility(
return ShouldAllowPreviewPerOptimizationHints(previews_data, url, type, return ShouldAllowPreviewPerOptimizationHints(previews_data, url, type,
passed_reasons); passed_reasons);
} else if (type == PreviewsType::RESOURCE_LOADING_HINTS || } else if (type == PreviewsType::RESOURCE_LOADING_HINTS ||
type == PreviewsType::NOSCRIPT) { type == PreviewsType::NOSCRIPT ||
type == PreviewsType::DEFER_ALL_SCRIPT) {
return PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER; return PreviewsEligibilityReason::HOST_NOT_WHITELISTED_BY_SERVER;
} }
} }
...@@ -373,7 +374,8 @@ bool PreviewsDeciderImpl::ShouldCommitPreview(PreviewsUserData* previews_data, ...@@ -373,7 +374,8 @@ bool PreviewsDeciderImpl::ShouldCommitPreview(PreviewsUserData* previews_data,
PreviewsType type) const { PreviewsType type) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(PreviewsType::NOSCRIPT == type || DCHECK(PreviewsType::NOSCRIPT == type ||
PreviewsType::RESOURCE_LOADING_HINTS == type); PreviewsType::RESOURCE_LOADING_HINTS == type ||
PreviewsType::DEFER_ALL_SCRIPT == type);
if (previews_black_list_ && !blacklist_ignored_) { if (previews_black_list_ && !blacklist_ignored_) {
std::vector<PreviewsEligibilityReason> passed_reasons; std::vector<PreviewsEligibilityReason> passed_reasons;
// The blacklist will disallow certain hosts for periods of time based on // The blacklist will disallow certain hosts for periods of time based on
...@@ -412,7 +414,8 @@ PreviewsDeciderImpl::ShouldAllowPreviewPerOptimizationHints( ...@@ -412,7 +414,8 @@ PreviewsDeciderImpl::ShouldAllowPreviewPerOptimizationHints(
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(type == PreviewsType::LITE_PAGE_REDIRECT || DCHECK(type == PreviewsType::LITE_PAGE_REDIRECT ||
type == PreviewsType::NOSCRIPT || type == PreviewsType::NOSCRIPT ||
type == PreviewsType::RESOURCE_LOADING_HINTS); type == PreviewsType::RESOURCE_LOADING_HINTS ||
type == PreviewsType::DEFER_ALL_SCRIPT);
// For LitePageRedirect, ensure it is not blacklisted for this request, and // For LitePageRedirect, ensure it is not blacklisted for this request, and
// hints have been fully loaded. // hints have been fully loaded.
// //
...@@ -446,7 +449,8 @@ PreviewsDeciderImpl::ShouldCommitPreviewPerOptimizationHints( ...@@ -446,7 +449,8 @@ PreviewsDeciderImpl::ShouldCommitPreviewPerOptimizationHints(
std::vector<PreviewsEligibilityReason>* passed_reasons) const { std::vector<PreviewsEligibilityReason>* passed_reasons) const {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(type == PreviewsType::NOSCRIPT || DCHECK(type == PreviewsType::NOSCRIPT ||
type == PreviewsType::RESOURCE_LOADING_HINTS); type == PreviewsType::RESOURCE_LOADING_HINTS ||
type == PreviewsType::DEFER_ALL_SCRIPT);
if (!previews_opt_guide_ || !previews_opt_guide_->has_hints()) if (!previews_opt_guide_ || !previews_opt_guide_->has_hints())
return PreviewsEligibilityReason::OPTIMIZATION_HINTS_NOT_AVAILABLE; return PreviewsEligibilityReason::OPTIMIZATION_HINTS_NOT_AVAILABLE;
......
...@@ -125,6 +125,8 @@ base::Optional<PreviewsType> ConvertProtoOptimizationTypeToPreviewsType( ...@@ -125,6 +125,8 @@ base::Optional<PreviewsType> ConvertProtoOptimizationTypeToPreviewsType(
return PreviewsType::LITE_PAGE_REDIRECT; return PreviewsType::LITE_PAGE_REDIRECT;
case optimization_guide::proto::OPTIMIZATION_NONE: case optimization_guide::proto::OPTIMIZATION_NONE:
return PreviewsType::NONE; return PreviewsType::NONE;
case optimization_guide::proto::DEFER_ALL_SCRIPT:
return PreviewsType::DEFER_ALL_SCRIPT;
} }
} }
...@@ -143,6 +145,8 @@ bool IsEnabledOptimizationType( ...@@ -143,6 +145,8 @@ bool IsEnabledOptimizationType(
case optimization_guide::proto::OPTIMIZATION_NONE: case optimization_guide::proto::OPTIMIZATION_NONE:
// Always consider enabled to allow as no-op optimization. // Always consider enabled to allow as no-op optimization.
return true; return true;
case optimization_guide::proto::DEFER_ALL_SCRIPT:
return previews::params::IsDeferAllScriptPreviewsEnabled();
} }
} }
......
...@@ -517,9 +517,9 @@ TEST_F(PreviewsHintsTest, IsWhitelistedOutParams) { ...@@ -517,9 +517,9 @@ TEST_F(PreviewsHintsTest, IsWhitelistedOutParams) {
} }
TEST_F(PreviewsHintsTest, TEST_F(PreviewsHintsTest,
IsWhitelistedForSecondOptimizationNoScriptWithFirstDisabled) { IsWhitelistedForSecondOptimizationDeferAllScriptWithFirstDisabled) {
base::test::ScopedFeatureList scoped_list; base::test::ScopedFeatureList scoped_list;
scoped_list.InitWithFeatures({features::kNoScriptPreviews}, scoped_list.InitWithFeatures({features::kDeferAllScriptPreviews},
{features::kResourceLoadingHints}); {features::kResourceLoadingHints});
optimization_guide::proto::Configuration config; optimization_guide::proto::Configuration config;
...@@ -528,7 +528,7 @@ TEST_F(PreviewsHintsTest, ...@@ -528,7 +528,7 @@ TEST_F(PreviewsHintsTest,
hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX); hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
hint1->set_version("someversion"); hint1->set_version("someversion");
// Page hint with NOSCRIPT optimization // Page hint with RESOURCE_LOADING and DEFER_ALL_SCRIPT optimizations
optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints(); optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
page_hint1->set_page_pattern("/has_multiple_optimizations/"); page_hint1->set_page_pattern("/has_multiple_optimizations/");
optimization_guide::proto::Optimization* optimization1 = optimization_guide::proto::Optimization* optimization1 =
...@@ -537,7 +537,8 @@ TEST_F(PreviewsHintsTest, ...@@ -537,7 +537,8 @@ TEST_F(PreviewsHintsTest,
optimization_guide::proto::RESOURCE_LOADING); optimization_guide::proto::RESOURCE_LOADING);
optimization_guide::proto::Optimization* optimization2 = optimization_guide::proto::Optimization* optimization2 =
page_hint1->add_whitelisted_optimizations(); page_hint1->add_whitelisted_optimizations();
optimization2->set_optimization_type(optimization_guide::proto::NOSCRIPT); optimization2->set_optimization_type(
optimization_guide::proto::DEFER_ALL_SCRIPT);
ParseConfig(config); ParseConfig(config);
...@@ -547,7 +548,7 @@ TEST_F(PreviewsHintsTest, ...@@ -547,7 +548,7 @@ TEST_F(PreviewsHintsTest,
std::string serialized_hint_version_string; std::string serialized_hint_version_string;
EXPECT_TRUE(MaybeLoadHintAndCheckIsWhitelisted( EXPECT_TRUE(MaybeLoadHintAndCheckIsWhitelisted(
GURL("https://www.somedomain.org/has_multiple_optimizations/"), GURL("https://www.somedomain.org/has_multiple_optimizations/"),
PreviewsType::NOSCRIPT, &inflation_percent, &ect_threshold, PreviewsType::DEFER_ALL_SCRIPT, &inflation_percent, &ect_threshold,
&serialized_hint_version_string)); &serialized_hint_version_string));
EXPECT_FALSE(MaybeLoadHintAndCheckIsWhitelisted( EXPECT_FALSE(MaybeLoadHintAndCheckIsWhitelisted(
GURL("https://www.somedomain.org/has_multiple_optimizations/"), GURL("https://www.somedomain.org/has_multiple_optimizations/"),
...@@ -559,7 +560,7 @@ TEST_F(PreviewsHintsTest, ...@@ -559,7 +560,7 @@ TEST_F(PreviewsHintsTest,
IsWhitelistedForSecondOptimizationResourceLoadingWithFirstDisabled) { IsWhitelistedForSecondOptimizationResourceLoadingWithFirstDisabled) {
base::test::ScopedFeatureList scoped_list; base::test::ScopedFeatureList scoped_list;
scoped_list.InitWithFeatures({features::kResourceLoadingHints}, scoped_list.InitWithFeatures({features::kResourceLoadingHints},
{features::kNoScriptPreviews}); {features::kDeferAllScriptPreviews});
optimization_guide::proto::Configuration config; optimization_guide::proto::Configuration config;
optimization_guide::proto::Hint* hint1 = config.add_hints(); optimization_guide::proto::Hint* hint1 = config.add_hints();
...@@ -567,12 +568,13 @@ TEST_F(PreviewsHintsTest, ...@@ -567,12 +568,13 @@ TEST_F(PreviewsHintsTest,
hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX); hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
hint1->set_version("someversion"); hint1->set_version("someversion");
// Page hint with NOSCRIPT optimization // Page hint with RESOURCE_LOADING and DEFER_ALL_SCRIPT optimizations
optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints(); optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
page_hint1->set_page_pattern("/has_multiple_optimizations/"); page_hint1->set_page_pattern("/has_multiple_optimizations/");
optimization_guide::proto::Optimization* optimization1 = optimization_guide::proto::Optimization* optimization1 =
page_hint1->add_whitelisted_optimizations(); page_hint1->add_whitelisted_optimizations();
optimization1->set_optimization_type(optimization_guide::proto::NOSCRIPT); optimization1->set_optimization_type(
optimization_guide::proto::DEFER_ALL_SCRIPT);
optimization_guide::proto::Optimization* optimization2 = optimization_guide::proto::Optimization* optimization2 =
page_hint1->add_whitelisted_optimizations(); page_hint1->add_whitelisted_optimizations();
optimization2->set_optimization_type( optimization2->set_optimization_type(
......
...@@ -672,6 +672,41 @@ TEST_F(PreviewsOptimizationGuideTest, ...@@ -672,6 +672,41 @@ TEST_F(PreviewsOptimizationGuideTest,
EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, ect_threshold); EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, ect_threshold);
} }
TEST_F(PreviewsOptimizationGuideTest,
ProcessHintsWithValidCommandLineOverrideForDeferAllScript) {
base::test::ScopedFeatureList scoped_list;
scoped_list.InitWithFeatures({features::kDeferAllScriptPreviews}, {});
optimization_guide::proto::Configuration config;
optimization_guide::proto::Hint* hint = config.add_hints();
hint->set_key("somedomain.org");
hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
page_hint->set_page_pattern("defer_default_2g");
optimization_guide::proto::Optimization* optimization =
page_hint->add_whitelisted_optimizations();
optimization->set_optimization_type(
optimization_guide::proto::DEFER_ALL_SCRIPT);
std::string encoded_config;
config.SerializeToString(&encoded_config);
base::Base64Encode(encoded_config, &encoded_config);
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
switches::kHintsProtoOverride, encoded_config);
CreateServiceAndGuide();
// Verify page matches and ECT thresholds.
PreviewsUserData user_data(kDefaultPageId);
net::EffectiveConnectionType ect_threshold;
EXPECT_TRUE(guide()->GetHintsForTesting());
EXPECT_TRUE(MaybeLoadOptimizationHintsAndCheckIsWhitelisted(
&user_data, GURL("https://somedomain.org/defer_default_2g"),
PreviewsType::DEFER_ALL_SCRIPT, &ect_threshold));
EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_2G, ect_threshold);
}
TEST_F(PreviewsOptimizationGuideTest, TEST_F(PreviewsOptimizationGuideTest,
ProcessHintsWithValidCommandLineOverrideAndPreexistingData) { ProcessHintsWithValidCommandLineOverrideAndPreexistingData) {
base::test::ScopedFeatureList scoped_list; base::test::ScopedFeatureList scoped_list;
......
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