| Index: Source/bindings/v8/ScriptState.h
|
| diff --git a/Source/bindings/v8/ScriptState.h b/Source/bindings/v8/ScriptState.h
|
| deleted file mode 100644
|
| index 81bc5840070a409b3c28783f5b988d64d8c17b40..0000000000000000000000000000000000000000
|
| --- a/Source/bindings/v8/ScriptState.h
|
| +++ /dev/null
|
| @@ -1,145 +0,0 @@
|
| -// 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.
|
| -
|
| -#ifndef ScriptState_h
|
| -#define ScriptState_h
|
| -
|
| -#include "bindings/v8/ScopedPersistent.h"
|
| -#include "bindings/v8/V8PerContextData.h"
|
| -#include "wtf/RefCounted.h"
|
| -#include <v8.h>
|
| -
|
| -namespace WebCore {
|
| -
|
| -class LocalDOMWindow;
|
| -class DOMWrapperWorld;
|
| -class ExecutionContext;
|
| -class LocalFrame;
|
| -class ScriptValue;
|
| -
|
| -// ScriptState is created when v8::Context is created.
|
| -// ScriptState is destroyed when v8::Context is garbage-collected and
|
| -// all V8 proxy objects that have references to the ScriptState are destructed.
|
| -class ScriptState : public RefCounted<ScriptState> {
|
| - WTF_MAKE_NONCOPYABLE(ScriptState);
|
| -public:
|
| - class Scope {
|
| - public:
|
| - // You need to make sure that scriptState->context() is not empty before creating a Scope.
|
| - explicit Scope(ScriptState* scriptState)
|
| - : m_handleScope(scriptState->isolate())
|
| - , m_context(scriptState->context())
|
| - {
|
| - ASSERT(!m_context.IsEmpty());
|
| - m_context->Enter();
|
| - }
|
| -
|
| - ~Scope()
|
| - {
|
| - m_context->Exit();
|
| - }
|
| -
|
| - private:
|
| - v8::HandleScope m_handleScope;
|
| - v8::Handle<v8::Context> m_context;
|
| - };
|
| -
|
| - static PassRefPtr<ScriptState> create(v8::Handle<v8::Context>, PassRefPtr<DOMWrapperWorld>);
|
| - virtual ~ScriptState();
|
| -
|
| - static ScriptState* current(v8::Isolate* isolate)
|
| - {
|
| - return from(isolate->GetCurrentContext());
|
| - }
|
| -
|
| - static ScriptState* from(v8::Handle<v8::Context> context)
|
| - {
|
| - ASSERT(!context.IsEmpty());
|
| - ScriptState* scriptState = static_cast<ScriptState*>(context->GetAlignedPointerFromEmbedderData(v8ContextPerContextDataIndex));
|
| - // ScriptState::from() must not be called for a context that does not have
|
| - // valid embedder data in the embedder field.
|
| - RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(scriptState);
|
| - RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(scriptState->context() == context);
|
| - return scriptState;
|
| - }
|
| -
|
| - static ScriptState* forMainWorld(LocalFrame*);
|
| -
|
| - v8::Isolate* isolate() const { return m_isolate; }
|
| - DOMWrapperWorld& world() const { return *m_world; }
|
| - LocalDOMWindow* domWindow() const;
|
| - virtual ExecutionContext* executionContext() const;
|
| - virtual void setExecutionContext(ExecutionContext*);
|
| -
|
| - // This can return an empty handle if the v8::Context is gone.
|
| - v8::Handle<v8::Context> context() const { return m_context.newLocal(m_isolate); }
|
| - bool contextIsEmpty() const { return m_context.isEmpty(); }
|
| - void clearContext() { return m_context.clear(); }
|
| -
|
| - V8PerContextData* perContextData() const { return m_perContextData.get(); }
|
| - void disposePerContextData() { m_perContextData = nullptr; }
|
| -
|
| - bool evalEnabled() const;
|
| - void setEvalEnabled(bool);
|
| - ScriptValue getFromGlobalObject(const char* name);
|
| -
|
| -protected:
|
| - ScriptState(v8::Handle<v8::Context>, PassRefPtr<DOMWrapperWorld>);
|
| -
|
| -private:
|
| - v8::Isolate* m_isolate;
|
| - // This persistent handle is weak.
|
| - ScopedPersistent<v8::Context> m_context;
|
| -
|
| - // This RefPtr doesn't cause a cycle because all persistent handles that DOMWrapperWorld holds are weak.
|
| - RefPtr<DOMWrapperWorld> m_world;
|
| -
|
| - // This OwnPtr causes a cycle:
|
| - // V8PerContextData --(Persistent)--> v8::Context --(RefPtr)--> ScriptState --(OwnPtr)--> V8PerContextData
|
| - // So you must explicitly clear the OwnPtr by calling disposePerContextData()
|
| - // once you no longer need V8PerContextData. Otherwise, the v8::Context will leak.
|
| - OwnPtr<V8PerContextData> m_perContextData;
|
| -};
|
| -
|
| -class ScriptStateForTesting : public ScriptState {
|
| -public:
|
| - static PassRefPtr<ScriptStateForTesting> create(v8::Handle<v8::Context>, PassRefPtr<DOMWrapperWorld>);
|
| -
|
| - virtual ExecutionContext* executionContext() const OVERRIDE;
|
| - virtual void setExecutionContext(ExecutionContext*) OVERRIDE;
|
| -
|
| -private:
|
| - ScriptStateForTesting(v8::Handle<v8::Context>, PassRefPtr<DOMWrapperWorld>);
|
| -
|
| - ExecutionContext* m_executionContext;
|
| -};
|
| -
|
| -// ScriptStateProtectingContext keeps the context associated with the ScriptState alive.
|
| -// You need to call clear() once you no longer need the context. Otherwise, the context will leak.
|
| -class ScriptStateProtectingContext {
|
| - WTF_MAKE_NONCOPYABLE(ScriptStateProtectingContext);
|
| -public:
|
| - ScriptStateProtectingContext(ScriptState* scriptState)
|
| - : m_scriptState(scriptState)
|
| - {
|
| - if (m_scriptState)
|
| - m_context.set(m_scriptState->isolate(), m_scriptState->context());
|
| - }
|
| -
|
| - ScriptState* operator->() const { return m_scriptState.get(); }
|
| - ScriptState* get() const { return m_scriptState.get(); }
|
| - void clear()
|
| - {
|
| - m_scriptState = nullptr;
|
| - m_context.clear();
|
| - }
|
| -
|
| -private:
|
| - RefPtr<ScriptState> m_scriptState;
|
| - ScopedPersistent<v8::Context> m_context;
|
| -};
|
| -
|
| -}
|
| -
|
| -#endif // ScriptState_h
|
|
|