#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "content/browser/code_cache/generated_code_cache.h"
#include <iostream>
#include <string_view>
#include "base/feature_list.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/not_fatal_until.h"
#include "base/numerics/byte_conversions.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "components/services/storage/public/cpp/big_io_buffer.h"
#include "content/common/features.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/common/content_client.h"
#include "content/public/common/url_constants.h"
#include "crypto/sha2.h"
#include "net/base/completion_once_callback.h"
#include "net/base/features.h"
#include "net/base/network_isolation_key.h"
#include "net/base/url_util.h"
#include "net/http/http_cache.h"
#include "third_party/blink/public/common/scheme_registry.h"
#include "url/gurl.h"
BigIOBuffer;
namespace content {
namespace {
constexpr char kPrefix[] = …;
constexpr char kSeparator[] = …;
void CheckValidKeys(const GURL& resource_url,
const GURL& origin_lock,
GeneratedCodeCache::CodeCacheType cache_type) { … }
std::string GetCacheKey(const GURL& resource_url,
const GURL& origin_lock,
const net::NetworkIsolationKey& nik,
GeneratedCodeCache::CodeCacheType cache_type) { … }
constexpr size_t kResponseTimeSizeInBytes = …;
constexpr size_t kDataSizeInBytes = …;
constexpr size_t kHeaderSizeInBytes = …;
constexpr size_t kSHAKeySizeInBytes = …;
constexpr size_t kInlineDataLimit = …;
constexpr size_t kDedicatedDataLimit = …;
void WriteCommonDataHeader(net::IOBufferWithSize* buffer,
const base::Time& response_time,
uint32_t data_size) { … }
void ReadCommonDataHeader(net::IOBufferWithSize* buffer,
base::Time* response_time,
uint32_t* data_size) { … }
static_assert …;
net::CacheType CodeCacheTypeToNetCacheType(
GeneratedCodeCache::CodeCacheType type) { … }
void CollectStatisticsForEmbedderWebUIPages(
const GURL& resource_url,
const GURL& origin_lock,
GeneratedCodeCache::CacheEntryStatus entry_status) { … }
}
bool GeneratedCodeCache::IsValidHeader(
scoped_refptr<net::IOBufferWithSize> small_buffer) const { … }
void GeneratedCodeCache::ReportPeriodicalHistograms() { … }
std::string GeneratedCodeCache::GetResourceURLFromKey(const std::string& key) { … }
void GeneratedCodeCache::CollectStatistics(
const GURL& resource_url,
const GURL& origin_lock,
GeneratedCodeCache::CacheEntryStatus status) { … }
class GeneratedCodeCache::PendingOperation { … };
GeneratedCodeCache::PendingOperation::~PendingOperation() = default;
GeneratedCodeCache::GeneratedCodeCache(const base::FilePath& path,
int max_size_bytes,
CodeCacheType cache_type)
: … { … }
GeneratedCodeCache::~GeneratedCodeCache() = default;
void GeneratedCodeCache::GetBackend(GetBackendCallback callback) { … }
void GeneratedCodeCache::WriteEntry(const GURL& url,
const GURL& origin_lock,
const net::NetworkIsolationKey& nik,
const base::Time& response_time,
mojo_base::BigBuffer data) { … }
void GeneratedCodeCache::FetchEntry(const GURL& url,
const GURL& origin_lock,
const net::NetworkIsolationKey& nik,
ReadDataCallback read_data_callback) { … }
void GeneratedCodeCache::DeleteEntry(const GURL& url,
const GURL& origin_lock,
const net::NetworkIsolationKey& nik) { … }
void GeneratedCodeCache::CreateBackend() { … }
void GeneratedCodeCache::DidCreateBackend(disk_cache::BackendResult result) { … }
void GeneratedCodeCache::EnqueueOperation(
std::unique_ptr<PendingOperation> op) { … }
void GeneratedCodeCache::IssuePendingOperations() { … }
void GeneratedCodeCache::IssueOperation(PendingOperation* op) { … }
void GeneratedCodeCache::WriteEntryImpl(PendingOperation* op) { … }
void GeneratedCodeCache::OpenCompleteForWrite(
PendingOperation* op,
disk_cache::EntryResult entry_result) { … }
void GeneratedCodeCache::WriteSmallBufferComplete(PendingOperation* op,
int rv) { … }
void GeneratedCodeCache::WriteLargeBufferComplete(PendingOperation* op,
int rv) { … }
void GeneratedCodeCache::WriteComplete(PendingOperation* op) { … }
void GeneratedCodeCache::FetchEntryImpl(PendingOperation* op) { … }
void GeneratedCodeCache::OpenCompleteForRead(
PendingOperation* op,
disk_cache::EntryResult entry_result) { … }
void GeneratedCodeCache::ReadSmallBufferComplete(PendingOperation* op, int rv) { … }
void GeneratedCodeCache::ReadLargeBufferComplete(PendingOperation* op, int rv) { … }
void GeneratedCodeCache::ReadComplete(PendingOperation* op) { … }
void GeneratedCodeCache::DeleteEntryImpl(PendingOperation* op) { … }
void GeneratedCodeCache::DoomEntry(PendingOperation* op) { … }
void GeneratedCodeCache::IssueNextOperation(const std::string& key) { … }
void GeneratedCodeCache::CloseOperationAndIssueNext(PendingOperation* op) { … }
void GeneratedCodeCache::EnqueueOperationAndIssueIfNext(
std::unique_ptr<PendingOperation> op) { … }
std::unique_ptr<GeneratedCodeCache::PendingOperation>
GeneratedCodeCache::DequeueOperation(PendingOperation* op) { … }
void GeneratedCodeCache::DoPendingGetBackend(PendingOperation* op) { … }
bool GeneratedCodeCache::IsDeduplicationEnabled() const { … }
bool GeneratedCodeCache::ShouldDeduplicateEntry(uint32_t data_size) const { … }
void GeneratedCodeCache::SetLastUsedTimeForTest(
const GURL& resource_url,
const GURL& origin_lock,
const net::NetworkIsolationKey& nik,
base::Time time,
base::OnceClosure user_callback) { … }
void GeneratedCodeCache::ClearInMemoryCache() { … }
void GeneratedCodeCache::OpenCompleteForSetLastUsedForTest(
base::Time time,
base::OnceClosure callback,
disk_cache::EntryResult result) { … }
void GeneratedCodeCache::CollectStatisticsForTest(
const GURL& resource_url,
const GURL& origin_lock,
GeneratedCodeCache::CacheEntryStatus status) { … }
}