1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2008, 2009, 2011 Google Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions of source code must retain the above copyright 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Redistributions in binary form must reproduce the above 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution. 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * * Neither the name of Google Inc. nor the names of its 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission. 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#ifndef ScriptState_h 328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define ScriptState_h 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 34d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "DOMWrapperWorld.h" 358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <v8.h> 36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <wtf/Noncopyable.h> 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/RefCounted.h> 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass DOMWrapperWorld; 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass Frame; 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass Node; 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass Page; 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochclass WorkerContext; 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 46ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass ScriptState { 47ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(ScriptState); 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool hadException() { return !m_exception.IsEmpty(); } 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void setException(v8::Local<v8::Value> exception) 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_exception = exception; 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Local<v8::Value> exception() { return m_exception; } 55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Local<v8::Context> context() const 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return v8::Local<v8::Context>::New(m_context); 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static ScriptState* forContext(v8::Local<v8::Context>); 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static ScriptState* current(); 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprotected: 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ScriptState() { } 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ~ScriptState(); 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate: 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block friend ScriptState* mainWorldScriptState(Frame*); 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block explicit ScriptState(v8::Handle<v8::Context>); 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block static void weakReferenceCallback(v8::Persistent<v8::Value> object, void* parameter); 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Local<v8::Value> m_exception; 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Persistent<v8::Context> m_context; 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass EmptyScriptState : public ScriptState { 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block EmptyScriptState() : ScriptState() { } 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ~EmptyScriptState() { } 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 84ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass ScriptStateProtectedPtr { 85ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(ScriptStateProtectedPtr); 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ScriptStateProtectedPtr() : m_scriptState(0) { } 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ScriptStateProtectedPtr(ScriptState* scriptState) : m_scriptState(scriptState) 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::HandleScope handleScope; 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Keep the context from being GC'ed. ScriptState is guaranteed to be live while the context is live. 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_context = v8::Persistent<v8::Context>::New(scriptState->context()); 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ~ScriptStateProtectedPtr() 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block { 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!m_context.IsEmpty()) { 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_context.Dispose(); 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_context.Clear(); 998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 10128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ScriptState* get() const { return m_scriptState; } 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate: 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ScriptState* m_scriptState; 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block v8::Persistent<v8::Context> m_context; 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockScriptState* mainWorldScriptState(Frame*); 108d0825bca7fe65beaee391d30da42e937db621564Steve Block 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockScriptState* scriptStateFromNode(DOMWrapperWorld*, Node*); 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockScriptState* scriptStateFromPage(DOMWrapperWorld*, Page*); 111643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(WORKERS) 1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochScriptState* scriptStateFromWorkerContext(WorkerContext*); 1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline DOMWrapperWorld* debuggerWorld() { return mainThreadNormalWorld(); } 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockinline DOMWrapperWorld* pluginWorld() { return mainThreadNormalWorld(); } 118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#endif // ScriptState_h 122