summaryrefslogtreecommitdiffstats
path: root/chrome/worker/webworkerclient_proxy.cc
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-04 00:39:56 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-04 00:39:56 +0000
commiteb47a137b7ce84a6df0ccc9550c75b6bec60eb68 (patch)
tree7f6c4e1d169bf60465a0b642a4434a239aaf0f6d /chrome/worker/webworkerclient_proxy.cc
parent0ff03ae3f1bf6f877a4aa32263f6418f2c5797d2 (diff)
downloadchromium_src-eb47a137b7ce84a6df0ccc9550c75b6bec60eb68.zip
chromium_src-eb47a137b7ce84a6df0ccc9550c75b6bec60eb68.tar.gz
chromium_src-eb47a137b7ce84a6df0ccc9550c75b6bec60eb68.tar.bz2
Initial checkin of the out of process worker implementation.
WebWorkerClient/WebWorker are parallel interfaces of WebCore::{WorkerObjectProxy, WorkerContextProxy} that use Chrome data types. When WebKit requests a WorkerObjectProxy, we create an instance of WebWorkerClientImpl. This class creates an object that implements a Chromium version of WorkerObjectProxy (i.e. with Chrome data types) through WebViewDelegate. That object is a WebWorkerProxy and talks over IPC to a WebWorker object in the worker process. The WebWorker object creates the actual WebCore::Worker object using another class in glue: WebWorkerImpl. When the WebCore::Worker object running in the worker process wants to talk back to the code running in the renderer, it talks to WebWorkerImpl which implements WebCore::WorkerObjectProxy. WebWorkerImpl converts the data types to Chrome compatible ones, and then calls the WebWorkerClient version which does IPC to get to the renderer process. This ends up at WebWorkerProxy, which calls WebWorkerClientImpl (the original class). In future changes, sandboxing, multiple worker processes etc will be added. Note that I also had to make two small changes to WebKit, since WorkerMessagingProxy couldn't be created as is for the nested worker case. I'll either check it in myself or work with Jian to do so. Review URL: http://codereview.chromium.org/27157 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10847 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/worker/webworkerclient_proxy.cc')
-rw-r--r--chrome/worker/webworkerclient_proxy.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/chrome/worker/webworkerclient_proxy.cc b/chrome/worker/webworkerclient_proxy.cc
new file mode 100644
index 0000000..84cb2ed
--- /dev/null
+++ b/chrome/worker/webworkerclient_proxy.cc
@@ -0,0 +1,95 @@
+// 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.
+
+#include "chrome/worker/webworkerclient_proxy.h"
+
+#include "chrome/common/ipc_logging.h"
+#include "chrome/common/worker_messages.h"
+#include "chrome/worker/worker_process.h"
+#include "chrome/worker/worker_thread.h"
+#include "webkit/glue/webworker.h"
+
+
+WebWorkerClientProxy::WebWorkerClientProxy(const GURL& url, int route_id)
+ : url_(url),
+ route_id_(route_id),
+ started_worker_(false),
+ ALLOW_THIS_IN_INITIALIZER_LIST(impl_(WebWorker::Create(this))) {
+ WorkerThread::current()->AddRoute(route_id_, this);
+ WorkerProcess::current()->AddRefProcess();
+}
+
+WebWorkerClientProxy::~WebWorkerClientProxy() {
+ WorkerThread::current()->RemoveRoute(route_id_);
+ WorkerProcess::current()->ReleaseProcess();
+}
+
+void WebWorkerClientProxy::PostMessageToWorkerObject(const string16& message) {
+ Send(new WorkerHostMsg_PostMessageToWorkerObject(route_id_, message));
+}
+
+void WebWorkerClientProxy::PostExceptionToWorkerObject(
+ const string16& error_message,
+ int line_number,
+ const string16& source_url) {
+ Send(new WorkerHostMsg_PostExceptionToWorkerObject(
+ route_id_, error_message, line_number, source_url));
+}
+
+void WebWorkerClientProxy::PostConsoleMessageToWorkerObject(
+ int destination,
+ int source,
+ int level,
+ const string16& message,
+ int line_number,
+ const string16& source_url) {
+ Send(new WorkerHostMsg_PostConsoleMessageToWorkerObject(
+ route_id_, destination, source, level,message, line_number, source_url));
+}
+
+void WebWorkerClientProxy::ConfirmMessageFromWorkerObject(bool has_pending_activity) {
+ Send(new WorkerHostMsg_ConfirmMessageFromWorkerObject(
+ route_id_, has_pending_activity));
+}
+
+void WebWorkerClientProxy::ReportPendingActivity(bool has_pending_activity) {
+ Send(new WorkerHostMsg_ReportPendingActivity(
+ route_id_, has_pending_activity));
+}
+
+void WebWorkerClientProxy::WorkerContextDestroyed() {
+ Send(new WorkerHostMsg_WorkerContextDestroyed(route_id_));
+}
+
+bool WebWorkerClientProxy::Send(IPC::Message* message) {
+ return WorkerThread::current()->Send(message);
+}
+
+void WebWorkerClientProxy::OnMessageReceived(const IPC::Message& message) {
+ if (!started_worker_ &&
+ message.type() != WorkerMsg_StartWorkerContext::ID) {
+ queued_messages_.push_back(new IPC::Message(message));
+ return;
+ }
+
+ WebWorker* worker = impl_.get();
+ IPC_BEGIN_MESSAGE_MAP(WebWorkerClientProxy, message)
+ IPC_MESSAGE_FORWARD(WorkerMsg_StartWorkerContext, worker,
+ WebWorker::StartWorkerContext)
+ IPC_MESSAGE_FORWARD(WorkerMsg_TerminateWorkerContext, worker,
+ WebWorker::TerminateWorkerContext)
+ IPC_MESSAGE_FORWARD(WorkerMsg_PostMessageToWorkerContext, worker,
+ WebWorker::PostMessageToWorkerContext)
+ IPC_MESSAGE_FORWARD(WorkerMsg_WorkerObjectDestroyed, worker,
+ WebWorker::WorkerObjectDestroyed)
+ IPC_END_MESSAGE_MAP()
+
+ if (message.type() == WorkerMsg_StartWorkerContext::ID) {
+ started_worker_ = true;
+ for (size_t i = 0; i < queued_messages_.size(); ++i)
+ OnMessageReceived(*queued_messages_[i]);
+
+ queued_messages_.clear();
+ }
+}