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