// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_PERFORMANCE_MANAGER_WORKER_WATCHER_H_ #define COMPONENTS_PERFORMANCE_MANAGER_WORKER_WATCHER_H_ #include <map> #include <memory> #include <string> #include "base/check_op.h" #include "base/containers/flat_map.h" #include "base/containers/flat_set.h" #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "base/sequence_checker.h" #include "components/performance_manager/service_worker_context_adapter.h" #include "content/public/browser/dedicated_worker_service.h" #include "content/public/browser/global_routing_id.h" #include "content/public/browser/service_worker_context_observer.h" #include "content/public/browser/shared_worker_service.h" #include "third_party/blink/public/common/tokens/tokens.h" namespace performance_manager { class FrameNodeImpl; class FrameNodeSource; class ProcessNodeSource; class WorkerNodeImpl; // This class keeps track of running workers of all types for a single browser // context and handles the ownership of the worker nodes. // // Most of the complexity of this class is tracking every worker's clients. Each // type of worker handles them a bit differently. // // The simplest case is dedicated workers, where each worker always has exactly // one frame client. Technically, it is possible to create a nested dedicated // worker, but for now they are treated as child of the ancestor frame. // TODO(crbug.com/40149051): Expose nested dedicated workers correctly. // // Shared workers are quite similar to dedicated workers but they can have any // number of clients. Also, a shared worker can temporarily appear to have no // clients shortly after being created and just before being destroyed. // // Service workers are more complicated to handle. They also can have any number // of clients, but they aren't only frames. They could also be dedicated worker // and shared worker clients. These different types of clients are tracked using // the ServiceWorkerClientInfo type. Also, because of the important role the // service worker plays with frame navigations, the service worker can be // created before its first client's navigation has committed to a // RenderFrameHost. So when a OnControlleeAdded() notification is received for // a client frame, it is necessary to wait until the RenderFrameHost was // determined. class WorkerWatcher : public content::DedicatedWorkerService::Observer, public content::SharedWorkerService::Observer, public content::ServiceWorkerContextObserver { … }; } // namespace performance_manager #endif // COMPONENTS_PERFORMANCE_MANAGER_WORKER_WATCHER_H_