|  | // 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 <map> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/basictypes.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/memory/weak_ptr.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. | 
|  | class GCCallback { | 
|  | public: | 
|  | GCCallback(ScriptContext* context, | 
|  | const v8::Local<v8::Object>& object, | 
|  | const v8::Local<v8::Function>& callback, | 
|  | const base::Closure& fallback); | 
|  | ~GCCallback(); | 
|  |  | 
|  | private: | 
|  | static void OnObjectGC(const v8::WeakCallbackInfo<GCCallback>& data); | 
|  | void RunCallback(); | 
|  | void OnContextInvalidated(); | 
|  |  | 
|  | // The context which owns |object_|. | 
|  | ScriptContext* context_; | 
|  |  | 
|  | // The object this GCCallback is bound to. | 
|  | v8::Global<v8::Object> object_; | 
|  |  | 
|  | // The function to run when |object_| is garbage collected. | 
|  | v8::Global<v8::Function> callback_; | 
|  |  | 
|  | // The function to run if |context_| is invalidated before we have a chance | 
|  | // to execute |callback_|. | 
|  | base::Closure fallback_; | 
|  |  | 
|  | base::WeakPtrFactory<GCCallback> weak_ptr_factory_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(GCCallback); | 
|  | }; | 
|  |  | 
|  | }  // namespace extensions | 
|  |  | 
|  | #endif  // EXTENSIONS_RENDERER_GC_CALLBACK_H_ |