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
|
// Copyright 2024 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/commerce/core/commerce_info_cache.h"
#include "components/commerce/core/commerce_types.h"
#include "url/gurl.h"
namespace commerce {
CommerceInfoCache::CacheEntry::CacheEntry() = default;
CommerceInfoCache::CacheEntry::~CacheEntry() = default;
CommerceInfoCache::CommerceInfoCache() = default;
CommerceInfoCache::~CommerceInfoCache() = default;
void CommerceInfoCache::AddRef(const GURL& url) {
const std::string url_string = url.spec();
auto it = referenced_urls_.find(url_string);
if (it == referenced_urls_.end()) {
referenced_urls_[url_string] = 0;
cache_.emplace(url.spec(),
std::make_unique<CommerceInfoCache::CacheEntry>());
}
referenced_urls_[url_string] = referenced_urls_[url_string] + 1;
}
void CommerceInfoCache::RemoveRef(const GURL& url) {
const std::string url_string = url.spec();
auto it = referenced_urls_.find(url_string);
if (it == referenced_urls_.end()) {
return;
}
referenced_urls_[url_string] = referenced_urls_[url_string] - 1;
// If no other systems are maintaining the URL, clear the cache entry if it
// exists.
if (referenced_urls_[url_string] == 0) {
referenced_urls_.erase(it);
auto cache_it = cache_.find(url_string);
if (cache_it != cache_.end()) {
if (cache_it->second->run_local_extraction_task.get()) {
cache_it->second->run_local_extraction_task->Cancel();
cache_it->second->run_local_extraction_task.reset();
}
cache_.erase(cache_it);
}
}
}
bool CommerceInfoCache::IsUrlReferenced(const GURL& url) {
return referenced_urls_.find(url.spec()) != referenced_urls_.end();
}
CommerceInfoCache::CacheEntry* CommerceInfoCache::GetEntryForUrl(
const GURL& url) {
auto it = cache_.find(url.spec());
if (it == cache_.end()) {
return nullptr;
}
return it->second.get();
}
size_t CommerceInfoCache::GetUrlRefCount(const GURL& url) {
auto it = referenced_urls_.find(url.spec());
if (it == referenced_urls_.end()) {
return 0;
}
return it->second;
}
} // namespace commerce
|