
CREDIT: The most of changes were written by dom@chromium.org. Bug: 1112515 Change-Id: I979f221adf30edbe41a3e575283ddd4c1d6105a2 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2387905 Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org> Reviewed-by: Sophie Chang <sophiechang@chromium.org> Reviewed-by: Kinuko Yasuda <kinuko@chromium.org> Reviewed-by: Dominic Farolino <dom@chromium.org> Cr-Commit-Position: refs/heads/master@{#804654}
138 lines
5.0 KiB
C++
138 lines
5.0 KiB
C++
// Copyright 2019 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.
|
|
|
|
#include "components/optimization_guide/hints_processing_util.h"
|
|
|
|
#include <string>
|
|
|
|
#include "base/containers/flat_set.h"
|
|
#include "base/metrics/field_trial_params.h"
|
|
#include "base/strings/stringprintf.h"
|
|
#include "components/optimization_guide/optimization_guide_features.h"
|
|
#include "components/optimization_guide/store_update_data.h"
|
|
#include "components/optimization_guide/url_pattern_with_wildcards.h"
|
|
#include "net/base/url_util.h"
|
|
#include "url/gurl.h"
|
|
|
|
namespace optimization_guide {
|
|
|
|
// The returned string is used to record histograms for the optimization type.
|
|
// Also add the string to OptimizationGuide.OptimizationTypes histogram suffix
|
|
// in histograms.xml.
|
|
std::string GetStringNameForOptimizationType(
|
|
proto::OptimizationType optimization_type) {
|
|
switch (optimization_type) {
|
|
case proto::OptimizationType::TYPE_UNSPECIFIED:
|
|
return "Unspecified";
|
|
case proto::OptimizationType::NOSCRIPT:
|
|
return "NoScript";
|
|
case proto::OptimizationType::RESOURCE_LOADING:
|
|
return "ResourceLoading";
|
|
case proto::OptimizationType::LITE_PAGE_REDIRECT:
|
|
return "LitePageRedirect";
|
|
case proto::OptimizationType::OPTIMIZATION_NONE:
|
|
return "None";
|
|
case proto::OptimizationType::DEFER_ALL_SCRIPT:
|
|
return "DeferAllScript";
|
|
case proto::OptimizationType::PERFORMANCE_HINTS:
|
|
return "PerformanceHints";
|
|
case proto::OptimizationType::LITE_PAGE:
|
|
return "LitePage";
|
|
case proto::OptimizationType::COMPRESS_PUBLIC_IMAGES:
|
|
return "CompressPublicImages";
|
|
case proto::OptimizationType::LOADING_PREDICTOR:
|
|
return "LoadingPredictor";
|
|
case proto::OptimizationType::FAST_HOST_HINTS:
|
|
return "FastHostHints";
|
|
case proto::OptimizationType::DELAY_ASYNC_SCRIPT_EXECUTION:
|
|
return "DelayAsyncScriptExecution";
|
|
case proto::OptimizationType::DELAY_COMPETING_LOW_PRIORITY_REQUESTS:
|
|
return "DelayCompetingLowPriorityRequests";
|
|
case proto::OptimizationType::LITE_VIDEO:
|
|
return "LiteVideo";
|
|
}
|
|
NOTREACHED();
|
|
return std::string();
|
|
}
|
|
|
|
bool IsDisabledPerOptimizationHintExperiment(
|
|
const proto::Optimization& optimization) {
|
|
// First check if optimization depends on an experiment being enabled.
|
|
if (optimization.has_experiment_name() &&
|
|
!optimization.experiment_name().empty() &&
|
|
optimization.experiment_name() !=
|
|
base::GetFieldTrialParamValueByFeature(
|
|
features::kOptimizationHintsExperiments,
|
|
features::kOptimizationHintsExperimentNameParam)) {
|
|
return true;
|
|
}
|
|
// Now check if optimization depends on an experiment not being enabled.
|
|
if (optimization.has_excluded_experiment_name() &&
|
|
!optimization.excluded_experiment_name().empty() &&
|
|
optimization.excluded_experiment_name() ==
|
|
base::GetFieldTrialParamValueByFeature(
|
|
features::kOptimizationHintsExperiments,
|
|
features::kOptimizationHintsExperimentNameParam)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const proto::PageHint* FindPageHintForURL(const GURL& gurl,
|
|
const proto::Hint* hint) {
|
|
if (!hint) {
|
|
return nullptr;
|
|
}
|
|
|
|
for (const auto& page_hint : hint->page_hints()) {
|
|
if (page_hint.page_pattern().empty()) {
|
|
continue;
|
|
}
|
|
URLPatternWithWildcards url_pattern(page_hint.page_pattern());
|
|
if (url_pattern.Matches(gurl.spec())) {
|
|
// Return the first matching page hint.
|
|
return &page_hint;
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
std::string HashHostForDictionary(const std::string& host) {
|
|
return base::StringPrintf("%x", base::PersistentHash(host));
|
|
}
|
|
|
|
net::EffectiveConnectionType ConvertProtoEffectiveConnectionType(
|
|
proto::EffectiveConnectionType proto_ect) {
|
|
switch (proto_ect) {
|
|
case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN:
|
|
return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
|
|
case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE:
|
|
return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE;
|
|
case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
|
|
return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
|
|
case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G:
|
|
return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G;
|
|
case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G:
|
|
return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G;
|
|
case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G:
|
|
return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G;
|
|
}
|
|
}
|
|
|
|
bool IsValidURLForURLKeyedHint(const GURL& url) {
|
|
if (!url.has_host())
|
|
return false;
|
|
if (net::IsLocalhost(url))
|
|
return false;
|
|
if (url.HostIsIPAddress())
|
|
return false;
|
|
if (!url.SchemeIsHTTPOrHTTPS())
|
|
return false;
|
|
if (url.has_username() || url.has_password())
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
} // namespace optimization_guide
|