summaryrefslogtreecommitdiffstats
path: root/webkit/glue/webworkerclient_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/glue/webworkerclient_impl.h')
-rw-r--r--webkit/glue/webworkerclient_impl.h150
1 files changed, 150 insertions, 0 deletions
diff --git a/webkit/glue/webworkerclient_impl.h b/webkit/glue/webworkerclient_impl.h
new file mode 100644
index 0000000..cb7938c
--- /dev/null
+++ b/webkit/glue/webworkerclient_impl.h
@@ -0,0 +1,150 @@
+// Copyright (c) 2009 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 WEBKIT_GLUE_WEBWORKERCLIENT_IMPL_H_
+#define WEBKIT_GLUE_WEBWORKERCLIENT_IMPL_H_
+
+#if ENABLE(WORKERS)
+
+#include "webkit/api/public/WebWorkerClient.h"
+
+#include "WorkerContextProxy.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+class ScriptExecutionContext;
+}
+namespace WebKit {
+class WebWorker;
+}
+
+// The purpose of this class is to provide a WorkerContextProxy
+// implementation that we can give to WebKit. Internally, it converts the
+// data types to Chrome compatible ones so that renderer code can use it over
+// IPC.
+class WebWorkerClientImpl : public WebCore::WorkerContextProxy,
+ public WebKit::WebWorkerClient {
+ public:
+ WebWorkerClientImpl(WebCore::Worker* worker);
+
+ // WebCore::WorkerContextProxy Factory.
+ static WebCore::WorkerContextProxy* createWorkerContextProxy(
+ WebCore::Worker* worker);
+
+ void set_webworker(WebKit::WebWorker* webworker);
+
+ // WebCore::WorkerContextProxy methods:
+ // These are called on the thread that created the worker. In the renderer
+ // process, this will be the main WebKit thread. In the worker process, this
+ // will be the thread of the executing worker (not the main WebKit thread).
+ virtual void startWorkerContext(const WebCore::KURL& script_url,
+ const WebCore::String& user_agent,
+ const WebCore::String& source_code);
+ virtual void terminateWorkerContext();
+ virtual void postMessageToWorkerContext(
+ WTF::PassRefPtr<WebCore::SerializedScriptValue> message,
+ WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels);
+ virtual bool hasPendingActivity() const;
+ virtual void workerObjectDestroyed();
+
+ // WebWorkerClient methods:
+ // These are called on the main WebKit thread.
+ virtual void postMessageToWorkerObject(
+ const WebKit::WebString& message,
+ const WebKit::WebMessagePortChannelArray& channels);
+ virtual void postExceptionToWorkerObject(
+ const WebKit::WebString& error_message,
+ int line_number,
+ const WebKit::WebString& source_url);
+ virtual void postConsoleMessageToWorkerObject(
+ int destination_id,
+ int source_id,
+ int message_type,
+ int message_level,
+ const WebKit::WebString& message,
+ int line_number,
+ const WebKit::WebString& source_url);
+ virtual void confirmMessageFromWorkerObject(bool has_pending_activity);
+ virtual void reportPendingActivity(bool has_pending_activity);
+ virtual void workerContextDestroyed();
+ virtual WebKit::WebWorker* createWorker(WebKit::WebWorkerClient* client) {
+ return NULL;
+ }
+ virtual WebKit::WebNotificationPresenter* notificationPresenter() {
+ // TODO(johnnyg): Notifications not yet supported in workers.
+ // Coming soon.
+ return NULL;
+ }
+
+ private:
+ virtual ~WebWorkerClientImpl();
+
+ // Methods used to support WebWorkerClientImpl being constructed on worker
+ // threads.
+ // These tasks are dispatched on the WebKit thread.
+ static void StartWorkerContextTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr,
+ const WebCore::String& script_url,
+ const WebCore::String& user_agent,
+ const WebCore::String& source_code);
+ static void TerminateWorkerContextTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr);
+ static void PostMessageToWorkerContextTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr,
+ const WebCore::String& message,
+ WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels);
+ static void WorkerObjectDestroyedTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr);
+
+ // These tasks are dispatched on the thread that created the worker (i.e.
+ // main WebKit thread in renderer process, and the worker thread in the worker
+ // process).
+ static void PostMessageToWorkerObjectTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr,
+ const WebCore::String& message,
+ WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels);
+ static void PostExceptionToWorkerObjectTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr,
+ const WebCore::String& error_message,
+ int line_number,
+ const WebCore::String& source_url);
+ static void PostConsoleMessageToWorkerObjectTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr,
+ int destination_id,
+ int source_id,
+ int message_type,
+ int message_level,
+ const WebCore::String& message,
+ int line_number,
+ const WebCore::String& source_url);
+ static void ConfirmMessageFromWorkerObjectTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr);
+ static void ReportPendingActivityTask(
+ WebCore::ScriptExecutionContext* context,
+ WebWorkerClientImpl* this_ptr,
+ bool has_pending_activity);
+
+ // Guard against context from being destroyed before a worker exits.
+ WTF::RefPtr<WebCore::ScriptExecutionContext> script_execution_context_;
+
+ WebCore::Worker* worker_;
+ WebKit::WebWorker* webworker_;
+ bool asked_to_terminate_;
+ uint32 unconfirmed_message_count_;
+ bool worker_context_had_pending_activity_;
+ WTF::ThreadIdentifier worker_thread_id_;
+};
+
+#endif
+
+#endif // WEBKIT_GLUE_WEBWORKERCLIENT_IMPL_H_