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

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 205563006: Add a status code to install event handled message from Service Worker (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add comment and fix alphabetical ordering Created 6 years, 8 months 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 | Annotate | Revision Log
OLDNEW
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 #include "content/browser/service_worker/service_worker_version.h" 5 #include "content/browser/service_worker/service_worker_version.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "content/browser/service_worker/embedded_worker_instance.h" 8 #include "content/browser/service_worker/embedded_worker_instance.h"
9 #include "content/browser/service_worker/embedded_worker_registry.h" 9 #include "content/browser/service_worker/embedded_worker_registry.h"
10 #include "content/browser/service_worker/service_worker_context_core.h" 10 #include "content/browser/service_worker/service_worker_context_core.h"
11 #include "content/browser/service_worker/service_worker_registration.h" 11 #include "content/browser/service_worker/service_worker_registration.h"
12 #include "content/common/service_worker/service_worker_messages.h" 12 #include "content/common/service_worker/service_worker_messages.h"
13 #include "content/public/browser/browser_thread.h" 13 #include "content/public/browser/browser_thread.h"
14 14
15 namespace content { 15 namespace content {
16 16
17 typedef ServiceWorkerVersion::StatusCallback StatusCallback; 17 typedef ServiceWorkerVersion::StatusCallback StatusCallback;
18 typedef ServiceWorkerVersion::MessageCallback MessageCallback; 18 typedef ServiceWorkerVersion::MessageCallback MessageCallback;
19 19
20 namespace { 20 namespace {
21 21
22 typedef base::Callback<bool(const IPC::Message* message,
23 Tuple1<blink::WebServiceWorkerEventResult>* result)>
24 InstallPhaseEventFinishedMessageReader;
25
26 // Parameters for the HandleInstallPhaseEventFinished function, which cannot
27 // accept them directly without exceeding the max arity supported by Bind().
28 struct HandleInstallPhaseEventFinishedParameters {
29 HandleInstallPhaseEventFinishedParameters(
30 base::WeakPtr<ServiceWorkerVersion> version,
31 uint32 expected_message_type,
32 const InstallPhaseEventFinishedMessageReader& message_reader,
33 const StatusCallback& callback,
34 ServiceWorkerVersion::Status next_status_on_success,
35 ServiceWorkerVersion::Status next_status_on_error,
36 ServiceWorkerStatusCode next_status_code_on_event_rejection)
37 : version(version),
38 expected_message_type(expected_message_type),
39 message_reader(message_reader),
40 callback(callback),
41 next_status_on_success(next_status_on_success),
42 next_status_on_error(next_status_on_error),
43 next_status_code_on_event_rejection(
44 next_status_code_on_event_rejection) {}
45
46 base::WeakPtr<ServiceWorkerVersion> version;
47 uint32 expected_message_type;
48 InstallPhaseEventFinishedMessageReader message_reader;
49 StatusCallback callback;
50 ServiceWorkerVersion::Status next_status_on_success;
51 ServiceWorkerVersion::Status next_status_on_error;
52 ServiceWorkerStatusCode next_status_code_on_event_rejection;
53 };
54
22 void RunSoon(const base::Closure& callback) { 55 void RunSoon(const base::Closure& callback) {
23 if (!callback.is_null()) 56 if (!callback.is_null())
24 base::MessageLoop::current()->PostTask(FROM_HERE, callback); 57 base::MessageLoop::current()->PostTask(FROM_HERE, callback);
25 } 58 }
26 59
27 template <typename CallbackArray, typename Arg> 60 template <typename CallbackArray, typename Arg>
28 void RunCallbacks(CallbackArray* callbacks_ptr, const Arg& arg) { 61 void RunCallbacks(CallbackArray* callbacks_ptr, const Arg& arg) {
29 CallbackArray callbacks; 62 CallbackArray callbacks;
30 callbacks.swap(*callbacks_ptr); 63 callbacks.swap(*callbacks_ptr);
31 for (typename CallbackArray::const_iterator i = callbacks.begin(); 64 for (typename CallbackArray::const_iterator i = callbacks.begin();
(...skipping 21 matching lines...) Expand all
53 return; 86 return;
54 } 87 }
55 task.Run(); 88 task.Run();
56 } 89 }
57 90
58 void RunEmptyMessageCallback(const MessageCallback& callback, 91 void RunEmptyMessageCallback(const MessageCallback& callback,
59 ServiceWorkerStatusCode status) { 92 ServiceWorkerStatusCode status) {
60 callback.Run(status, IPC::Message()); 93 callback.Run(status, IPC::Message());
61 } 94 }
62 95
63 void HandleEventFinished(base::WeakPtr<ServiceWorkerVersion> version, 96 void HandleInstallPhaseEventFinished(
64 uint32 expected_message_type, 97 const HandleInstallPhaseEventFinishedParameters& params,
65 const StatusCallback& callback, 98 ServiceWorkerStatusCode status,
66 ServiceWorkerVersion::Status next_status_on_success, 99 const IPC::Message& message) {
67 ServiceWorkerVersion::Status next_status_on_error, 100 if (!params.version)
68 ServiceWorkerStatusCode status,
69 const IPC::Message& message) {
70 if (!version)
71 return; 101 return;
72 if (status != SERVICE_WORKER_OK) { 102 if (status != SERVICE_WORKER_OK) {
73 version->SetStatus(next_status_on_error); 103 params.version->SetStatus(params.next_status_on_error);
74 callback.Run(status); 104 params.callback.Run(status);
75 return; 105 return;
76 } 106 }
77 if (message.type() != expected_message_type) { 107 if (message.type() != params.expected_message_type) {
78 NOTREACHED() << "Got unexpected response: " << message.type() 108 NOTREACHED() << "Got unexpected response: " << message.type()
79 << " expected:" << expected_message_type; 109 << " expected:" << params.expected_message_type;
80 version->SetStatus(next_status_on_error); 110 params.version->SetStatus(params.next_status_on_error);
81 callback.Run(SERVICE_WORKER_ERROR_FAILED); 111 params.callback.Run(SERVICE_WORKER_ERROR_FAILED);
82 return; 112 return;
83 } 113 }
84 version->SetStatus(next_status_on_success); 114 params.version->SetStatus(params.next_status_on_success);
85 callback.Run(SERVICE_WORKER_OK); 115
116 Tuple1<blink::WebServiceWorkerEventResult> result(
117 blink::WebServiceWorkerEventResultCompleted);
118 if (!params.message_reader.is_null()) {
119 params.message_reader.Run(&message, &result);
120 if (result.a == blink::WebServiceWorkerEventResultRejected)
121 status = params.next_status_code_on_event_rejection;
122 }
123 params.callback.Run(status);
86 } 124 }
87 125
88 void HandleFetchResponse(const ServiceWorkerVersion::FetchCallback& callback, 126 void HandleFetchResponse(const ServiceWorkerVersion::FetchCallback& callback,
89 ServiceWorkerStatusCode status, 127 ServiceWorkerStatusCode status,
90 const IPC::Message& message) { 128 const IPC::Message& message) {
91 if (status != SERVICE_WORKER_OK) { 129 if (status != SERVICE_WORKER_OK) {
92 callback.Run(status, 130 callback.Run(status,
93 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 131 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
94 ServiceWorkerResponse()); 132 ServiceWorkerResponse());
95 return; 133 return;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 ServiceWorkerStatusCode status = 278 ServiceWorkerStatusCode status =
241 embedded_worker_->SendMessage(request_id, message); 279 embedded_worker_->SendMessage(request_id, message);
242 if (status != SERVICE_WORKER_OK) { 280 if (status != SERVICE_WORKER_OK) {
243 message_callbacks_.Remove(request_id); 281 message_callbacks_.Remove(request_id);
244 RunSoon(base::Bind(callback, status, IPC::Message())); 282 RunSoon(base::Bind(callback, status, IPC::Message()));
245 return; 283 return;
246 } 284 }
247 } 285 }
248 286
249 void ServiceWorkerVersion::DispatchInstallEvent( 287 void ServiceWorkerVersion::DispatchInstallEvent(
250 int active_version_embedded_worker_id, 288 int active_version_id,
251 const StatusCallback& callback) { 289 const StatusCallback& callback) {
252 DCHECK_EQ(NEW, status()) << status(); 290 DCHECK_EQ(NEW, status()) << status();
253 SetStatus(INSTALLING); 291 SetStatus(INSTALLING);
292 HandleInstallPhaseEventFinishedParameters params(
293 weak_factory_.GetWeakPtr(),
294 ServiceWorkerHostMsg_InstallEventFinished::ID,
295 base::Bind(&ServiceWorkerHostMsg_InstallEventFinished::Read),
296 callback,
297 INSTALLED,
298 NEW,
299 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED);
254 SendMessageAndRegisterCallback( 300 SendMessageAndRegisterCallback(
255 ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id), 301 ServiceWorkerMsg_InstallEvent(active_version_id),
256 base::Bind(&HandleEventFinished, weak_factory_.GetWeakPtr(), 302 base::Bind(&HandleInstallPhaseEventFinished, params));
257 ServiceWorkerHostMsg_InstallEventFinished::ID,
258 callback, INSTALLED, NEW));
259 } 303 }
260 304
261 void ServiceWorkerVersion::DispatchActivateEvent( 305 void ServiceWorkerVersion::DispatchActivateEvent(
262 const StatusCallback& callback) { 306 const StatusCallback& callback) {
263 DCHECK_EQ(INSTALLED, status()) << status(); 307 DCHECK_EQ(INSTALLED, status()) << status();
264 SetStatus(ACTIVATING); 308 SetStatus(ACTIVATING);
265 // TODO(kinuko): Implement. 309 // TODO(kinuko): Implement.
266 NOTIMPLEMENTED(); 310 NOTIMPLEMENTED();
267 RunSoon(base::Bind(&HandleEventFinished, weak_factory_.GetWeakPtr(), 311 HandleInstallPhaseEventFinishedParameters params(
268 -1 /* dummy message_id */, callback, ACTIVE, INSTALLED, 312 weak_factory_.GetWeakPtr(),
313 -1 /* dummy message_id */,
314 InstallPhaseEventFinishedMessageReader(),
315 callback,
316 ACTIVE,
317 INSTALLED,
318 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED);
319 RunSoon(base::Bind(&HandleInstallPhaseEventFinished,
320 params,
269 SERVICE_WORKER_OK, 321 SERVICE_WORKER_OK,
270 IPC::Message(-1, -1, IPC::Message::PRIORITY_NORMAL))); 322 IPC::Message(-1, -1, IPC::Message::PRIORITY_NORMAL)));
271 } 323 }
272 324
273 void ServiceWorkerVersion::DispatchFetchEvent( 325 void ServiceWorkerVersion::DispatchFetchEvent(
274 const ServiceWorkerFetchRequest& request, 326 const ServiceWorkerFetchRequest& request,
275 const FetchCallback& callback) { 327 const FetchCallback& callback) {
276 DCHECK_EQ(ACTIVE, status()) << status(); 328 DCHECK_EQ(ACTIVE, status()) << status();
277 SendMessageAndRegisterCallback( 329 SendMessageAndRegisterCallback(
278 ServiceWorkerMsg_FetchEvent(request), 330 ServiceWorkerMsg_FetchEvent(request),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 if (callback) { 373 if (callback) {
322 callback->Run(SERVICE_WORKER_OK, message); 374 callback->Run(SERVICE_WORKER_OK, message);
323 message_callbacks_.Remove(request_id); 375 message_callbacks_.Remove(request_id);
324 return; 376 return;
325 } 377 }
326 NOTREACHED() << "Got unexpected message: " << request_id 378 NOTREACHED() << "Got unexpected message: " << request_id
327 << " " << message.type(); 379 << " " << message.type();
328 } 380 }
329 381
330 } // namespace content 382 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698