// Copyright 2021 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 "net/cookies/cookie_partition_key.h" #include "base/feature_list.h" #include "net/base/features.h" #include "net/cookies/cookie_constants.h" namespace net { CookiePartitionKey::CookiePartitionKey() = default; CookiePartitionKey::CookiePartitionKey(const SchemefulSite& site) : site_(site) {} CookiePartitionKey::CookiePartitionKey(const GURL& url) : site_(SchemefulSite(url)) {} CookiePartitionKey::CookiePartitionKey(const CookiePartitionKey& other) = default; CookiePartitionKey::CookiePartitionKey(CookiePartitionKey&& other) = default; CookiePartitionKey& CookiePartitionKey::operator=( const CookiePartitionKey& other) = default; CookiePartitionKey& CookiePartitionKey::operator=(CookiePartitionKey&& other) = default; CookiePartitionKey::~CookiePartitionKey() = default; bool CookiePartitionKey::operator==(const CookiePartitionKey& other) const { return site_ == other.site_; } bool CookiePartitionKey::operator<(const CookiePartitionKey& other) const { return site_ < other.site_; } // static bool CookiePartitionKey::Serialize(const absl::optional& in, std::string& out) { if (!in) { out = kEmptyCookiePartitionKey; return true; } if (in->site_.GetURL().SchemeIsFile()) { out = in->site_.SerializeFileSiteWithHost(); return true; } if (in->site_.opaque()) return false; out = in->site_.Serialize(); return true; } // static bool CookiePartitionKey::Deserialize(const std::string& in, absl::optional& out) { if (in == kEmptyCookiePartitionKey) { out = absl::nullopt; return true; } auto schemeful_site = SchemefulSite::Deserialize(in); // SchemfulSite is opaque if the input is invalid. if (schemeful_site.opaque()) return false; out = absl::make_optional(CookiePartitionKey(schemeful_site)); return true; } absl::optional CookiePartitionKey::FromNetworkIsolationKey( const NetworkIsolationKey& network_isolation_key) { if (!base::FeatureList::IsEnabled(features::kPartitionedCookies)) return absl::nullopt; // TODO(crbug.com/1225444): Check if the top frame site is in a First-Party // Set or if it is an extension URL. absl::optional top_frame_site = network_isolation_key.GetTopFrameSite(); if (!top_frame_site) return absl::nullopt; return absl::make_optional(net::CookiePartitionKey(top_frame_site.value())); } } // namespace net