OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_INSTANCE_H_ | 5 #ifndef CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_INSTANCE_H_ |
6 #define CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_INSTANCE_H_ | 6 #define CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_INSTANCE_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <string> | 10 #include <string> |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 // (installed scripts only) | 69 // (installed scripts only) |
70 SCRIPT_READ_STARTED, | 70 SCRIPT_READ_STARTED, |
71 SCRIPT_READ_FINISHED, | 71 SCRIPT_READ_FINISHED, |
72 // Add new values here. | 72 // Add new values here. |
73 STARTING_PHASE_MAX_VALUE, | 73 STARTING_PHASE_MAX_VALUE, |
74 }; | 74 }; |
75 | 75 |
76 class Listener { | 76 class Listener { |
77 public: | 77 public: |
78 virtual ~Listener() {} | 78 virtual ~Listener() {} |
| 79 |
| 80 virtual void OnStarting() {} |
| 81 virtual void OnProcessAllocated() {} |
| 82 virtual void OnStartWorkerMessageSent() {} |
79 virtual void OnThreadStarted() {} | 83 virtual void OnThreadStarted() {} |
80 virtual void OnStarting() {} | |
81 virtual void OnStarted() {} | 84 virtual void OnStarted() {} |
| 85 |
82 virtual void OnStopping() {} | 86 virtual void OnStopping() {} |
83 // Received ACK from renderer that the worker context terminated. | 87 // Received ACK from renderer that the worker context terminated. |
84 virtual void OnStopped(Status old_status) {} | 88 virtual void OnStopped(Status old_status) {} |
85 // The browser-side IPC endpoint for communication with the worker died. | 89 // The browser-side IPC endpoint for communication with the worker died. |
86 virtual void OnDetached(Status old_status) {} | 90 virtual void OnDetached(Status old_status) {} |
87 virtual void OnScriptLoaded() {} | 91 virtual void OnScriptLoaded() {} |
88 virtual void OnScriptLoadFailed() {} | 92 virtual void OnScriptLoadFailed() {} |
89 virtual void OnReportException(const base::string16& error_message, | 93 virtual void OnReportException(const base::string16& error_message, |
90 int line_number, | 94 int line_number, |
91 int column_number, | 95 int column_number, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 // Returns the ServiceRegistry for this worker. It is invalid to call this | 132 // Returns the ServiceRegistry for this worker. It is invalid to call this |
129 // when the worker is not in STARTING or RUNNING status. | 133 // when the worker is not in STARTING or RUNNING status. |
130 ServiceRegistry* GetServiceRegistry(); | 134 ServiceRegistry* GetServiceRegistry(); |
131 | 135 |
132 int embedded_worker_id() const { return embedded_worker_id_; } | 136 int embedded_worker_id() const { return embedded_worker_id_; } |
133 Status status() const { return status_; } | 137 Status status() const { return status_; } |
134 StartingPhase starting_phase() const { | 138 StartingPhase starting_phase() const { |
135 DCHECK_EQ(STARTING, status()); | 139 DCHECK_EQ(STARTING, status()); |
136 return starting_phase_; | 140 return starting_phase_; |
137 } | 141 } |
138 int process_id() const { return process_id_; } | 142 int process_id() const; |
139 int thread_id() const { return thread_id_; } | 143 int thread_id() const { return thread_id_; } |
140 int worker_devtools_agent_route_id() const; | 144 int worker_devtools_agent_route_id() const; |
141 MessagePortMessageFilter* message_port_message_filter() const; | 145 MessagePortMessageFilter* message_port_message_filter() const; |
142 | 146 |
143 void AddListener(Listener* listener); | 147 void AddListener(Listener* listener); |
144 void RemoveListener(Listener* listener); | 148 void RemoveListener(Listener* listener); |
145 | 149 |
146 void set_devtools_attached(bool attached) { devtools_attached_ = attached; } | 150 void set_devtools_attached(bool attached) { devtools_attached_ = attached; } |
147 bool devtools_attached() const { return devtools_attached_; } | 151 bool devtools_attached() const { return devtools_attached_; } |
148 | 152 |
149 // Called when the script load request accessed the network. | 153 // Called when the script load request accessed the network. |
150 void OnNetworkAccessedForScriptLoad(); | 154 void OnNetworkAccessedForScriptLoad(); |
151 | 155 |
152 // Called when reading the main script from the service worker script cache | 156 // Called when reading the main script from the service worker script cache |
153 // begins and ends. | 157 // begins and ends. |
154 void OnScriptReadStarted(); | 158 void OnScriptReadStarted(); |
155 void OnScriptReadFinished(); | 159 void OnScriptReadFinished(); |
156 | 160 |
157 static std::string StatusToString(Status status); | 161 static std::string StatusToString(Status status); |
158 static std::string StartingPhaseToString(StartingPhase phase); | 162 static std::string StartingPhaseToString(StartingPhase phase); |
159 | 163 |
160 void Detach(); | 164 void Detach(); |
161 | 165 |
162 private: | 166 private: |
163 typedef base::ObserverList<Listener> ListenerList; | 167 typedef base::ObserverList<Listener> ListenerList; |
164 class DevToolsProxy; | 168 class DevToolsProxy; |
| 169 class StartTask; |
| 170 class WorkerProcessHandle; |
165 friend class EmbeddedWorkerRegistry; | 171 friend class EmbeddedWorkerRegistry; |
166 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StartAndStop); | 172 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StartAndStop); |
167 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, DetachDuringStart); | 173 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, DetachDuringStart); |
168 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StopDuringStart); | 174 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StopDuringStart); |
169 | 175 |
170 // Constructor is called via EmbeddedWorkerRegistry::CreateWorker(). | 176 // Constructor is called via EmbeddedWorkerRegistry::CreateWorker(). |
171 // This instance holds a ref of |registry|. | 177 // This instance holds a ref of |registry|. |
172 EmbeddedWorkerInstance(base::WeakPtr<ServiceWorkerContextCore> context, | 178 EmbeddedWorkerInstance(base::WeakPtr<ServiceWorkerContextCore> context, |
173 int embedded_worker_id); | 179 int embedded_worker_id); |
174 | 180 |
175 // Called back from ServiceWorkerProcessManager after Start() passes control | 181 // Called back from StartTask after a process is allocated on the UI thread. |
176 // to the UI thread to acquire a reference to the process. | 182 void OnProcessAllocated(scoped_ptr<WorkerProcessHandle> handle); |
177 static void RunProcessAllocated( | 183 |
178 base::WeakPtr<EmbeddedWorkerInstance> instance, | 184 // Called back from StartTask after the worker is registered to |
179 base::WeakPtr<ServiceWorkerContextCore> context, | 185 // WorkerDevToolsManager. |
180 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 186 void OnRegisteredToDevToolsManager(bool is_new_process, |
181 const EmbeddedWorkerInstance::StatusCallback& callback, | 187 int worker_devtools_agent_route_id, |
182 ServiceWorkerStatusCode status, | 188 bool wait_for_debugger); |
183 int process_id, | 189 |
184 bool is_new_process); | 190 // Called back from StartTask after a start worker message is sent. |
185 void ProcessAllocated(scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | 191 void OnStartWorkerMessageSent(); |
186 const StatusCallback& callback, | |
187 int process_id, | |
188 bool is_new_process, | |
189 ServiceWorkerStatusCode status); | |
190 // Called back after ProcessAllocated() passes control to the UI thread to | |
191 // register to WorkerDevToolsManager. | |
192 void SendStartWorker(scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, | |
193 const StatusCallback& callback, | |
194 bool is_new_process, | |
195 int worker_devtools_agent_route_id, | |
196 bool wait_for_debugger); | |
197 | 192 |
198 // Called back from Registry when the worker instance has ack'ed that | 193 // Called back from Registry when the worker instance has ack'ed that |
199 // it is ready for inspection. | 194 // it is ready for inspection. |
200 void OnReadyForInspection(); | 195 void OnReadyForInspection(); |
201 | 196 |
202 // Called back from Registry when the worker instance has ack'ed that | 197 // Called back from Registry when the worker instance has ack'ed that |
203 // it finished loading the script. | 198 // it finished loading the script. |
204 void OnScriptLoaded(); | 199 void OnScriptLoaded(); |
205 | 200 |
206 // Called back from Registry when the worker instance has ack'ed that | 201 // Called back from Registry when the worker instance has ack'ed that |
(...skipping 12 matching lines...) Expand all Loading... |
219 // WorkerGlobalScope has actually started and evaluated the script. This is | 214 // WorkerGlobalScope has actually started and evaluated the script. This is |
220 // called after OnScriptEvaluated. | 215 // called after OnScriptEvaluated. |
221 // This will change the internal status from STARTING to RUNNING. | 216 // This will change the internal status from STARTING to RUNNING. |
222 void OnStarted(); | 217 void OnStarted(); |
223 | 218 |
224 // Called back from Registry when the worker instance has ack'ed that | 219 // Called back from Registry when the worker instance has ack'ed that |
225 // its WorkerGlobalScope is actually stopped in the child process. | 220 // its WorkerGlobalScope is actually stopped in the child process. |
226 // This will change the internal status from STARTING or RUNNING to | 221 // This will change the internal status from STARTING or RUNNING to |
227 // STOPPED. | 222 // STOPPED. |
228 void OnStopped(); | 223 void OnStopped(); |
| 224 |
229 // Called when ServiceWorkerDispatcherHost for the worker died while it was | 225 // Called when ServiceWorkerDispatcherHost for the worker died while it was |
230 // running. | 226 // running. |
231 void OnDetached(); | 227 void OnDetached(); |
232 | 228 |
233 // Called back from Registry when the worker instance sends message | 229 // Called back from Registry when the worker instance sends message |
234 // to the browser (i.e. EmbeddedWorker observers). | 230 // to the browser (i.e. EmbeddedWorker observers). |
235 // Returns false if the message is not handled. | 231 // Returns false if the message is not handled. |
236 bool OnMessageReceived(const IPC::Message& message); | 232 bool OnMessageReceived(const IPC::Message& message); |
237 | 233 |
238 // Called back from Registry when the worker instance reports the exception. | 234 // Called back from Registry when the worker instance reports the exception. |
239 void OnReportException(const base::string16& error_message, | 235 void OnReportException(const base::string16& error_message, |
240 int line_number, | 236 int line_number, |
241 int column_number, | 237 int column_number, |
242 const GURL& source_url); | 238 const GURL& source_url); |
243 | 239 |
244 // Called back from Registry when the worker instance reports to the console. | 240 // Called back from Registry when the worker instance reports to the console. |
245 void OnReportConsoleMessage(int source_identifier, | 241 void OnReportConsoleMessage(int source_identifier, |
246 int message_level, | 242 int message_level, |
247 const base::string16& message, | 243 const base::string16& message, |
248 int line_number, | 244 int line_number, |
249 const GURL& source_url); | 245 const GURL& source_url); |
250 | 246 |
251 // Resets all running state. After this function is called, |status_| is | 247 // Resets all running state. After this function is called, |status_| is |
252 // STOPPED. | 248 // STOPPED. |
253 void ReleaseProcess(); | 249 void ReleaseProcess(); |
254 // Called when the startup sequence failed. Calls ReleaseProcess() and invokes | 250 |
255 // |callback| with |status|. May destroy |this|. | 251 // Called back from StartTask when the startup sequence failed. Calls |
| 252 // ReleaseProcess() and invokes |callback| with |status|. May destroy |this|. |
256 void OnStartFailed(const StatusCallback& callback, | 253 void OnStartFailed(const StatusCallback& callback, |
257 ServiceWorkerStatusCode status); | 254 ServiceWorkerStatusCode status); |
258 | 255 |
259 base::WeakPtr<ServiceWorkerContextCore> context_; | 256 base::WeakPtr<ServiceWorkerContextCore> context_; |
260 scoped_refptr<EmbeddedWorkerRegistry> registry_; | 257 scoped_refptr<EmbeddedWorkerRegistry> registry_; |
261 const int embedded_worker_id_; | 258 const int embedded_worker_id_; |
262 Status status_; | 259 Status status_; |
263 StartingPhase starting_phase_; | 260 StartingPhase starting_phase_; |
264 | 261 |
265 // Current running information. | 262 // Current running information. |
266 int process_id_; | 263 scoped_ptr<EmbeddedWorkerInstance::WorkerProcessHandle> process_handle_; |
267 int thread_id_; | 264 int thread_id_; |
268 scoped_ptr<ServiceRegistryImpl> service_registry_; | 265 scoped_ptr<ServiceRegistryImpl> service_registry_; |
269 | 266 |
270 // Whether devtools is attached or not. | 267 // Whether devtools is attached or not. |
271 bool devtools_attached_; | 268 bool devtools_attached_; |
272 | 269 |
273 // True if the script load request accessed the network. If the script was | 270 // True if the script load request accessed the network. If the script was |
274 // served from HTTPCache or ServiceWorkerDatabase this value is false. | 271 // served from HTTPCache or ServiceWorkerDatabase this value is false. |
275 bool network_accessed_for_script_; | 272 bool network_accessed_for_script_; |
276 | 273 |
277 StatusCallback start_callback_; | |
278 ListenerList listener_list_; | 274 ListenerList listener_list_; |
279 scoped_ptr<DevToolsProxy> devtools_proxy_; | 275 scoped_ptr<DevToolsProxy> devtools_proxy_; |
280 | 276 |
| 277 scoped_ptr<StartTask> inflight_start_task_; |
281 base::TimeTicks start_timing_; | 278 base::TimeTicks start_timing_; |
282 | 279 |
283 base::WeakPtrFactory<EmbeddedWorkerInstance> weak_factory_; | 280 base::WeakPtrFactory<EmbeddedWorkerInstance> weak_factory_; |
284 | 281 |
285 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstance); | 282 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstance); |
286 }; | 283 }; |
287 | 284 |
288 } // namespace content | 285 } // namespace content |
289 | 286 |
290 #endif // CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_INSTANCE_H_ | 287 #endif // CONTENT_BROWSER_SERVICE_WORKER_EMBEDDED_WORKER_INSTANCE_H_ |
OLD | NEW |