1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/bindings/dom_data_store.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h"
#include "third_party/blink/renderer/platform/heap/visitor.h"
#include "third_party/blink/renderer/platform/wtf/size_assertions.h"
namespace blink {
struct SameSizeAsScriptWrappable {
virtual ~SameSizeAsScriptWrappable() = default;
v8::Persistent<v8::Object> main_world_wrapper_;
};
ASSERT_SIZE(ScriptWrappable, SameSizeAsScriptWrappable);
v8::Local<v8::Value> ScriptWrappable::ToV8(ScriptState* script_state) {
v8::Local<v8::Object> wrapper;
if (DOMDataStore::GetWrapper(script_state, this).ToLocal(&wrapper))
[[likely]] {
return wrapper;
}
return Wrap(script_state);
}
v8::Local<v8::Value> ScriptWrappable::ToV8(
v8::Isolate* isolate,
v8::Local<v8::Object> creation_context_object) {
v8::Local<v8::Object> wrapper;
if (DOMDataStore::GetWrapper(isolate, this).ToLocal(&wrapper)) [[likely]] {
return wrapper;
}
CHECK(!creation_context_object.IsEmpty());
ScriptState* script_state =
ScriptState::ForRelevantRealm(isolate, creation_context_object);
return Wrap(script_state);
}
v8::Local<v8::Value> ScriptWrappable::Wrap(ScriptState* script_state) {
const WrapperTypeInfo* wrapper_type_info = ToWrapperTypeInfo(this);
DCHECK(!DOMDataStore::ContainsWrapper(script_state->GetIsolate(), this));
v8::Local<v8::Object> wrapper =
V8DOMWrapper::CreateWrapper(script_state, wrapper_type_info);
return AssociateWithWrapper(script_state->GetIsolate(), wrapper_type_info,
wrapper);
}
v8::Local<v8::Object> ScriptWrappable::AssociateWithWrapper(
v8::Isolate* isolate,
const WrapperTypeInfo* wrapper_type_info,
v8::Local<v8::Object> wrapper) {
return V8DOMWrapper::AssociateObjectWithWrapper(isolate, this,
wrapper_type_info, wrapper);
}
void ScriptWrappable::Trace(Visitor* visitor) const {
v8::Object::Wrappable::Trace(visitor);
visitor->Trace(wrapper_);
}
const char* ScriptWrappable::GetHumanReadableName() const {
return ToWrapperTypeInfo(this)->interface_name;
}
} // namespace blink
|