Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / bindings / v8 / ScriptState.cpp
index e25534a..d982500 100644 (file)
@@ -1,98 +1,46 @@
-/*
- * 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
@@ -107,21 +55,23 @@ void ScriptState::setEvalEnabled(bool enabled)
     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()));
 }
 
 }