|  | // 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 |