blob: 2ce00aad7f08fe2025516aa5db8cc3ada090e183 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_KEY_H_
#define CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_KEY_H_
#include <optional>
#include <variant>
#include "content/common/content_export.h"
#include "net/base/network_isolation_key.h"
#include "third_party/blink/public/common/tokens/tokens.h"
#include "url/gurl.h"
namespace content {
// Key for managing and matching prefetches.
//
// This key can either represent
//
// - the key of a prefetch (typically named `prefetch_key`, and its URL is the
// URL of the prefetched main resource); or
// - the key of a navigation (typically named `navigated_key`, and its URL is
// the navigation request URL).
//
// TODO(crbug.com/364751887): This distinction is not perfect. Enforce it as
// much as possible.
//
// For prefetch, non URL part is given as the following:
//
// - If the prefetch is renderer-initiated, `DocumentToken` of the initiating
// document is used.
// - If the prefetch is browser-initiated, `std::nullopt` (for
// `referring_document_token`) is used.
// - If the prefetch is embedder-initiated, `net::NetworkIsolationKey` of the
// embedder is used. See crbug.com/40942681.
//
// For navigation, `std::optional<DocumentToken>` of the initiating document
// of the navigation is used.
//
// See also the doc on crbug.com/40946257 for more context.
class CONTENT_EXPORT PrefetchKey final {
public:
PrefetchKey() = delete;
PrefetchKey(net::NetworkIsolationKey nik, GURL url);
PrefetchKey(std::optional<blink::DocumentToken> referring_document_token,
GURL url);
~PrefetchKey();
// Movable and copyable.
PrefetchKey(PrefetchKey&& other);
PrefetchKey& operator=(PrefetchKey&& other);
PrefetchKey(const PrefetchKey& other);
PrefetchKey& operator=(const PrefetchKey& other);
bool operator==(const PrefetchKey& rhs) const = default;
bool operator<(const PrefetchKey& rhs) const {
if (referring_document_token_or_nik_ !=
rhs.referring_document_token_or_nik_) {
return referring_document_token_or_nik_ <
rhs.referring_document_token_or_nik_;
}
return url_ < rhs.url_;
}
const GURL& url() const { return url_; }
PrefetchKey WithNewUrl(const GURL& new_url) const {
return std::visit([&](const auto& e) { return PrefetchKey(e, new_url); },
referring_document_token_or_nik_);
}
bool NonUrlPartIsSame(const PrefetchKey& other) const {
return referring_document_token_or_nik_ ==
other.referring_document_token_or_nik_;
}
private:
friend CONTENT_EXPORT std::ostream& operator<<(
std::ostream& ostream,
const PrefetchKey& prefetch_key);
std::variant<std::optional<blink::DocumentToken>, net::NetworkIsolationKey>
referring_document_token_or_nik_;
GURL url_;
};
CONTENT_EXPORT std::ostream& operator<<(std::ostream& ostream,
const PrefetchKey& prefetch_key);
} // namespace content
#endif // CONTENT_BROWSER_PRELOADING_PREFETCH_PREFETCH_KEY_H_