// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EXTENSIONS_RENDERER_GC_CALLBACK_H_ #define EXTENSIONS_RENDERER_GC_CALLBACK_H_ #include "base/callback.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/single_thread_task_runner.h" #include "v8/include/v8.h" namespace extensions { class ScriptContext; // Runs |callback| when v8 garbage collects |object|, or |fallback| if // |context| is invalidated first. Exactly one of |callback| or |fallback| will // be called, after which it deletes itself. // This object manages its own lifetime. // TODO(devlin): Cleanup. "callback" and "fallback" are odd names here, and // we should use OnceCallbacks. class GCCallback { public: GCCallback(ScriptContext* context, const v8::Local& object, const v8::Local& callback, base::OnceClosure fallback); GCCallback(ScriptContext* context, const v8::Local& object, base::OnceClosure callback, base::OnceClosure fallback); private: GCCallback(ScriptContext* context, const v8::Local& object, const v8::Local v8_callback, base::OnceClosure closure_callback, base::OnceClosure fallback); ~GCCallback(); static void OnObjectGC(const v8::WeakCallbackInfo& data); void RunCallback(); void OnContextInvalidated(); // The context which owns |object_|. ScriptContext* context_; // A task runner associated with the frame for the context. scoped_refptr task_runner_; // The object this GCCallback is bound to. v8::Global object_; // The function to run when |object_| is garbage collected. Can be either a // JS or native function (only one will be set). v8::Global v8_callback_; base::OnceClosure closure_callback_; // The function to run if |context_| is invalidated before we have a chance // to execute |callback_|. base::OnceClosure fallback_; base::WeakPtrFactory weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(GCCallback); }; } // namespace extensions #endif // EXTENSIONS_RENDERER_GC_CALLBACK_H_