blob: f40a15a86744ae5ba18898aa67fd56c772412058 [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 CHROME_BROWSER_GLIC_MEDIA_GLIC_MEDIA_PAGE_CACHE_H_
#define CHROME_BROWSER_GLIC_MEDIA_GLIC_MEDIA_PAGE_CACHE_H_
#include "base/containers/linked_list.h"
#include "base/memory/raw_ptr.h"
namespace glic {
// Cache for pages with media context. Currently, this is a thin wrapper
// around `LinkedList` that avoids shutdown order issues. This can be
// expanded to cache entries based on other properties, like document
// pip-ness, in the future.
class GlicMediaPageCache {
public:
// Handy base class for cache entries. It would be nice if this could be
// private inheritance to `LinkNode`, but that's more boiler plate than it's
// worth. Simply don't call any `LinkNode` methods outside of the cache.
class Entry : public base::LinkNode<Entry> {
public:
Entry();
virtual ~Entry();
GlicMediaPageCache* cache() { return cache_; }
// Notify us that we've been added to the cache.
void OnCached(GlicMediaPageCache*);
// Notify that we've been removed from the cache. One might override
// `RemoveFromList`, but it's not virtual and would be very easy to call the
// base class implementation unintentionally.
void OnUncached();
private:
// Cache to which this entry belongs, or null if we're not cached.
raw_ptr<GlicMediaPageCache> cache_ = nullptr;
};
GlicMediaPageCache();
virtual ~GlicMediaPageCache();
// Will either move or add, as appropriate.
void PlaceAtFront(Entry* entry);
// Use this in favor of Entry::RemoveFromList, because there is more cleanup
// than just that.
void RemoveFromCache(Entry* entry);
Entry* front() {
return !cache_.empty() ? static_cast<Entry*>(cache_.head()) : nullptr;
}
const base::LinkedList<Entry>& cache_for_testing() const { return cache_; }
private:
base::LinkedList<Entry> cache_;
};
} // namespace glic
#endif // CHROME_BROWSER_GLIC_MEDIA_GLIC_MEDIA_PAGE_CACHE_H_