blob: 59a6ac69b9e476cea94f8e7ea2aa7994293cada9 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_BROWSER_MOJO_KEEP_ALIVE_IMPL_H_
#define EXTENSIONS_BROWSER_MOJO_KEEP_ALIVE_IMPL_H_
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/process_manager_observer.h"
#include "extensions/common/mojom/keep_alive.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
namespace content {
class BrowserContext;
class RenderFrameHost;
}
namespace extensions {
class Extension;
class ProcessManager;
// An RAII mojo service implementation for extension keep alives. This adds a
// keep alive on construction and removes it on destruction.
class KeepAliveImpl : public KeepAlive,
public ExtensionRegistryObserver,
public ProcessManagerObserver {
public:
KeepAliveImpl(const KeepAliveImpl&) = delete;
KeepAliveImpl& operator=(const KeepAliveImpl&) = delete;
// Create a keep alive for `extension` running in `context` and connect it to
// `receiver`. When the receiver closes its pipe, the keep alive ends.
static void Create(content::BrowserContext* browser_context,
const Extension* extension,
content::RenderFrameHost* render_frame_host,
mojo::PendingReceiver<KeepAlive> receiver);
private:
KeepAliveImpl(content::BrowserContext* context,
const Extension* extension,
mojo::PendingReceiver<KeepAlive> receiver);
~KeepAliveImpl() override;
// ExtensionRegistryObserver overrides.
void OnExtensionUnloaded(content::BrowserContext* browser_context,
const Extension* extension,
UnloadedExtensionReason reason) override;
void OnShutdown(ExtensionRegistry* registry) override;
// ProcessManagerObserver overrides.
void OnProcessManagerShutdown(ProcessManager* manager) override;
// Invoked when the mojo connection is disconnected.
void OnDisconnected();
raw_ptr<content::BrowserContext> context_;
raw_ptr<const Extension> extension_;
base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observation_{this};
base::ScopedObservation<ProcessManager, ProcessManagerObserver>
process_manager_observation_{this};
mojo::Receiver<KeepAlive> receiver_;
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_MOJO_KEEP_ALIVE_IMPL_H_