2009-07-24 Jian Li <jianli@chromium.org>
[WebKit-https.git] / WebCore / bindings / v8 / WorkerContextExecutionProxy.h
index 3023666..387e4c6 100644 (file)
 #if ENABLE(WORKERS)
 
 #include <v8.h>
+#include "ScriptValue.h"
+#include "V8EventListenerList.h"
 #include "V8Index.h"
+#include <wtf/OwnPtr.h>
 #include <wtf/Vector.h>
 
 namespace WebCore {
@@ -46,15 +49,24 @@ namespace WebCore {
     class V8WorkerContextEventListener;
     class WorkerContext;
 
+    struct WorkerContextExecutionState {
+        WorkerContextExecutionState() : hadException(false), lineNumber(0) { }
+
+        bool hadException;
+        ScriptValue exception;
+        String errorMessage;
+        int lineNumber;
+        String sourceURL;
+    };
+
     class WorkerContextExecutionProxy {
     public:
         WorkerContextExecutionProxy(WorkerContext*);
         ~WorkerContextExecutionProxy();
 
-        // FIXME: following function sshould have camelCased names once V8 code-generating script is migrated.
+        // FIXME: following function should have camelCased names once V8 code-generating script is migrated.
         v8::Local<v8::Context> GetContext() { return v8::Local<v8::Context>::New(m_context); }
         v8::Local<v8::Function> GetConstructor(V8ClassIndex::V8WrapperType);
-        PassRefPtr<V8EventListener> FindOrCreateEventListener(v8::Local<v8::Value> listener, bool isInline, bool findOnly);
         void RemoveEventListener(V8EventListener*);
 
         static v8::Handle<v8::Value> ToV8Object(V8ClassIndex::V8WrapperType type, void* impl);
@@ -62,27 +74,29 @@ namespace WebCore {
         static v8::Handle<v8::Value> EventTargetToV8Object(EventTarget* target);
         static v8::Handle<v8::Value> WorkerContextToV8Object(WorkerContext* wc);
 
+        // Finds/creates event listener wrappers.
+        PassRefPtr<V8EventListener> findOrCreateEventListener(v8::Local<v8::Value> listener, bool isInline, bool findOnly);
+        PassRefPtr<V8EventListener> findOrCreateObjectEventListener(v8::Local<v8::Value> object, bool isInline, bool findOnly);
+
         // Track the event so that we can detach it from the JS wrapper when a worker
         // terminates. This is needed because we need to be able to dispose these
         // events and releases references to their event targets: WorkerContext.
         void trackEvent(Event*);
 
         // Evaluate a script file in the current execution environment.
-        v8::Local<v8::Value> evaluate(const String& script, const String& fileName, int baseLine);
+        ScriptValue evaluate(const String& script, const String& fileName, int baseLine, WorkerContextExecutionState*);
 
         // Returns WorkerContext object.
         WorkerContext* workerContext() { return m_workerContext; }
 
-        // Returns WorkerContextExecutionProxy object of the currently executing context.
+        // Returns WorkerContextExecutionProxy object of the currently executing context. 0 will be returned if the current executing context is not the worker context.
         static WorkerContextExecutionProxy* retrieve();
 
-        // Enables HTML5 worker support.
-        static bool isWebWorkersEnabled();
-        static void setIsWebWorkersEnabled(bool);
-
     private:
+        void initV8IfNeeded();
         void initContextIfNeeded();
         void dispose();
+        PassRefPtr<V8EventListener> findOrCreateEventListenerHelper(v8::Local<v8::Value> object, bool isInline, bool findOnly, bool createObjectEventListener);
 
         // Run an already compiled script.
         v8::Local<v8::Value> runScript(v8::Handle<v8::Script>);
@@ -95,7 +109,7 @@ namespace WebCore {
         v8::Persistent<v8::Context> m_context;
         int m_recursion;
 
-        Vector<V8WorkerContextEventListener*> m_listeners;
+        OwnPtr<V8EventListenerList> m_listeners;
         Vector<Event*> m_events;
     };