| Index: chrome/renderer/webworker_proxy.cc
|
| ===================================================================
|
| --- chrome/renderer/webworker_proxy.cc (revision 19506)
|
| +++ chrome/renderer/webworker_proxy.cc (working copy)
|
| @@ -25,15 +25,26 @@
|
| }
|
|
|
| WebWorkerProxy::~WebWorkerProxy() {
|
| - if (queued_messages_.empty())
|
| - return;
|
| + 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 (route_id_ != MSG_ROUTING_NONE)
|
| + if (!queued_messages_.empty())
|
| child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_));
|
| +
|
| + route_id_ = MSG_ROUTING_NONE;
|
| }
|
|
|
| void WebWorkerProxy::startWorkerContext(
|
| @@ -57,8 +68,7 @@
|
| void WebWorkerProxy::terminateWorkerContext() {
|
| if (route_id_ != MSG_ROUTING_NONE) {
|
| Send(new WorkerMsg_TerminateWorkerContext(route_id_));
|
| - child_thread_->RemoveRoute(route_id_);
|
| - route_id_ = MSG_ROUTING_NONE;
|
| + Disconnect();
|
| }
|
| }
|
|
|
|
|