hints_processing_util.cc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/optimization_guide/core/hints_processing_util.h"
  5. #include <string>
  6. #include "base/containers/flat_set.h"
  7. #include "base/hash/hash.h"
  8. #include "base/metrics/field_trial_params.h"
  9. #include "base/strings/stringprintf.h"
  10. #include "components/optimization_guide/core/optimization_guide_features.h"
  11. #include "components/optimization_guide/core/store_update_data.h"
  12. #include "components/optimization_guide/core/url_pattern_with_wildcards.h"
  13. #include "net/base/url_util.h"
  14. #include "url/gurl.h"
  15. namespace optimization_guide {
  16. std::string GetStringNameForOptimizationType(
  17. proto::OptimizationType optimization_type) {
  18. switch (optimization_type) {
  19. case proto::OptimizationType::TYPE_UNSPECIFIED:
  20. return "Unspecified";
  21. case proto::OptimizationType::NOSCRIPT:
  22. return "NoScript";
  23. case proto::OptimizationType::RESOURCE_LOADING:
  24. return "ResourceLoading";
  25. case proto::OptimizationType::LITE_PAGE_REDIRECT:
  26. return "LitePageRedirect";
  27. case proto::OptimizationType::METADATA_FETCH_VALIDATION:
  28. return "MetadataFetchValidation";
  29. case proto::OptimizationType::DEFER_ALL_SCRIPT:
  30. return "DeferAllScript";
  31. case proto::OptimizationType::PERFORMANCE_HINTS:
  32. return "PerformanceHints";
  33. case proto::OptimizationType::LITE_PAGE:
  34. return "LitePage";
  35. case proto::OptimizationType::COMPRESS_PUBLIC_IMAGES:
  36. return "CompressPublicImages";
  37. case proto::OptimizationType::LOADING_PREDICTOR:
  38. return "LoadingPredictor";
  39. case proto::OptimizationType::FAST_HOST_HINTS:
  40. return "FastHostHints";
  41. case proto::OptimizationType::LITE_VIDEO:
  42. return "LiteVideo";
  43. case proto::OptimizationType::LINK_PERFORMANCE:
  44. return "LinkPerformance";
  45. case proto::OptimizationType::SHOPPING_PAGE_PREDICTOR:
  46. return "ShoppingPagePredictor";
  47. case proto::OptimizationType::LOGIN_DETECTION:
  48. return "LoginDetection";
  49. case proto::OptimizationType::MERCHANT_TRUST_SIGNALS:
  50. return "MerchantTrustSignals";
  51. case proto::OptimizationType::PRICE_TRACKING:
  52. return "PriceTracking";
  53. case proto::OptimizationType::BLOOM_FILTER_VALIDATION:
  54. return "BloomFilterValidation";
  55. case proto::OptimizationType::ABOUT_THIS_SITE:
  56. return "AboutThisSite";
  57. case proto::OptimizationType::MERCHANT_TRUST_SIGNALS_V2:
  58. return "MerchantTrustSignalsV2";
  59. case proto::OptimizationType::PAGE_ENTITIES:
  60. return "PageEntities";
  61. case proto::OptimizationType::HISTORY_CLUSTERS:
  62. return "HistoryClusters";
  63. case proto::OptimizationType::THANK_CREATOR_ELIGIBLE:
  64. return "ThankCreatorEligible";
  65. case proto::OptimizationType::IBAN_AUTOFILL_BLOCKED:
  66. return "IBANAutofillBlocked";
  67. }
  68. // The returned string is used to record histograms for the optimization type.
  69. //
  70. // Whenever a new value is added, make sure to add it to the OptimizationType
  71. // variant list in
  72. // //tools/metrics/histograms/metadata/optimization/histograms.xml. Also
  73. // update enums.xml when adding new value in OptimizationType.
  74. NOTREACHED();
  75. return std::string();
  76. }
  77. const proto::PageHint* FindPageHintForURL(const GURL& gurl,
  78. const proto::Hint* hint) {
  79. if (!hint) {
  80. return nullptr;
  81. }
  82. for (const auto& page_hint : hint->page_hints()) {
  83. if (page_hint.page_pattern().empty()) {
  84. continue;
  85. }
  86. URLPatternWithWildcards url_pattern(page_hint.page_pattern());
  87. if (url_pattern.Matches(gurl.spec())) {
  88. // Return the first matching page hint.
  89. return &page_hint;
  90. }
  91. }
  92. return nullptr;
  93. }
  94. std::string HashHostForDictionary(const std::string& host) {
  95. return base::StringPrintf("%x", base::PersistentHash(host));
  96. }
  97. net::EffectiveConnectionType ConvertProtoEffectiveConnectionType(
  98. proto::EffectiveConnectionType proto_ect) {
  99. switch (proto_ect) {
  100. case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN:
  101. return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
  102. case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE:
  103. return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE;
  104. case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
  105. return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
  106. case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G:
  107. return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G;
  108. case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G:
  109. return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G;
  110. case proto::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G:
  111. return net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G;
  112. }
  113. }
  114. bool IsValidURLForURLKeyedHint(const GURL& url) {
  115. if (!url.has_host())
  116. return false;
  117. if (net::IsLocalhost(url))
  118. return false;
  119. if (url.HostIsIPAddress())
  120. return false;
  121. if (!url.SchemeIsHTTPOrHTTPS())
  122. return false;
  123. if (url.has_username() || url.has_password())
  124. return false;
  125. return true;
  126. }
  127. } // namespace optimization_guide