#ifndef EXTENSIONS_BROWSER_API_OFFSCREEN_OFFSCREEN_DOCUMENT_MANAGER_H_
#define EXTENSIONS_BROWSER_API_OFFSCREEN_OFFSCREEN_DOCUMENT_MANAGER_H_
#include <map>
#include <memory>
#include <set>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "components/keyed_service/core/keyed_service.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/api/offscreen.h"
#include "extensions/common/extension_id.h"
class BrowserContextKeyedServiceFactory;
class GURL;
namespace extensions {
class Extension;
class ExtensionHost;
class OffscreenDocumentHost;
class OffscreenDocumentLifetimeEnforcer;
class OffscreenDocumentManager : public KeyedService,
public ExtensionRegistryObserver {
public:
explicit OffscreenDocumentManager(content::BrowserContext* browser_context);
OffscreenDocumentManager(const OffscreenDocumentManager&) = delete;
OffscreenDocumentManager& operator=(const OffscreenDocumentManager&) = delete;
~OffscreenDocumentManager() override;
static OffscreenDocumentManager* Get(
content::BrowserContext* browser_context);
static BrowserContextKeyedServiceFactory* GetFactory();
OffscreenDocumentHost* CreateOffscreenDocument(
const Extension& extension,
const GURL& url,
std::set<api::offscreen::Reason> reasons);
OffscreenDocumentHost* GetOffscreenDocumentForExtension(
const Extension& extension);
void CloseOffscreenDocumentForExtension(const Extension& extension);
private:
struct OffscreenDocumentData {
OffscreenDocumentData();
OffscreenDocumentData(OffscreenDocumentData&&);
~OffscreenDocumentData();
std::unique_ptr<OffscreenDocumentHost> host;
std::vector<std::unique_ptr<OffscreenDocumentLifetimeEnforcer>> enforcers;
};
void CloseOffscreenDocumentForExtensionId(const ExtensionId& extension_id);
void OnOffscreenDocumentActivityChanged(const ExtensionId& extension_id);
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) override;
void Shutdown() override;
void CloseOffscreenDocument(ExtensionHost* offscreen_document);
std::map<ExtensionId, OffscreenDocumentData> offscreen_documents_;
raw_ptr<content::BrowserContext> browser_context_;
base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
registry_observation_{this};
};
}
#endif