| // Copyright 2019 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_V8_VALUE_OR_SCRIPT_WRAPPABLE_ADAPTER_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_V8_VALUE_OR_SCRIPT_WRAPPABLE_ADAPTER_H_ |
| |
| #include "third_party/blink/renderer/platform/heap/handle.h" |
| #include "third_party/blink/renderer/platform/heap/persistent.h" |
| #include "v8/include/v8.h" |
| |
| namespace blink { |
| |
| class ScriptState; |
| class ScriptWrappable; |
| |
| namespace bindings { |
| |
| // V8ValueOrScriptWrappableAdapter is an adapter to make bindings functions take |
| // either of v8::Local<v8::Value> or ScriptWrappable*. |
| // |
| // This class is only designed to be used as function argument types in bindings |
| // layer. Please refrain from abuse for other purpose and/or outside bindings. |
| class PLATFORM_EXPORT V8ValueOrScriptWrappableAdapter { |
| STACK_ALLOCATED(); |
| |
| public: |
| // Supports implicit conversions from v8::Value and ScriptWrappable type |
| // family so that the call sites do not need to recognize this helper class. |
| V8ValueOrScriptWrappableAdapter(std::nullptr_t) {} |
| V8ValueOrScriptWrappableAdapter(v8::Local<v8::Value> v8_value) |
| : v8_value_(v8_value) { |
| DCHECK(!v8_value_.IsEmpty()); |
| } |
| V8ValueOrScriptWrappableAdapter(ScriptWrappable* script_wrappable) |
| : script_wrappable_(script_wrappable) {} |
| template <typename T> |
| V8ValueOrScriptWrappableAdapter(Persistent<T> script_wrappable) |
| : script_wrappable_(script_wrappable) { |
| static_assert(std::is_base_of<ScriptWrappable, T>::value, |
| "script_wrappable must be a ScriptWrappable"); |
| } |
| |
| // Returns the specified v8::Value or the V8 wrapper object of the specified |
| // ScriptWrappable. In the latter case, the wrapper may be created in |
| // |creation_context|. |
| v8::Local<v8::Value> V8Value(ScriptState* creation_context) const; |
| |
| // Returns true when none of v8::Value nor ScriptWrappable is specified. |
| bool IsEmpty() const { return v8_value_.IsEmpty() && !script_wrappable_; } |
| |
| private: |
| v8::Local<v8::Value> v8_value_; |
| ScriptWrappable* script_wrappable_ = nullptr; |
| }; |
| |
| } // namespace bindings |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_BINDINGS_V8_VALUE_OR_SCRIPT_WRAPPABLE_ADAPTER_H_ |