#ifndef EXTENSIONS_RENDERER_GC_CALLBACK_H_
#define EXTENSIONS_RENDERER_GC_CALLBACK_H_
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "v8/include/v8-forward.h"
#include "v8/include/v8-persistent-handle.h"
namespace extensions {
class ScriptContext;
class GCCallback {
public:
GCCallback(ScriptContext* context,
const v8::Local<v8::Object>& object,
const v8::Local<v8::Function>& callback,
base::OnceClosure fallback);
GCCallback(ScriptContext* context,
const v8::Local<v8::Object>& object,
base::OnceClosure callback,
base::OnceClosure fallback);
GCCallback(const GCCallback&) = delete;
GCCallback& operator=(const GCCallback&) = delete;
private:
GCCallback(ScriptContext* context,
const v8::Local<v8::Object>& object,
const v8::Local<v8::Function> v8_callback,
base::OnceClosure closure_callback,
base::OnceClosure fallback);
~GCCallback();
static void OnObjectGC(const v8::WeakCallbackInfo<GCCallback>& data);
void RunCallback();
void OnContextInvalidated();
raw_ptr<ScriptContext> context_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
v8::Global<v8::Object> object_;
v8::Global<v8::Function> v8_callback_;
base::OnceClosure closure_callback_;
base::OnceClosure fallback_;
base::WeakPtrFactory<GCCallback> weak_ptr_factory_{this};
};
}
#endif