#ifndef CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_BACKGROUND_SERVICES_CONTEXT_IMPL_H_
#define CONTENT_BROWSER_DEVTOOLS_DEVTOOLS_BACKGROUND_SERVICES_CONTEXT_IMPL_H_
#include <array>
#include <map>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ref.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "base/time/time.h"
#include "content/browser/devtools/devtools_background_services.pb.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/common/content_export.h"
#include "content/public/browser/devtools_background_services_context.h"
namespace content {
class BrowserContext;
class ServiceWorkerContextWrapper;
class CONTENT_EXPORT DevToolsBackgroundServicesContextImpl
: public DevToolsBackgroundServicesContext {
public:
using GetLoggedBackgroundServiceEventsCallback = base::OnceCallback<void(
std::vector<devtools::proto::BackgroundServiceEvent>)>;
class EventObserver : public base::CheckedObserver {
public:
virtual void OnEventReceived(
const devtools::proto::BackgroundServiceEvent& event) = 0;
virtual void OnRecordingStateChanged(
bool should_record,
devtools::proto::BackgroundService service) = 0;
};
DevToolsBackgroundServicesContextImpl(
BrowserContext* browser_context,
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context);
~DevToolsBackgroundServicesContextImpl() override;
DevToolsBackgroundServicesContextImpl(
const DevToolsBackgroundServicesContextImpl&) = delete;
DevToolsBackgroundServicesContextImpl& operator=(
const DevToolsBackgroundServicesContextImpl&) = delete;
void AddObserver(EventObserver* observer);
void RemoveObserver(const EventObserver* observer);
bool IsRecording(DevToolsBackgroundService service) override;
void LogBackgroundServiceEvent(
uint64_t service_worker_registration_id,
blink::StorageKey storage_key,
DevToolsBackgroundService service,
const std::string& event_name,
const std::string& instance_id,
const std::map<std::string, std::string>& event_metadata) override;
bool IsRecording(devtools::proto::BackgroundService service);
void StartRecording(devtools::proto::BackgroundService service);
void StopRecording(devtools::proto::BackgroundService service);
void GetLoggedBackgroundServiceEvents(
devtools::proto::BackgroundService service,
GetLoggedBackgroundServiceEventsCallback callback);
void ClearLoggedBackgroundServiceEvents(
devtools::proto::BackgroundService service);
private:
friend class DevToolsBackgroundServicesContextTest;
bool IsRecordingExpired(devtools::proto::BackgroundService service);
void DidGetUserData(
GetLoggedBackgroundServiceEventsCallback callback,
const std::vector<std::pair<int64_t, std::string>>& user_data,
blink::ServiceWorkerStatusCode status);
void NotifyEventObservers(
const devtools::proto::BackgroundServiceEvent& event);
void OnRecordingTimeExpired(devtools::proto::BackgroundService service);
const raw_ref<BrowserContext> browser_context_;
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
std::array<base::Time, devtools::proto::BackgroundService::COUNT>
expiration_times_;
base::ObserverList<EventObserver> observers_;
base::WeakPtrFactory<DevToolsBackgroundServicesContextImpl> weak_ptr_factory_{
this};
};
}
#endif