kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 1 | // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef EXTENSIONS_RENDERER_GC_CALLBACK_H_ |
| 6 | #define EXTENSIONS_RENDERER_GC_CALLBACK_H_ |
| 7 | |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 8 | #include "base/callback.h" |
avi | 2d124c0 | 2015-12-23 06:36:42 | [diff] [blame] | 9 | #include "base/macros.h" |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 10 | #include "base/memory/weak_ptr.h" |
| 11 | #include "v8/include/v8.h" |
| 12 | |
| 13 | namespace extensions { |
| 14 | |
| 15 | class ScriptContext; |
| 16 | |
| 17 | // Runs |callback| when v8 garbage collects |object|, or |fallback| if |
| 18 | // |context| is invalidated first. Exactly one of |callback| or |fallback| will |
| 19 | // be called, after which it deletes itself. |
Devlin Cronin | 75bd3602 | 2017-11-22 19:03:07 | [diff] [blame] | 20 | // This object manages its own lifetime. |
| 21 | // TODO(devlin): Cleanup. "callback" and "fallback" are odd names here, and |
| 22 | // we should use OnceCallbacks. |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 23 | class GCCallback { |
| 24 | public: |
| 25 | GCCallback(ScriptContext* context, |
| 26 | const v8::Local<v8::Object>& object, |
| 27 | const v8::Local<v8::Function>& callback, |
| 28 | const base::Closure& fallback); |
Devlin Cronin | 75bd3602 | 2017-11-22 19:03:07 | [diff] [blame] | 29 | GCCallback(ScriptContext* context, |
| 30 | const v8::Local<v8::Object>& object, |
| 31 | const base::Closure& callback, |
| 32 | const base::Closure& fallback); |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 33 | |
| 34 | private: |
Devlin Cronin | 75bd3602 | 2017-11-22 19:03:07 | [diff] [blame] | 35 | GCCallback(ScriptContext* context, |
| 36 | const v8::Local<v8::Object>& object, |
| 37 | const v8::Local<v8::Function> v8_callback, |
| 38 | const base::Closure& closure_callback, |
| 39 | const base::Closure& fallback); |
| 40 | ~GCCallback(); |
| 41 | |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 42 | static void OnObjectGC(const v8::WeakCallbackInfo<GCCallback>& data); |
| 43 | void RunCallback(); |
| 44 | void OnContextInvalidated(); |
| 45 | |
| 46 | // The context which owns |object_|. |
| 47 | ScriptContext* context_; |
| 48 | |
| 49 | // The object this GCCallback is bound to. |
| 50 | v8::Global<v8::Object> object_; |
| 51 | |
Devlin Cronin | 75bd3602 | 2017-11-22 19:03:07 | [diff] [blame] | 52 | // The function to run when |object_| is garbage collected. Can be either a |
| 53 | // JS or native function (only one will be set). |
| 54 | v8::Global<v8::Function> v8_callback_; |
| 55 | base::Closure closure_callback_; |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 56 | |
| 57 | // The function to run if |context_| is invalidated before we have a chance |
| 58 | // to execute |callback_|. |
| 59 | base::Closure fallback_; |
| 60 | |
Jeremy Roman | 9fc2de6 | 2019-07-12 14:15:03 | [diff] [blame] | 61 | base::WeakPtrFactory<GCCallback> weak_ptr_factory_{this}; |
kalman | 32d7af2 | 2015-07-24 05:10:59 | [diff] [blame] | 62 | |
| 63 | DISALLOW_COPY_AND_ASSIGN(GCCallback); |
| 64 | }; |
| 65 | |
| 66 | } // namespace extensions |
| 67 | |
| 68 | #endif // EXTENSIONS_RENDERER_GC_CALLBACK_H_ |