1f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
2f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu// Use of this source code is governed by a BSD-style license that can be
3f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
6197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptState.h"
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8Binding.h"
9d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/dom/ExecutionContext.h"
10d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuPassRefPtr<ScriptState> ScriptState::create(v8::Handle<v8::Context> context, PassRefPtr<DOMWrapperWorld> world)
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RefPtr<ScriptState> scriptState = adoptRef(new ScriptState(context, world));
17f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // This ref() is for keeping this ScriptState alive as long as the v8::Context is alive.
18f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // This is deref()ed in the weak callback of the v8::Context.
19f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    scriptState->ref();
20f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return scriptState;
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liustatic void weakCallback(const v8::WeakCallbackData<v8::Context, ScriptState>& data)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
25f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    data.GetValue()->SetAlignedPointerInEmbedderData(v8ContextPerContextDataIndex, 0);
26f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    data.GetParameter()->clearContext();
27f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    data.GetParameter()->deref();
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuScriptState::ScriptState(v8::Handle<v8::Context> context, PassRefPtr<DOMWrapperWorld> world)
31f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    : m_isolate(context->GetIsolate())
32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_context(m_isolate, context)
33f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_world(world)
34323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    , m_perContextData(V8PerContextData::create(context))
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    , m_globalObjectDetached(false)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(m_world);
38f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_context.setWeak(this, &weakCallback);
39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    context->SetAlignedPointerInEmbedderData(v8ContextPerContextDataIndex, this);
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuScriptState::~ScriptState()
4393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
44f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(!m_perContextData);
45f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ASSERT(m_context.isEmpty());
4693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
4793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ScriptState::detachGlobalObject()
497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(!m_context.isEmpty());
517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    context()->DetachGlobal();
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_globalObjectDetached = true;
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)bool ScriptState::evalEnabled() const
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
573464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    v8::HandleScope handleScope(m_isolate);
585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return context()->IsCodeGenerationFromStringsAllowed();
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void ScriptState::setEvalEnabled(bool enabled)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
633464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    v8::HandleScope handleScope(m_isolate);
645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    return context()->AllowCodeGenerationFromStrings(enabled);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptValue ScriptState::getFromGlobalObject(const char* name)
68d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
69d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    v8::HandleScope handleScope(m_isolate);
70d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    v8::Local<v8::Value> v8Value = context()->Global()->Get(v8AtomicString(isolate(), name));
71d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return ScriptValue(this, v8Value);
72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
73d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
74f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuExecutionContext* ScriptState::executionContext() const
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    v8::HandleScope scope(m_isolate);
77f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return toExecutionContext(context());
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
80f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void ScriptState::setExecutionContext(ExecutionContext*)
81d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
82d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ASSERT_NOT_REACHED();
83d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
84d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
8576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)LocalDOMWindow* ScriptState::domWindow() const
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
87f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    v8::HandleScope scope(m_isolate);
88f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    return toDOMWindow(context());
89f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu}
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuScriptState* ScriptState::forMainWorld(LocalFrame* frame)
92f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu{
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    v8::Isolate* isolate = toIsolate(frame);
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    v8::HandleScope handleScope(isolate);
95f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return ScriptState::from(toV8Context(frame, DOMWrapperWorld::mainWorld()));
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)PassRefPtr<ScriptStateForTesting> ScriptStateForTesting::create(v8::Handle<v8::Context> context, PassRefPtr<DOMWrapperWorld> world)
99d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
100d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtr<ScriptStateForTesting> scriptState = adoptRef(new ScriptStateForTesting(context, world));
101d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // This ref() is for keeping this ScriptState alive as long as the v8::Context is alive.
102d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // This is deref()ed in the weak callback of the v8::Context.
103d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    scriptState->ref();
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return scriptState;
105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
107d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptStateForTesting::ScriptStateForTesting(v8::Handle<v8::Context> context, PassRefPtr<DOMWrapperWorld> world)
108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    : ScriptState(context, world)
109d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
110d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
112d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ExecutionContext* ScriptStateForTesting::executionContext() const
113d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
114f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return m_executionContext;
115d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
116d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
117f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void ScriptStateForTesting::setExecutionContext(ExecutionContext* executionContext)
118d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){
119d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_executionContext = executionContext;
120d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
123