| Index: chrome/renderer/webworker_proxy.cc
|
| diff --git a/chrome/renderer/webworker_proxy.cc b/chrome/renderer/webworker_proxy.cc
|
| index 3932d6e9c3bb2487082b16a822b514976145b41c..5a24c41aa223ac60a6e36f330b6a9d1e8e952811 100644
|
| --- a/chrome/renderer/webworker_proxy.cc
|
| +++ b/chrome/renderer/webworker_proxy.cc
|
| @@ -21,51 +21,29 @@ WebWorkerProxy::WebWorkerProxy(
|
| WebWorkerClient* client,
|
| ChildThread* child_thread,
|
| int render_view_route_id)
|
| - : route_id_(MSG_ROUTING_NONE),
|
| - child_thread_(child_thread),
|
| - render_view_route_id_(render_view_route_id),
|
| + : WebWorkerBase(child_thread, MSG_ROUTING_NONE, render_view_route_id),
|
| client_(client) {
|
| }
|
|
|
| -WebWorkerProxy::~WebWorkerProxy() {
|
| - Disconnect();
|
| -
|
| - for (size_t i = 0; i < queued_messages_.size(); ++i)
|
| - delete queued_messages_[i];
|
| -}
|
| -
|
| void WebWorkerProxy::Disconnect() {
|
| if (route_id_ == MSG_ROUTING_NONE)
|
| return;
|
|
|
| - // So the messages from WorkerContext (like WorkerContextDestroyed) do not
|
| - // come after nobody is listening. Since Worker and WorkerContext can
|
| - // terminate independently, already sent messages may still be in the pipe.
|
| - child_thread_->RemoveRoute(route_id_);
|
| -
|
| // Tell the browser to not start our queued worker.
|
| - if (!queued_messages_.empty())
|
| + if (!IsStarted())
|
| child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_));
|
|
|
| - route_id_ = MSG_ROUTING_NONE;
|
| + // Call our superclass to shutdown the routing
|
| + WebWorkerBase::Disconnect();
|
| }
|
|
|
| void WebWorkerProxy::startWorkerContext(
|
| const WebURL& script_url,
|
| const WebString& user_agent,
|
| const WebString& source_code) {
|
| - child_thread_->Send(new ViewHostMsg_CreateDedicatedWorker(
|
| - script_url, render_view_route_id_, &route_id_));
|
| - if (route_id_ == MSG_ROUTING_NONE)
|
| - return;
|
| -
|
| - child_thread_->AddRoute(route_id_, this);
|
| -
|
| - // We make sure that the start message is the first, since postMessage might
|
| - // have already been called.
|
| - queued_messages_.insert(queued_messages_.begin(),
|
| - new WorkerMsg_StartWorkerContext(
|
| - route_id_, script_url, user_agent, source_code));
|
| + IPC::Message* create_message = new ViewHostMsg_CreateDedicatedWorker(
|
| + script_url, render_view_route_id_, &route_id_);
|
| + CreateWorkerContext(create_message, script_url, user_agent, source_code);
|
| }
|
|
|
| void WebWorkerProxy::terminateWorkerContext() {
|
| @@ -100,31 +78,12 @@ void WebWorkerProxy::workerObjectDestroyed() {
|
| void WebWorkerProxy::clientDestroyed() {
|
| }
|
|
|
| -bool WebWorkerProxy::Send(IPC::Message* message) {
|
| - // It's possible that postMessage is called before the worker is created, in
|
| - // which case route_id_ will be none. Or the worker object can be interacted
|
| - // with before the browser process told us that it started, in which case we
|
| - // also want to queue the message.
|
| - if (route_id_ == MSG_ROUTING_NONE || !queued_messages_.empty()) {
|
| - queued_messages_.push_back(message);
|
| - return true;
|
| - }
|
| -
|
| - // 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 child_thread_->Send(wrapped_msg);
|
| -}
|
| -
|
| void WebWorkerProxy::OnMessageReceived(const IPC::Message& message) {
|
| if (!client_)
|
| return;
|
|
|
| IPC_BEGIN_MESSAGE_MAP(WebWorkerProxy, message)
|
| - IPC_MESSAGE_HANDLER(ViewMsg_DedicatedWorkerCreated,
|
| - OnDedicatedWorkerCreated)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_WorkerCreated, OnWorkerCreated)
|
| IPC_MESSAGE_HANDLER(WorkerMsg_PostMessage, OnPostMessage)
|
| IPC_MESSAGE_FORWARD(WorkerHostMsg_PostExceptionToWorkerObject,
|
| client_,
|
| @@ -143,14 +102,10 @@ void WebWorkerProxy::OnMessageReceived(const IPC::Message& message) {
|
| IPC_END_MESSAGE_MAP()
|
| }
|
|
|
| -void WebWorkerProxy::OnDedicatedWorkerCreated() {
|
| - DCHECK(queued_messages_.size());
|
| - std::vector<IPC::Message*> queued_messages = queued_messages_;
|
| - queued_messages_.clear();
|
| - for (size_t i = 0; i < queued_messages.size(); ++i) {
|
| - queued_messages[i]->set_routing_id(route_id_);
|
| - Send(queued_messages[i]);
|
| - }
|
| +void WebWorkerProxy::OnWorkerCreated() {
|
| + // The worker is created - now send off the CreateWorkerContext message and
|
| + // any other queued messages
|
| + SendQueuedMessages();
|
| }
|
|
|
| void WebWorkerProxy::OnPostMessage(
|
|
|