blob: c82bef7a81f9838f09a2e9b83c56126518c23b49 [file]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/optimization_guide/core/hints/hints_processing_util.h"
#include <string>
#include "base/containers/flat_set.h"
#include "base/hash/hash.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/stringprintf.h"
#include "components/optimization_guide/core/hints/store_update_data.h"
#include "components/optimization_guide/core/hints/url_pattern_with_wildcards.h"
#include "components/optimization_guide/core/optimization_guide_features.h"
#include "net/base/url_util.h"
#include "url/gurl.h"
namespace optimization_guide {
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::METADATA_FETCH_VALIDATION:
return "MetadataFetchValidation";
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::LITE_VIDEO:
return "LiteVideo";
case proto::OptimizationType::LINK_PERFORMANCE:
return "LinkPerformance";
case proto::OptimizationType::SHOPPING_PAGE_PREDICTOR:
return "ShoppingPagePredictor";
case proto::OptimizationType::MERCHANT_TRUST_SIGNALS:
return "MerchantTrustSignals";
case proto::OptimizationType::PRICE_TRACKING:
return "PriceTracking";
case proto::OptimizationType::BLOOM_FILTER_VALIDATION:
return "BloomFilterValidation";
case proto::OptimizationType::ABOUT_THIS_SITE:
return "AboutThisSite";
case proto::OptimizationType::MERCHANT_TRUST_SIGNALS_V2:
return "MerchantTrustSignalsV2";
case proto::OptimizationType::PAGE_ENTITIES:
return "PageEntities";
case proto::OptimizationType::HISTORY_CLUSTERS:
return "HistoryClusters";
case proto::OptimizationType::THANK_CREATOR_ELIGIBLE:
return "ThankCreatorEligible";
case proto::OptimizationType::IBAN_AUTOFILL_BLOCKED:
return "IBANAutofillBlocked";
case proto::OptimizationType::SALIENT_IMAGE:
return "SalientImage";
case proto::OptimizationType::AUTOFILL_SAMPLING_RATE:
return "AutofillSamplingRate";
case proto::OptimizationType::VCN_MERCHANT_OPT_OUT_VISA:
return "VcnMerchantOptOutVisa";
case proto::OptimizationType::PRICE_INSIGHTS:
return "PriceInsights";
case proto::OptimizationType::V8_COMPILE_HINTS:
return "V8CompileHints";
case proto::OptimizationType::SHOPPING_PAGE_TYPES:
return "ShoppingPageTypes";
case proto::OptimizationType::SHOPPING_DISCOUNTS:
return "ShoppingDiscounts";
case proto::OptimizationType::COMPOSE:
return "Compose";
case proto::OptimizationType::PIX_PAYMENT_MERCHANT_ALLOWLIST:
return "PixPaymentMerchantAllowlist";
case proto::OptimizationType::SHARED_CREDIT_CARD_FLIGHT_BENEFITS:
return "SharedCreditCardFlightBenefits";
case proto::OptimizationType::SHARED_CREDIT_CARD_DINING_BENEFITS:
return "SharedCreditCardDiningBenefits";
case proto::OptimizationType::SHARED_CREDIT_CARD_GROCERY_BENEFITS:
return "SharedCreditCardGroceryBenefits";
case proto::OptimizationType::SHARED_CREDIT_CARD_ENTERTAINMENT_BENEFITS:
return "SharedCreditCardEntertainmentBenefits";
case proto::OptimizationType::SHARED_CREDIT_CARD_STREAMING_BENEFITS:
return "SharedCreditCardStreamingBenefits";
case proto::OptimizationType::SHARED_CREDIT_CARD_SUBSCRIPTION_BENEFITS:
return "SharedCreditCardSubscriptionBenefits";
case proto::OptimizationType::CAPITAL_ONE_CREDIT_CARD_DINING_BENEFITS:
return "CapitalOneCreditCardDiningBenefits";
case proto::OptimizationType::CAPITAL_ONE_CREDIT_CARD_GROCERY_BENEFITS:
return "CapitalOneCreditCardGroceryBenefits";
case proto::OptimizationType::
CAPITAL_ONE_CREDIT_CARD_ENTERTAINMENT_BENEFITS:
return "CapitalOneCreditCardEntertainmentBenefits";
case proto::OptimizationType::CAPITAL_ONE_CREDIT_CARD_STREAMING_BENEFITS:
return "CapitalOneCreditCardStreamingBenefits";
case proto::OptimizationType::AMERICAN_EXPRESS_CREDIT_CARD_FLIGHT_BENEFITS:
return "AmericanExpressCreditCardFlightBenefits";
case proto::OptimizationType::
AMERICAN_EXPRESS_CREDIT_CARD_SUBSCRIPTION_BENEFITS:
return "AmericanExpressCreditCardSubscriptionBenefits";
case proto::OptimizationType::CAPITAL_ONE_CREDIT_CARD_BENEFITS_BLOCKED:
return "CapitalOneCreditCardBenefitsBlocked";
case proto::OptimizationType::VCN_MERCHANT_OPT_OUT_DISCOVER:
return "VcnMerchantOptOutDiscover";
case proto::OptimizationType::VCN_MERCHANT_OPT_OUT_MASTERCARD:
return "VcnMerchantOptOutMastercard";
case proto::OptimizationType::PIX_MERCHANT_ORIGINS_ALLOWLIST:
return "PixMerchantOriginsAllowlist";
case proto::OptimizationType::HISTORY_EMBEDDINGS:
return "HistoryEmbeddings";
case proto::OptimizationType::AUTOFILL_ABLATION_SITES_LIST1:
return "AutofillAblationSitesList1";
case proto::OptimizationType::AUTOFILL_ABLATION_SITES_LIST2:
return "AutofillAblationSitesList2";
case proto::OptimizationType::AUTOFILL_ABLATION_SITES_LIST3:
return "AutofillAblationSitesList3";
case proto::OptimizationType::AUTOFILL_ABLATION_SITES_LIST4:
return "AutofillAblationSitesList4";
case proto::OptimizationType::AUTOFILL_ABLATION_SITES_LIST5:
return "AutofillAblationSitesList5";
case proto::OptimizationType::AUTOFILL_ABLATION_SITES_LIST6:
return "AutofillAblationSitesList6";
case proto::OptimizationType::AMOUNT_EXTRACTION_ALLOWLIST:
return "AmountExtractionAllowlist";
case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_AFFIRM:
return "BuyNowPayLaterAllowlistAffirmDesktop";
case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_ZIP:
return "BuyNowPayLaterAllowlistZipDesktop";
case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_KLARNA:
return "BuyNowPayLaterAllowlistKlarnaDesktop";
case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_AFFIRM_ANDROID:
return "BuyNowPayLaterAllowlistAffirmAndroid";
case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_ZIP_ANDROID:
return "BuyNowPayLaterAllowlistZipAndroid";
case proto::OptimizationType::BUY_NOW_PAY_LATER_ALLOWLIST_KLARNA_ANDROID:
return "BuyNowPayLaterAllowlistKlarnaAndroid";
case proto::OptimizationType::BUY_NOW_PAY_LATER_BLOCKLIST_AFFIRM:
return "BuyNowPayLaterBlocklistAffirm";
case proto::OptimizationType::BUY_NOW_PAY_LATER_BLOCKLIST_ZIP:
return "BuyNowPayLaterBlocklistZip";
case proto::OptimizationType::BUY_NOW_PAY_LATER_BLOCKLIST_KLARNA:
return "BuyNowPayLaterBlocklistKlarna";
case proto::OptimizationType::SAVED_TAB_GROUP:
return "SavedTabGroup";
case proto::OptimizationType::TEXT_CLASSIFIER_ENTITY_DETECTION:
return "TextClassifierEntityDetection";
case proto::OptimizationType::EWALLET_MERCHANT_ALLOWLIST:
return "EwalletMerchantAllowlist";
case proto::OptimizationType::OPTIMIZATION_GUIDE_ICON_VIEW:
return "OptimizationGuideIconView";
case proto::OptimizationType::PRIVACY_POLICY_ANNOTATION:
return "PrivacyPolicyAnnotation";
case proto::OptimizationType::BMO_CREDIT_CARD_AIR_MILES_PARTNER_BENEFITS:
return "BmoCreditCardAirMilesPartnerBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_ALCOHOL_STORE_BENEFITS:
return "BmoCreditCardAlcoholStoreBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_DINING_BENEFITS:
return "BmoCreditCardDiningBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_DRUGSTORE_BENEFITS:
return "BmoCreditCardDrugstoreBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_ENTERTAINMENT_BENEFITS:
return "BmoCreditCardEntertainmentBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_GROCERY_BENEFITS:
return "BmoCreditCardGroceryBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_OFFICE_SUPPLY_BENEFITS:
return "BmoCreditCardOfficeSupplyBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_RECURRING_BILL_BENEFITS:
return "BmoCreditCardRecurringBillBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_TRANSIT_BENEFITS:
return "BmoCreditCardTransitBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_TRAVEL_BENEFITS:
return "BmoCreditCardTravelBenefits";
case proto::OptimizationType::BMO_CREDIT_CARD_WHOLESALE_CLUB_BENEFITS:
return "BmoCreditCardWholesaleClubBenefits";
case proto::OptimizationType::GLIC_CONTEXTUAL_CUEING:
return "GlicContextualCueing";
case proto::OptimizationType::GLIC_ZERO_STATE_SUGGESTIONS:
return "GlicZeroStateSuggestions";
case proto::OptimizationType::GLIC_ACTION_PAGE_BLOCK:
return "GlicActionPageBlock";
case proto::OptimizationType::FEDCM_CLICKTHROUGH_RATE:
return "FedCmClickthroughRate";
case proto::OptimizationType::DIGITAL_CREDENTIALS_LOW_FRICTION:
return "DigitalCredentialsLowFriction";
case proto::OptimizationType::A2A_MERCHANT_ALLOWLIST:
return "A2AMerchantAllowlist";
case proto::OptimizationType::
SHARED_CREDIT_CARD_FLAT_RATE_BENEFITS_BLOCKLIST:
return "SharedCreditCardFlatRateBenefitBlocklist";
case proto::OptimizationType::WALLETABLE_PASS_DETECTION_ALLOWLIST:
return "WalletablePassDetectionAllowlist";
case proto::OptimizationType::LENS_OVERLAY_EDU_ACTION_CHIP_BLOCKLIST:
return "LensOverlayEduActionChipBlocklist";
case proto::OptimizationType::LENS_OVERLAY_EDU_ACTION_CHIP_ALLOWLIST:
return "LensOverlayEduActionChipAllowlist";
case proto::OptimizationType::WALLETABLE_PASS_DETECTION_LOYALTY_ALLOWLIST:
return "WalletablePassDetectionLoyaltyAllowlist";
case proto::OptimizationType::
WALLETABLE_PASS_DETECTION_BOARDING_PASS_ALLOWLIST:
return "WalletablePassDetectionBoardingPassAllowlist";
case proto::OptimizationType::
WALLETABLE_PASS_DETECTION_TRANSIT_TICKET_ALLOWLIST:
return "WalletablePassDetectionTransitTicketAllowlist";
case proto::OptimizationType::
WALLETABLE_PASS_DETECTION_EVENT_PASS_ALLOWLIST:
return "WalletablePassDetectionEventPassAllowlist";
case proto::OptimizationType::NTP_NEXT_DEEP_DIVE_ACTION_CHIP_BLOCKLIST:
return "NtpNextDeepDiveActionChipBlocklist";
case proto::OptimizationType::NTP_NEXT_DEEP_DIVE_ACTION_CHIP_ALLOWLIST:
return "NtpNextDeepDiveActionChipAllowlist";
case proto::OptimizationType::READER_MODE_ELIGIBLE:
return "ReaderModeEligible";
case proto::OptimizationType::AUTOFILL_ACTOR_IFRAME_ORIGIN_ALLOWLIST:
return "AutofillActorIframeOriginAllowlist";
case proto::OptimizationType::SKILLS:
return "Skills";
}
// The returned string is used to record histograms for the optimization type.
//
// Whenever a new value is added, make sure to add it to the OptimizationType
// variant list in
// //tools/metrics/histograms/metadata/optimization/histograms.xml. Also
// update enums.xml when adding new value in OptimizationType.
NOTREACHED();
}
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));
}
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