-/*
- * Copyright (C) 2009, 2011 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
+// 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 "config.h"
#include "bindings/v8/ScriptState.h"
-#include "V8Window.h"
-#include "V8WorkerGlobalScope.h"
-#include "bindings/v8/ScriptController.h"
-#include "bindings/v8/V8HiddenValue.h"
-#include "bindings/v8/WorkerScriptController.h"
+#include "bindings/v8/V8Binding.h"
#include "core/frame/LocalFrame.h"
-#include "core/workers/WorkerGlobalScope.h"
-#include <v8.h>
-#include "wtf/Assertions.h"
namespace WebCore {
-ScriptState::ScriptState(v8::Handle<v8::Context> context)
- : m_context(context->GetIsolate(), context)
- , m_isolate(context->GetIsolate())
+PassRefPtr<ScriptState> ScriptState::create(v8::Handle<v8::Context> context, PassRefPtr<DOMWrapperWorld> world)
{
- m_context.setWeak(this, &setWeakCallback);
+ RefPtr<ScriptState> scriptState = adoptRef(new ScriptState(context, world));
+ // This ref() is for keeping this ScriptState alive as long as the v8::Context is alive.
+ // This is deref()ed in the weak callback of the v8::Context.
+ scriptState->ref();
+ return scriptState;
}
-ScriptState::~ScriptState()
+static void weakCallback(const v8::WeakCallbackData<v8::Context, ScriptState>& data)
{
+ data.GetValue()->SetAlignedPointerInEmbedderData(v8ContextPerContextDataIndex, 0);
+ data.GetParameter()->clearContext();
+ data.GetParameter()->deref();
}
-DOMWindow* ScriptState::domWindow() const
+ScriptState::ScriptState(v8::Handle<v8::Context> context, PassRefPtr<DOMWrapperWorld> world)
+ : m_isolate(context->GetIsolate())
+ , m_context(m_isolate, context)
+ , m_world(world)
+ , m_perContextData(V8PerContextData::create(context))
{
- v8::HandleScope handleScope(m_isolate);
- return toDOMWindow(m_context.newLocal(m_isolate));
+ ASSERT(m_world);
+ m_context.setWeak(this, &weakCallback);
+ context->SetAlignedPointerInEmbedderData(v8ContextPerContextDataIndex, this);
}
-ExecutionContext* ScriptState::executionContext() const
-{
- v8::HandleScope handleScope(m_isolate);
- return toExecutionContext(m_context.newLocal(m_isolate));
-}
-
-ScriptState* ScriptState::forContext(v8::Handle<v8::Context> context)
-{
- v8::Context::Scope contextScope(context);
-
- v8::Local<v8::Object> innerGlobal = v8::Local<v8::Object>::Cast(context->Global()->GetPrototype());
-
- v8::Local<v8::Value> scriptStateWrapper = V8HiddenValue::getHiddenValue(context->GetIsolate(), innerGlobal, V8HiddenValue::scriptState(context->GetIsolate()));
- if (!scriptStateWrapper.IsEmpty() && scriptStateWrapper->IsExternal())
- return static_cast<ScriptState*>(v8::External::Cast(*scriptStateWrapper)->Value());
-
- ScriptState* scriptState = new ScriptState(context);
- V8HiddenValue::setHiddenValue(context->GetIsolate(), innerGlobal, V8HiddenValue::scriptState(context->GetIsolate()), v8::External::New(context->GetIsolate(), scriptState));
- return scriptState;
-}
-
-ScriptState* ScriptState::current()
-{
- v8::Isolate* isolate = v8::Isolate::GetCurrent();
- v8::HandleScope handleScope(isolate);
- v8::Local<v8::Context> context = isolate->GetCurrentContext();
- ASSERT(!context.IsEmpty());
- return ScriptState::forContext(context);
-}
-
-void ScriptState::setWeakCallback(const v8::WeakCallbackData<v8::Context, ScriptState>& data)
+ScriptState::~ScriptState()
{
- delete data.GetParameter();
+ ASSERT(!m_perContextData);
+ ASSERT(m_context.isEmpty());
}
bool ScriptState::evalEnabled() const
return context()->AllowCodeGenerationFromStrings(enabled);
}
-ScriptState* mainWorldScriptState(LocalFrame* frame)
+ExecutionContext* ScriptState::executionContext() const
{
- v8::Isolate* isolate = toIsolate(frame);
- v8::HandleScope handleScope(isolate);
- return ScriptState::forContext(toV8Context(isolate, frame, DOMWrapperWorld::mainWorld()));
+ v8::HandleScope scope(m_isolate);
+ return toExecutionContext(context());
}
-ScriptState* scriptStateFromWorkerGlobalScope(WorkerGlobalScope* workerGlobalScope)
+DOMWindow* ScriptState::domWindow() const
{
- WorkerScriptController* script = workerGlobalScope->script();
- if (!script)
- return 0;
+ v8::HandleScope scope(m_isolate);
+ return toDOMWindow(context());
+}
- v8::HandleScope handleScope(script->isolate());
- return ScriptState::forContext(script->context());
+ScriptState* ScriptState::forMainWorld(LocalFrame* frame)
+{
+ v8::Isolate* isolate = toIsolate(frame);
+ v8::HandleScope handleScope(isolate);
+ return ScriptState::from(toV8Context(isolate, frame, DOMWrapperWorld::mainWorld()));
}
}