diff -r 000000000000 -r 4f2f89ce4247 WebCore/bindings/v8/ScriptState.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebCore/bindings/v8/ScriptState.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2008, 2009 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. + */ + +#ifndef ScriptState_h +#define ScriptState_h + +#include "DOMWrapperWorld.h" +#include +#include +#include + +namespace WebCore { +class DOMWrapperWorld; +class Frame; +class Node; +class Page; + +class ScriptState : public Noncopyable { +public: + bool hadException() { return !m_exception.IsEmpty(); } + void setException(v8::Local exception) + { + m_exception = exception; + } + v8::Local exception() { return m_exception; } + + v8::Local context() const + { + return v8::Local::New(m_context); + } + + static ScriptState* forContext(v8::Local); + static ScriptState* current(); + +protected: + ScriptState() { } + ~ScriptState(); + +private: + friend ScriptState* mainWorldScriptState(Frame*); + explicit ScriptState(v8::Handle); + + static void weakReferenceCallback(v8::Persistent object, void* parameter); + + v8::Local m_exception; + v8::Persistent m_context; +}; + +class EmptyScriptState : public ScriptState { +public: + EmptyScriptState() : ScriptState() { } + ~EmptyScriptState() { } +}; + +class ScriptStateProtectedPtr : public Noncopyable { +public: + ScriptStateProtectedPtr() : m_scriptState(0) { } + ScriptStateProtectedPtr(ScriptState* scriptState) : m_scriptState(scriptState) + { + v8::HandleScope handleScope; + // Keep the context from being GC'ed. ScriptState is guaranteed to be live while the context is live. + m_context = v8::Persistent::New(scriptState->context()); + } + ~ScriptStateProtectedPtr() + { + if (!m_context.IsEmpty()) { + m_context.Dispose(); + m_context.Clear(); + } + } + ScriptState* get() { return m_scriptState; } +private: + ScriptState* m_scriptState; + v8::Persistent m_context; +}; + +ScriptState* mainWorldScriptState(Frame*); + +ScriptState* scriptStateFromNode(DOMWrapperWorld*, Node*); +ScriptState* scriptStateFromPage(DOMWrapperWorld*, Page*); + +inline DOMWrapperWorld* debuggerWorld() { return mainThreadNormalWorld(); } +inline DOMWrapperWorld* pluginWorld() { return mainThreadNormalWorld(); } + +} + +#endif // ScriptState_h