| // Copyright 2014 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. |
| |
| #include "third_party/blink/renderer/platform/bindings/script_state.h" |
| |
| #include "third_party/blink/renderer/platform/bindings/v8_binding.h" |
| #include "third_party/blink/renderer/platform/bindings/v8_per_context_data.h" |
| #include "third_party/blink/renderer/platform/instance_counters.h" |
| |
| namespace blink { |
| |
| scoped_refptr<ScriptState> ScriptState::Create( |
| v8::Local<v8::Context> context, |
| scoped_refptr<DOMWrapperWorld> world) { |
| scoped_refptr<ScriptState> script_state = |
| base::AdoptRef(new ScriptState(context, std::move(world))); |
| // This AddRef() is for keeping this ScriptState alive as long as the |
| // v8::Context is alive. This is Release()d in the weak callback of the |
| // v8::Context. |
| script_state->AddRef(); |
| return script_state; |
| } |
| |
| static void DerefCallback(const v8::WeakCallbackInfo<ScriptState>& data) { |
| data.GetParameter()->Release(); |
| } |
| |
| static void ContextCollectedCallback( |
| const v8::WeakCallbackInfo<ScriptState>& data) { |
| data.GetParameter()->ClearContext(); |
| data.SetSecondPassCallback(DerefCallback); |
| } |
| |
| ScriptState::ScriptState(v8::Local<v8::Context> context, |
| scoped_refptr<DOMWrapperWorld> world) |
| : isolate_(context->GetIsolate()), |
| context_(isolate_, context), |
| world_(std::move(world)), |
| per_context_data_(V8PerContextData::Create(context)) { |
| DCHECK(world_); |
| context_.SetWeak(this, &ContextCollectedCallback); |
| context->SetAlignedPointerInEmbedderData(kV8ContextPerContextDataIndex, this); |
| } |
| |
| ScriptState::~ScriptState() { |
| DCHECK(!per_context_data_); |
| DCHECK(context_.IsEmpty()); |
| InstanceCounters::DecrementCounter( |
| InstanceCounters::kDetachedScriptStateCounter); |
| } |
| |
| void ScriptState::DetachGlobalObject() { |
| DCHECK(!context_.IsEmpty()); |
| GetContext()->DetachGlobal(); |
| } |
| |
| void ScriptState::DisposePerContextData() { |
| per_context_data_ = nullptr; |
| InstanceCounters::IncrementCounter( |
| InstanceCounters::kDetachedScriptStateCounter); |
| } |
| |
| } // namespace blink |