1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/tpcd_heuristics/opener_heuristic_utils.h"
#include "content/browser/btm/btm_bounce_detector.h"
#include "content/public/browser/cookie_access_details.h"
#include "services/network/public/cpp/features.h"
#include "url/gurl.h"
namespace content {
PopupProvider GetPopupProvider(const GURL& popup_url) {
if (popup_url.DomainIs("google.com")) {
return PopupProvider::kGoogle;
}
return PopupProvider::kUnknown;
}
OptionalBool IsAdTaggedCookieForHeuristics(const CookieAccessDetails& details) {
if (!base::FeatureList::IsEnabled(
network::features::kSkipTpcdMitigationsForAds) ||
!network::features::kSkipTpcdMitigationsForAdsHeuristics.Get()) {
return OptionalBool::kUnknown;
}
return ToOptionalBool(details.cookie_setting_overrides.Has(
net::CookieSettingOverride::kSkipTPCDHeuristicsGrant));
}
std::map<std::string, std::pair<GURL, bool>> GetRedirectHeuristicURLs(
const BtmRedirectContext& committed_redirect_context,
const GURL& first_party_url,
base::optional_ref<std::set<std::string>> allowed_sites,
bool require_current_interaction) {
std::map<std::string, std::pair<GURL, bool>>
sites_to_url_and_current_interaction;
std::set<std::string> sites_with_current_interaction =
committed_redirect_context.AllSitesWithUserActivationOrAuthn();
const std::string& first_party_site = GetSiteForBtm(first_party_url);
for (size_t redirect_index = 0;
redirect_index < committed_redirect_context.size(); redirect_index++) {
const BtmRedirectInfo& redirect =
committed_redirect_context[redirect_index];
const GURL& url = redirect.redirecting_url.url;
const std::string& site = redirect.site;
// The redirect heuristic does not apply for first-party cookie access.
if (site == first_party_site) {
continue;
}
// Check the list of allowed sites, if provided.
if (allowed_sites.has_value() && !allowed_sites->contains(site)) {
continue;
}
// Check for a current interaction, if the flag requires it.
if (require_current_interaction &&
!sites_with_current_interaction.contains(site)) {
continue;
}
// Add the url to the map, but do not override a previous current
// interaction.
auto& [prev_url, had_current_interaction] =
sites_to_url_and_current_interaction[site];
if (prev_url.is_empty() || !had_current_interaction) {
prev_url = url;
had_current_interaction = sites_with_current_interaction.contains(site);
}
}
return sites_to_url_and_current_interaction;
}
} // namespace content
|