#ifndef CONTENT_BROWSER_DEVTOOLS_SERVICE_WORKER_DEVTOOLS_AGENT_HOST_H_
#define CONTENT_BROWSER_DEVTOOLS_SERVICE_WORKER_DEVTOOLS_AGENT_HOST_H_
#include <stdint.h>
#include <map>
#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "base/unguessable_token.h"
#include "content/browser/devtools/devtools_agent_host_impl.h"
#include "content/browser/devtools/service_worker_devtools_manager.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_process_host_observer.h"
#include "services/network/public/cpp/cross_origin_embedder_policy.h"
#include "services/network/public/mojom/client_security_state.mojom-forward.h"
#include "services/network/public/mojom/cross_origin_embedder_policy.mojom.h"
#include "services/network/public/mojom/document_isolation_policy.mojom.h"
#include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h"
namespace blink {
class StorageKey;
}
namespace content {
class BrowserContext;
class ServiceWorkerDevToolsAgentHost : public DevToolsAgentHostImpl,
RenderProcessHostObserver {
public:
using List = std::vector<scoped_refptr<ServiceWorkerDevToolsAgentHost>>;
using Map = std::map<std::string,
scoped_refptr<ServiceWorkerDevToolsAgentHost>>;
ServiceWorkerDevToolsAgentHost(
int worker_process_id,
int worker_route_id,
scoped_refptr<ServiceWorkerContextWrapper> context_wrapper,
int64_t version_id,
const GURL& url,
const GURL& scope,
bool is_installed_version,
network::mojom::ClientSecurityStatePtr client_security_state,
mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter>
coep_reporter,
mojo::PendingRemote<network::mojom::DocumentIsolationPolicyReporter>
dip_reporter,
const base::UnguessableToken& devtools_worker_token);
ServiceWorkerDevToolsAgentHost(const ServiceWorkerDevToolsAgentHost&) =
delete;
ServiceWorkerDevToolsAgentHost& operator=(
const ServiceWorkerDevToolsAgentHost&) = delete;
std::optional<blink::StorageKey> GetStorageKey() const;
BrowserContext* GetBrowserContext() override;
std::string GetType() override;
std::string GetTitle() override;
GURL GetURL() override;
bool Activate() override;
void Reload() override;
bool Close() override;
NetworkLoaderFactoryParamsAndInfo CreateNetworkFactoryParamsForDevTools()
override;
RenderProcessHost* GetProcessHost() override;
std::optional<network::CrossOriginEmbedderPolicy>
cross_origin_embedder_policy(const std::string& id) override;
void WorkerStarted(int worker_process_id, int worker_route_id);
void WorkerReadyForInspection(
mojo::PendingRemote<blink::mojom::DevToolsAgent> agent_remote,
mojo::PendingReceiver<blink::mojom::DevToolsAgentHost> host_receiver);
void UpdateClientSecurityState(
network::mojom::ClientSecurityStatePtr client_security_state,
mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter>
coep_reporter,
mojo::PendingRemote<network::mojom::DocumentIsolationPolicyReporter>
dip_reporter);
void WorkerStopped();
void WorkerVersionInstalled();
void WorkerVersionDoomed();
void WorkerMainScriptFetchingFailed();
const GURL& scope() const { return scope_; }
const base::UnguessableToken& devtools_worker_token() const {
return devtools_worker_token_;
}
base::Time version_installed_time() const { return version_installed_time_; }
base::Time version_doomed_time() const { return version_doomed_time_; }
int64_t version_id() const { return version_id_; }
ServiceWorkerContextWrapper* context_wrapper() {
return context_wrapper_.get();
}
bool should_pause_on_start() { return should_pause_on_start_; }
void set_should_pause_on_start(bool should_pause_on_start);
private:
~ServiceWorkerDevToolsAgentHost() override;
void UpdateIsAttached(bool attached);
void UpdateProcessHost();
void ForceUpdateOnReloadIfModified();
bool AttachSession(DevToolsSession* session) override;
void DetachSession(DevToolsSession* session) override;
protocol::TargetAutoAttacher* auto_attacher() override;
void RenderProcessHostDestroyed(RenderProcessHost* host) override;
void UpdateLoaderFactories(base::OnceClosure callback);
std::unique_ptr<protocol::TargetAutoAttacher> auto_attacher_;
enum WorkerState {
WORKER_NOT_READY,
WORKER_READY,
WORKER_TERMINATED,
};
WorkerState state_;
base::UnguessableToken devtools_worker_token_;
int worker_process_id_;
int worker_route_id_;
scoped_refptr<ServiceWorkerContextWrapper> context_wrapper_;
int64_t version_id_;
GURL url_;
GURL scope_;
base::Time version_installed_time_;
base::Time version_doomed_time_;
bool should_pause_on_start_ = false;
network::mojom::ClientSecurityStatePtr client_security_state_;
mojo::Remote<network::mojom::CrossOriginEmbedderPolicyReporter>
coep_reporter_;
mojo::Remote<network::mojom::DocumentIsolationPolicyReporter> dip_reporter_;
base::ScopedObservation<RenderProcessHost, RenderProcessHostObserver>
process_observation_{this};
};
}
#endif