| Index: chrome/worker/webworkerclient_proxy.cc
|
| ===================================================================
|
| --- chrome/worker/webworkerclient_proxy.cc (revision 0)
|
| +++ chrome/worker/webworkerclient_proxy.cc (revision 0)
|
| @@ -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();
|
| + }
|
| +}
|
|
|