| Index: chrome/renderer/webworker_proxy.cc
|
| ===================================================================
|
| --- chrome/renderer/webworker_proxy.cc (revision 0)
|
| +++ chrome/renderer/webworker_proxy.cc (revision 0)
|
| @@ -0,0 +1,92 @@
|
| +// 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/renderer/webworker_proxy.h"
|
| +
|
| +#include "chrome/common/render_messages.h"
|
| +#include "chrome/common/worker_messages.h"
|
| +#include "chrome/renderer/render_thread.h"
|
| +#include "webkit/glue/webworkerclient.h"
|
| +
|
| +WebWorkerProxy::WebWorkerProxy(
|
| + IPC::Message::Sender* sender, WebWorkerClient* client)
|
| + : sender_(sender),
|
| + route_id_(MSG_ROUTING_NONE),
|
| + client_(client) {
|
| +}
|
| +
|
| +WebWorkerProxy::~WebWorkerProxy() {
|
| +}
|
| +
|
| +void WebWorkerProxy::StartWorkerContext(
|
| + const GURL& script_url,
|
| + const string16& user_agent,
|
| + const string16& source_code) {
|
| + sender_->Send(
|
| + new ViewHostMsg_CreateDedicatedWorker(script_url, &route_id_));
|
| + if (route_id_ == MSG_ROUTING_NONE)
|
| + return;
|
| +
|
| + RenderThread::current()->AddRoute(route_id_, this);
|
| + Send(new WorkerMsg_StartWorkerContext(
|
| + route_id_, script_url, user_agent, source_code));
|
| +}
|
| +
|
| +void WebWorkerProxy::TerminateWorkerContext() {
|
| + if (route_id_ != MSG_ROUTING_NONE) {
|
| + Send(new WorkerMsg_TerminateWorkerContext(route_id_));
|
| + RenderThread::current()->RemoveRoute(route_id_);
|
| + route_id_ = MSG_ROUTING_NONE;
|
| + }
|
| +}
|
| +
|
| +void WebWorkerProxy::PostMessageToWorkerContext(
|
| + const string16& message) {
|
| + Send(new WorkerMsg_PostMessageToWorkerContext(route_id_, message));
|
| +}
|
| +
|
| +void WebWorkerProxy::WorkerObjectDestroyed() {
|
| + client_ = NULL;
|
| + Send(new WorkerMsg_WorkerObjectDestroyed(route_id_));
|
| +}
|
| +
|
| +bool WebWorkerProxy::Send(IPC::Message* message) {
|
| + if (route_id_ == MSG_ROUTING_NONE) {
|
| + delete message;
|
| + return false;
|
| + }
|
| +
|
| + // For now we proxy all messages to the worker process through the browser.
|
| + // Revisit if we find this slow.
|
| + // TODO(jabdelmalek): handle sync messages if we need them.
|
| + IPC::Message* wrapped_msg = new ViewHostMsg_ForwardToWorker(*message);
|
| + delete message;
|
| + return sender_->Send(wrapped_msg);
|
| +}
|
| +
|
| +void WebWorkerProxy::OnMessageReceived(const IPC::Message& message) {
|
| + if (!client_)
|
| + return;
|
| +
|
| + IPC_BEGIN_MESSAGE_MAP(WebWorkerProxy, message)
|
| + IPC_MESSAGE_FORWARD(WorkerHostMsg_PostMessageToWorkerObject,
|
| + client_,
|
| + WebWorkerClient::PostMessageToWorkerObject)
|
| + IPC_MESSAGE_FORWARD(WorkerHostMsg_PostExceptionToWorkerObject,
|
| + client_,
|
| + WebWorkerClient::PostExceptionToWorkerObject)
|
| + IPC_MESSAGE_FORWARD(WorkerHostMsg_PostConsoleMessageToWorkerObject,
|
| + client_,
|
| + WebWorkerClient::PostConsoleMessageToWorkerObject)
|
| + IPC_MESSAGE_FORWARD(WorkerHostMsg_ConfirmMessageFromWorkerObject,
|
| + client_,
|
| + WebWorkerClient::ConfirmMessageFromWorkerObject)
|
| + IPC_MESSAGE_FORWARD(WorkerHostMsg_ReportPendingActivity,
|
| + client_,
|
| + WebWorkerClient::ReportPendingActivity)
|
| + IPC_MESSAGE_FORWARD(WorkerHostMsg_WorkerContextDestroyed,
|
| + client_,
|
| + WebWorkerClient::WorkerContextDestroyed)
|
| + IPC_END_MESSAGE_MAP()
|
| +}
|
|
|