Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: chrome/renderer/webworker_proxy.cc

Issue 340036: Initial pass of shared workers renderer-side code (Closed)
Patch Set: Changes reflecting review feedback Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/webmessageportchannel_impl.h" 9 #include "chrome/common/webmessageportchannel_impl.h"
10 #include "chrome/common/worker_messages.h" 10 #include "chrome/common/worker_messages.h"
11 #include "webkit/api/public/WebURL.h" 11 #include "webkit/api/public/WebURL.h"
12 #include "webkit/api/public/WebWorkerClient.h" 12 #include "webkit/api/public/WebWorkerClient.h"
13 13
14 using WebKit::WebMessagePortChannel; 14 using WebKit::WebMessagePortChannel;
15 using WebKit::WebMessagePortChannelArray; 15 using WebKit::WebMessagePortChannelArray;
16 using WebKit::WebString; 16 using WebKit::WebString;
17 using WebKit::WebURL; 17 using WebKit::WebURL;
18 using WebKit::WebWorkerClient; 18 using WebKit::WebWorkerClient;
19 19
20 WebWorkerProxy::WebWorkerProxy( 20 WebWorkerProxy::WebWorkerProxy(
21 WebWorkerClient* client, 21 WebWorkerClient* client,
22 ChildThread* child_thread, 22 ChildThread* child_thread,
23 int render_view_route_id) 23 int render_view_route_id)
24 : route_id_(MSG_ROUTING_NONE), 24 : WebWorkerBase(child_thread, MSG_ROUTING_NONE, render_view_route_id),
25 child_thread_(child_thread),
26 render_view_route_id_(render_view_route_id),
27 client_(client) { 25 client_(client) {
28 } 26 }
29 27
30 WebWorkerProxy::~WebWorkerProxy() {
31 Disconnect();
32
33 for (size_t i = 0; i < queued_messages_.size(); ++i)
34 delete queued_messages_[i];
35 }
36
37 void WebWorkerProxy::Disconnect() { 28 void WebWorkerProxy::Disconnect() {
38 if (route_id_ == MSG_ROUTING_NONE) 29 if (route_id_ == MSG_ROUTING_NONE)
39 return; 30 return;
40 31
41 // So the messages from WorkerContext (like WorkerContextDestroyed) do not
42 // come after nobody is listening. Since Worker and WorkerContext can
43 // terminate independently, already sent messages may still be in the pipe.
44 child_thread_->RemoveRoute(route_id_);
45
46 // Tell the browser to not start our queued worker. 32 // Tell the browser to not start our queued worker.
47 if (!queued_messages_.empty()) 33 if (!IsStarted())
48 child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_)); 34 child_thread_->Send(new ViewHostMsg_CancelCreateDedicatedWorker(route_id_));
49 35
50 route_id_ = MSG_ROUTING_NONE; 36 // Call our superclass to shutdown the routing
37 WebWorkerBase::Disconnect();
51 } 38 }
52 39
53 void WebWorkerProxy::startWorkerContext( 40 void WebWorkerProxy::startWorkerContext(
54 const WebURL& script_url, 41 const WebURL& script_url,
55 const WebString& user_agent, 42 const WebString& user_agent,
56 const WebString& source_code) { 43 const WebString& source_code) {
57 child_thread_->Send(new ViewHostMsg_CreateDedicatedWorker( 44 IPC::Message* create_message = new ViewHostMsg_CreateDedicatedWorker(
58 script_url, render_view_route_id_, &route_id_)); 45 script_url, render_view_route_id_, &route_id_);
59 if (route_id_ == MSG_ROUTING_NONE) 46 CreateWorkerContext(create_message, script_url, user_agent, source_code);
60 return;
61
62 child_thread_->AddRoute(route_id_, this);
63
64 // We make sure that the start message is the first, since postMessage might
65 // have already been called.
66 queued_messages_.insert(queued_messages_.begin(),
67 new WorkerMsg_StartWorkerContext(
68 route_id_, script_url, user_agent, source_code));
69 } 47 }
70 48
71 void WebWorkerProxy::terminateWorkerContext() { 49 void WebWorkerProxy::terminateWorkerContext() {
72 if (route_id_ != MSG_ROUTING_NONE) { 50 if (route_id_ != MSG_ROUTING_NONE) {
73 Send(new WorkerMsg_TerminateWorkerContext(route_id_)); 51 Send(new WorkerMsg_TerminateWorkerContext(route_id_));
74 Disconnect(); 52 Disconnect();
75 } 53 }
76 } 54 }
77 55
78 void WebWorkerProxy::postMessageToWorkerContext( 56 void WebWorkerProxy::postMessageToWorkerContext(
(...skipping 14 matching lines...) Expand all
93 } 71 }
94 72
95 void WebWorkerProxy::workerObjectDestroyed() { 73 void WebWorkerProxy::workerObjectDestroyed() {
96 Send(new WorkerMsg_WorkerObjectDestroyed(route_id_)); 74 Send(new WorkerMsg_WorkerObjectDestroyed(route_id_));
97 delete this; 75 delete this;
98 } 76 }
99 77
100 void WebWorkerProxy::clientDestroyed() { 78 void WebWorkerProxy::clientDestroyed() {
101 } 79 }
102 80
103 bool WebWorkerProxy::Send(IPC::Message* message) {
104 // It's possible that postMessage is called before the worker is created, in
105 // which case route_id_ will be none. Or the worker object can be interacted
106 // with before the browser process told us that it started, in which case we
107 // also want to queue the message.
108 if (route_id_ == MSG_ROUTING_NONE || !queued_messages_.empty()) {
109 queued_messages_.push_back(message);
110 return true;
111 }
112
113 // For now we proxy all messages to the worker process through the browser.
114 // Revisit if we find this slow.
115 // TODO(jabdelmalek): handle sync messages if we need them.
116 IPC::Message* wrapped_msg = new ViewHostMsg_ForwardToWorker(*message);
117 delete message;
118 return child_thread_->Send(wrapped_msg);
119 }
120
121 void WebWorkerProxy::OnMessageReceived(const IPC::Message& message) { 81 void WebWorkerProxy::OnMessageReceived(const IPC::Message& message) {
122 if (!client_) 82 if (!client_)
123 return; 83 return;
124 84
125 IPC_BEGIN_MESSAGE_MAP(WebWorkerProxy, message) 85 IPC_BEGIN_MESSAGE_MAP(WebWorkerProxy, message)
126 IPC_MESSAGE_HANDLER(ViewMsg_DedicatedWorkerCreated, 86 IPC_MESSAGE_HANDLER(ViewMsg_WorkerCreated, OnWorkerCreated)
127 OnDedicatedWorkerCreated)
128 IPC_MESSAGE_HANDLER(WorkerMsg_PostMessage, OnPostMessage) 87 IPC_MESSAGE_HANDLER(WorkerMsg_PostMessage, OnPostMessage)
129 IPC_MESSAGE_FORWARD(WorkerHostMsg_PostExceptionToWorkerObject, 88 IPC_MESSAGE_FORWARD(WorkerHostMsg_PostExceptionToWorkerObject,
130 client_, 89 client_,
131 WebWorkerClient::postExceptionToWorkerObject) 90 WebWorkerClient::postExceptionToWorkerObject)
132 IPC_MESSAGE_HANDLER(WorkerHostMsg_PostConsoleMessageToWorkerObject, 91 IPC_MESSAGE_HANDLER(WorkerHostMsg_PostConsoleMessageToWorkerObject,
133 OnPostConsoleMessageToWorkerObject) 92 OnPostConsoleMessageToWorkerObject)
134 IPC_MESSAGE_FORWARD(WorkerHostMsg_ConfirmMessageFromWorkerObject, 93 IPC_MESSAGE_FORWARD(WorkerHostMsg_ConfirmMessageFromWorkerObject,
135 client_, 94 client_,
136 WebWorkerClient::confirmMessageFromWorkerObject) 95 WebWorkerClient::confirmMessageFromWorkerObject)
137 IPC_MESSAGE_FORWARD(WorkerHostMsg_ReportPendingActivity, 96 IPC_MESSAGE_FORWARD(WorkerHostMsg_ReportPendingActivity,
138 client_, 97 client_,
139 WebWorkerClient::reportPendingActivity) 98 WebWorkerClient::reportPendingActivity)
140 IPC_MESSAGE_FORWARD(WorkerHostMsg_WorkerContextDestroyed, 99 IPC_MESSAGE_FORWARD(WorkerHostMsg_WorkerContextDestroyed,
141 client_, 100 client_,
142 WebWorkerClient::workerContextDestroyed) 101 WebWorkerClient::workerContextDestroyed)
143 IPC_END_MESSAGE_MAP() 102 IPC_END_MESSAGE_MAP()
144 } 103 }
145 104
146 void WebWorkerProxy::OnDedicatedWorkerCreated() { 105 void WebWorkerProxy::OnWorkerCreated() {
147 DCHECK(queued_messages_.size()); 106 // The worker is created - now send off the CreateWorkerContext message and
148 std::vector<IPC::Message*> queued_messages = queued_messages_; 107 // any other queued messages
149 queued_messages_.clear(); 108 SendQueuedMessages();
150 for (size_t i = 0; i < queued_messages.size(); ++i) {
151 queued_messages[i]->set_routing_id(route_id_);
152 Send(queued_messages[i]);
153 }
154 } 109 }
155 110
156 void WebWorkerProxy::OnPostMessage( 111 void WebWorkerProxy::OnPostMessage(
157 const string16& message, 112 const string16& message,
158 const std::vector<int>& sent_message_port_ids, 113 const std::vector<int>& sent_message_port_ids,
159 const std::vector<int>& new_routing_ids) { 114 const std::vector<int>& new_routing_ids) {
160 DCHECK(new_routing_ids.size() == sent_message_port_ids.size()); 115 DCHECK(new_routing_ids.size() == sent_message_port_ids.size());
161 WebMessagePortChannelArray channels(sent_message_port_ids.size()); 116 WebMessagePortChannelArray channels(sent_message_port_ids.size());
162 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { 117 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) {
163 channels[i] = new WebMessagePortChannelImpl( 118 channels[i] = new WebMessagePortChannelImpl(
164 new_routing_ids[i], sent_message_port_ids[i]); 119 new_routing_ids[i], sent_message_port_ids[i]);
165 } 120 }
166 121
167 client_->postMessageToWorkerObject(message, channels); 122 client_->postMessageToWorkerObject(message, channels);
168 } 123 }
169 124
170 void WebWorkerProxy::OnPostConsoleMessageToWorkerObject( 125 void WebWorkerProxy::OnPostConsoleMessageToWorkerObject(
171 const WorkerHostMsg_PostConsoleMessageToWorkerObject_Params& params) { 126 const WorkerHostMsg_PostConsoleMessageToWorkerObject_Params& params) {
172 client_->postConsoleMessageToWorkerObject(params.destination_identifier, 127 client_->postConsoleMessageToWorkerObject(params.destination_identifier,
173 params.source_identifier, params.message_type, params.message_level, 128 params.source_identifier, params.message_type, params.message_level,
174 params.message, params.line_number, params.source_url); 129 params.message, params.line_number, params.source_url);
175 } 130 }
176 131
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698