#ifndef EXTENSIONS_BROWSER_BLOCKLIST_H_
#define EXTENSIONS_BROWSER_BLOCKLIST_H_
#include <list>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/callback_list.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/blocklist_state.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/extension_id.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
namespace content {
class BrowserContext;
}
namespace safe_browsing {
class SafeBrowsingDatabaseManager;
}
namespace extensions {
class BlocklistStateFetcher;
class Blocklist : public KeyedService {
public:
class Observer {
public:
explicit Observer(Blocklist* blocklist);
virtual void OnBlocklistUpdated() = 0;
protected:
virtual ~Observer();
private:
raw_ptr<Blocklist> blocklist_;
};
using BlocklistStateMap = std::map<ExtensionId, BlocklistState>;
using GetBlocklistedIDsCallback =
base::OnceCallback<void(const BlocklistStateMap&)>;
using GetMalwareIDsCallback =
base::OnceCallback<void(const std::set<ExtensionId>&)>;
using IsBlocklistedCallback = base::OnceCallback<void(BlocklistState)>;
using DatabaseReadyCallback = base::OnceCallback<void(bool)>;
explicit Blocklist(content::BrowserContext* context);
Blocklist(const Blocklist&) = delete;
Blocklist& operator=(const Blocklist&) = delete;
~Blocklist() override;
void GetBlocklistedIDs(const std::set<ExtensionId>& ids,
GetBlocklistedIDsCallback callback);
void GetMalwareIDs(const std::set<ExtensionId>& ids,
GetMalwareIDsCallback callback);
void IsBlocklisted(const ExtensionId& extension_id,
IsBlocklistedCallback callback);
void SetBlocklistStateFetcherForTest(BlocklistStateFetcher* fetcher);
BlocklistStateFetcher* ResetBlocklistStateFetcherForTest();
void ResetDatabaseUpdatedListenerForTest();
void ResetBlocklistStateCacheForTest();
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
void IsDatabaseReady(DatabaseReadyCallback callback);
private:
friend class ScopedDatabaseManagerForTest;
static void SetDatabaseManager(
scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
database_manager);
static scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
GetDatabaseManager();
void ObserveNewDatabase();
void NotifyObservers();
void GetBlocklistStateForIDs(GetBlocklistedIDsCallback callback,
const std::set<ExtensionId>& blocklisted_ids);
void RequestExtensionsBlocklistState(const std::set<ExtensionId>& ids,
base::OnceClosure callback);
void OnBlocklistStateReceived(const ExtensionId& id, BlocklistState state);
void ReturnBlocklistStateMap(GetBlocklistedIDsCallback callback,
const std::set<ExtensionId>& blocklisted_ids);
raw_ptr<content::BrowserContext> context_;
base::ObserverList<Observer>::Unchecked observers_;
base::CallbackListSubscription database_updated_subscription_;
base::CallbackListSubscription database_changed_subscription_;
BlocklistStateMap blocklist_state_cache_;
std::unique_ptr<BlocklistStateFetcher> state_fetcher_;
std::list<std::pair<std::vector<std::string>, base::OnceClosure>>
state_requests_;
base::WeakPtrFactory<Blocklist> weak_ptr_factory_{this};
};
}
#endif