#ifndef CONTENT_BROWSER_BACKGROUND_FETCH_STORAGE_DATABASE_TASK_H_
#define CONTENT_BROWSER_BACKGROUND_FETCH_STORAGE_DATABASE_TASK_H_
#include <memory>
#include <set>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "content/browser/background_fetch/background_fetch.pb.h"
#include "content/browser/background_fetch/background_fetch_registration_id.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom.h"
#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom.h"
namespace blink {
class StorageKey;
}
namespace storage {
class QuotaManagerProxy;
}
namespace content {
class BackgroundFetchDataManager;
class ChromeBlobStorageContext;
class ServiceWorkerContextWrapper;
using HandleBackgroundFetchErrorCallback =
base::OnceCallback<void(blink::mojom::BackgroundFetchError)>;
namespace background_fetch {
class DatabaseTask;
class DatabaseTaskHost {
public:
virtual void OnTaskFinished(DatabaseTask* task) = 0;
virtual BackgroundFetchDataManager* data_manager() = 0;
virtual ~DatabaseTaskHost();
virtual base::WeakPtr<DatabaseTaskHost> GetWeakPtr() = 0;
protected:
DatabaseTaskHost();
};
class DatabaseTask : public DatabaseTaskHost {
public:
using IsQuotaAvailableCallback = base::OnceCallback<void(bool is_available)>;
using StorageVersionCallback =
base::OnceCallback<void(proto::BackgroundFetchStorageVersion)>;
DatabaseTask(const DatabaseTask&) = delete;
DatabaseTask& operator=(const DatabaseTask&) = delete;
~DatabaseTask() override;
virtual void Start() = 0;
protected:
enum class BackgroundFetchStorageError {
kNone,
kServiceWorkerStorageError,
kCacheStorageError,
kStorageError,
kMaxValue = kStorageError
};
explicit DatabaseTask(DatabaseTaskHost* host);
void Finished();
void AddDatabaseTask(std::unique_ptr<DatabaseTask> task);
void AddSubTask(std::unique_ptr<DatabaseTask> task);
void AbandonFetches(int64_t service_worker_registration_id);
ServiceWorkerContextWrapper* service_worker_context();
std::set<std::string>& ref_counted_unique_ids();
ChromeBlobStorageContext* blob_storage_context();
const scoped_refptr<storage::QuotaManagerProxy>& quota_manager_proxy();
void OnTaskFinished(DatabaseTask* finished_subtask) override;
BackgroundFetchDataManager* data_manager() override;
void SetStorageError(BackgroundFetchStorageError error);
void SetStorageErrorAndFinish(BackgroundFetchStorageError error);
bool HasStorageError();
void IsQuotaAvailable(const blink::StorageKey& storage_key,
int64_t size,
IsQuotaAvailableCallback callback);
void GetStorageVersion(int64_t service_worker_registration_id,
const std::string& unique_id,
StorageVersionCallback callback);
void OpenCache(
const BackgroundFetchRegistrationId& registration_id,
int64_t trace_id,
base::OnceCallback<void(blink::mojom::CacheStorageError)> callback);
void DeleteCache(const blink::StorageKey& storage_key,
const std::string& unique_id,
int64_t trace_id,
blink::mojom::CacheStorage::DeleteCallback callback);
const mojo::AssociatedRemote<blink::mojom::CacheStorageCache>&
cache_storage_cache_remote() const {
return cache_storage_cache_remote_;
}
private:
virtual void FinishWithError(blink::mojom::BackgroundFetchError error) = 0;
void DidGetStorageVersion(StorageVersionCallback callback,
const std::vector<std::string>& data,
blink::ServiceWorkerStatusCode status);
void DidOpenCache(
base::OnceCallback<void(blink::mojom::CacheStorageError)> callback,
blink::mojom::CacheStorage::OpenResult result);
base::WeakPtr<DatabaseTaskHost> GetWeakPtr() override;
raw_ptr<DatabaseTaskHost> host_;
std::map<DatabaseTask*, std::unique_ptr<DatabaseTask>> active_subtasks_;
BackgroundFetchStorageError storage_error_ =
BackgroundFetchStorageError::kNone;
mojo::AssociatedRemote<blink::mojom::CacheStorageCache>
cache_storage_cache_remote_;
base::WeakPtrFactory<DatabaseTask> weak_ptr_factory_{this};
};
}
}
#endif