OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/renderer/webworker_proxy.h" | 5 #include "chrome/renderer/webworker_proxy.h" |
6 | 6 |
7 #include "chrome/common/child_thread.h" | 7 #include "chrome/common/child_thread.h" |
8 #include "chrome/common/render_messages.h" | 8 #include "chrome/common/render_messages.h" |
9 #include "chrome/common/worker_messages.h" | 9 #include "chrome/common/worker_messages.h" |
10 #include "webkit/api/public/WebURL.h" | 10 #include "webkit/api/public/WebURL.h" |
11 #include "webkit/api/public/WebWorkerClient.h" | 11 #include "webkit/api/public/WebWorkerClient.h" |
12 | 12 |
13 using WebKit::WebString; | 13 using WebKit::WebString; |
14 using WebKit::WebURL; | 14 using WebKit::WebURL; |
15 using WebKit::WebWorkerClient; | 15 using WebKit::WebWorkerClient; |
16 | 16 |
17 WebWorkerProxy::WebWorkerProxy( | 17 WebWorkerProxy::WebWorkerProxy( |
18 WebWorkerClient* client, | 18 WebWorkerClient* client, |
19 ChildThread* child_thread, | 19 ChildThread* child_thread, |
20 int render_view_route_id) | 20 int render_view_route_id) |
21 : route_id_(MSG_ROUTING_NONE), | 21 : route_id_(MSG_ROUTING_NONE), |
22 child_thread_(child_thread), | 22 child_thread_(child_thread), |
23 render_view_route_id_(render_view_route_id), | 23 render_view_route_id_(render_view_route_id), |
24 client_(client) { | 24 client_(client) { |
25 } | 25 } |
26 | 26 |
27 WebWorkerProxy::~WebWorkerProxy() { | 27 WebWorkerProxy::~WebWorkerProxy() { |
28 if (queued_messages_.empty()) | 28 Disconnect(); |
29 return; | |
30 | 29 |
31 for (size_t i = 0; i < queued_messages_.size(); ++i) | 30 for (size_t i = 0; i < queued_messages_.size(); ++i) |
32 delete queued_messages_[i]; | 31 delete queued_messages_[i]; |
| 32 } |
| 33 |
| 34 void WebWorkerProxy::Disconnect() { |
| 35 if (route_id_ == MSG_ROUTING_NONE) |
| 36 return; |
| 37 |
| 38 // So the messages from WorkerContext (like WorkerContextDestroyed) do not |
| 39 // come after nobody is listening. Since Worker and WorkerContext can |
| 40 // terminate independently, already sent messages may still be in the pipe. |
| 41 child_thread_->RemoveRoute(route_id_); |
33 | 42 |
34 // Tell the browser to not start our queued worker. | 43 // Tell the browser to not start our queued worker. |
35 if (route_id_ != MSG_ROUTING_NONE) | 44 if (!queued_messages_.empty()) |
36 child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_)); | 45 child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_)); |
| 46 |
| 47 route_id_ = MSG_ROUTING_NONE; |
37 } | 48 } |
38 | 49 |
39 void WebWorkerProxy::startWorkerContext( | 50 void WebWorkerProxy::startWorkerContext( |
40 const WebURL& script_url, | 51 const WebURL& script_url, |
41 const WebString& user_agent, | 52 const WebString& user_agent, |
42 const WebString& source_code) { | 53 const WebString& source_code) { |
43 child_thread_->Send(new ViewHostMsg_CreateDedicatedWorker( | 54 child_thread_->Send(new ViewHostMsg_CreateDedicatedWorker( |
44 script_url, render_view_route_id_, &route_id_)); | 55 script_url, render_view_route_id_, &route_id_)); |
45 if (route_id_ == MSG_ROUTING_NONE) | 56 if (route_id_ == MSG_ROUTING_NONE) |
46 return; | 57 return; |
47 | 58 |
48 child_thread_->AddRoute(route_id_, this); | 59 child_thread_->AddRoute(route_id_, this); |
49 | 60 |
50 // We make sure that the start message is the first, since postMessage might | 61 // We make sure that the start message is the first, since postMessage might |
51 // have already been called. | 62 // have already been called. |
52 queued_messages_.insert(queued_messages_.begin(), | 63 queued_messages_.insert(queued_messages_.begin(), |
53 new WorkerMsg_StartWorkerContext( | 64 new WorkerMsg_StartWorkerContext( |
54 route_id_, script_url, user_agent, source_code)); | 65 route_id_, script_url, user_agent, source_code)); |
55 } | 66 } |
56 | 67 |
57 void WebWorkerProxy::terminateWorkerContext() { | 68 void WebWorkerProxy::terminateWorkerContext() { |
58 if (route_id_ != MSG_ROUTING_NONE) { | 69 if (route_id_ != MSG_ROUTING_NONE) { |
59 Send(new WorkerMsg_TerminateWorkerContext(route_id_)); | 70 Send(new WorkerMsg_TerminateWorkerContext(route_id_)); |
60 child_thread_->RemoveRoute(route_id_); | 71 Disconnect(); |
61 route_id_ = MSG_ROUTING_NONE; | |
62 } | 72 } |
63 } | 73 } |
64 | 74 |
65 void WebWorkerProxy::postMessageToWorkerContext( | 75 void WebWorkerProxy::postMessageToWorkerContext( |
66 const WebString& message) { | 76 const WebString& message) { |
67 Send(new WorkerMsg_PostMessageToWorkerContext(route_id_, message)); | 77 Send(new WorkerMsg_PostMessageToWorkerContext(route_id_, message)); |
68 } | 78 } |
69 | 79 |
70 void WebWorkerProxy::workerObjectDestroyed() { | 80 void WebWorkerProxy::workerObjectDestroyed() { |
71 Send(new WorkerMsg_WorkerObjectDestroyed(route_id_)); | 81 Send(new WorkerMsg_WorkerObjectDestroyed(route_id_)); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 | 130 |
121 void WebWorkerProxy::OnDedicatedWorkerCreated() { | 131 void WebWorkerProxy::OnDedicatedWorkerCreated() { |
122 DCHECK(queued_messages_.size()); | 132 DCHECK(queued_messages_.size()); |
123 std::vector<IPC::Message*> queued_messages = queued_messages_; | 133 std::vector<IPC::Message*> queued_messages = queued_messages_; |
124 queued_messages_.clear(); | 134 queued_messages_.clear(); |
125 for (size_t i = 0; i < queued_messages.size(); ++i) { | 135 for (size_t i = 0; i < queued_messages.size(); ++i) { |
126 queued_messages[i]->set_routing_id(route_id_); | 136 queued_messages[i]->set_routing_id(route_id_); |
127 Send(queued_messages[i]); | 137 Send(queued_messages[i]); |
128 } | 138 } |
129 } | 139 } |
OLD | NEW |