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

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: fix expected -> expected_status Created 6 years, 9 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
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/common/DEPS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 struct HandleInstallPhaseEventFinishedParameters {
kinuko 2014/03/27 09:21:22 Ah this starts looking a bit ominous..?
falken 2014/03/27 11:13:18 Yes... I don't yet see a better way for Install an
27 HandleInstallPhaseEventFinishedParameters(
28 base::WeakPtr<ServiceWorkerVersion> version,
29 uint32 expected_message_type,
30 const InstallPhaseEventFinishedMessageReader& message_reader,
31 const StatusCallback& callback,
32 ServiceWorkerVersion::Status next_status_on_success,
33 ServiceWorkerVersion::Status next_status_on_error,
34 ServiceWorkerStatusCode next_status_code_on_event_rejection)
35 : version(version),
36 expected_message_type(expected_message_type),
37 message_reader(message_reader),
38 callback(callback),
39 next_status_on_success(next_status_on_success),
40 next_status_on_error(next_status_on_error),
41 next_status_code_on_event_rejection(
42 next_status_code_on_event_rejection) {}
43
44 base::WeakPtr<ServiceWorkerVersion> version;
45 uint32 expected_message_type;
46 InstallPhaseEventFinishedMessageReader message_reader;
47 StatusCallback callback;
48 ServiceWorkerVersion::Status next_status_on_success;
49 ServiceWorkerVersion::Status next_status_on_error;
50 ServiceWorkerStatusCode next_status_code_on_event_rejection;
51 };
52
22 void RunSoon(const base::Closure& callback) { 53 void RunSoon(const base::Closure& callback) {
23 if (!callback.is_null()) 54 if (!callback.is_null())
24 base::MessageLoop::current()->PostTask(FROM_HERE, callback); 55 base::MessageLoop::current()->PostTask(FROM_HERE, callback);
25 } 56 }
26 57
27 template <typename CallbackArray, typename Arg> 58 template <typename CallbackArray, typename Arg>
28 void RunCallbacks(CallbackArray* callbacks_ptr, const Arg& arg) { 59 void RunCallbacks(CallbackArray* callbacks_ptr, const Arg& arg) {
29 CallbackArray callbacks; 60 CallbackArray callbacks;
30 callbacks.swap(*callbacks_ptr); 61 callbacks.swap(*callbacks_ptr);
31 for (typename CallbackArray::const_iterator i = callbacks.begin(); 62 for (typename CallbackArray::const_iterator i = callbacks.begin();
(...skipping 21 matching lines...) Expand all
53 return; 84 return;
54 } 85 }
55 task.Run(); 86 task.Run();
56 } 87 }
57 88
58 void RunEmptyMessageCallback(const MessageCallback& callback, 89 void RunEmptyMessageCallback(const MessageCallback& callback,
59 ServiceWorkerStatusCode status) { 90 ServiceWorkerStatusCode status) {
60 callback.Run(status, IPC::Message()); 91 callback.Run(status, IPC::Message());
61 } 92 }
62 93
63 void HandleEventFinished(base::WeakPtr<ServiceWorkerVersion> version, 94 void HandleInstallPhaseEventFinished(
64 uint32 expected_message_type, 95 const HandleInstallPhaseEventFinishedParameters& params,
65 const StatusCallback& callback, 96 ServiceWorkerStatusCode status,
66 ServiceWorkerVersion::Status next_status_on_success, 97 const IPC::Message& message) {
67 ServiceWorkerVersion::Status next_status_on_error, 98 if (!params.version)
68 ServiceWorkerStatusCode status,
69 const IPC::Message& message) {
70 if (!version)
71 return; 99 return;
72 if (status != SERVICE_WORKER_OK) { 100 if (status != SERVICE_WORKER_OK) {
73 version->SetStatus(next_status_on_error); 101 params.version->SetStatus(params.next_status_on_error);
74 callback.Run(status); 102 params.callback.Run(status);
75 return; 103 return;
76 } 104 }
77 if (message.type() != expected_message_type) { 105 if (message.type() != params.expected_message_type) {
78 NOTREACHED() << "Got unexpected response: " << message.type() 106 NOTREACHED() << "Got unexpected response: " << message.type()
79 << " expected:" << expected_message_type; 107 << " expected:" << params.expected_message_type;
80 version->SetStatus(next_status_on_error); 108 params.version->SetStatus(params.next_status_on_error);
81 callback.Run(SERVICE_WORKER_ERROR_FAILED); 109 params.callback.Run(SERVICE_WORKER_ERROR_FAILED);
82 return; 110 return;
83 } 111 }
84 version->SetStatus(next_status_on_success); 112 params.version->SetStatus(params.next_status_on_success);
85 callback.Run(SERVICE_WORKER_OK); 113
114 Tuple1<blink::WebServiceWorkerEventResult> result(
115 blink::WebServiceWorkerEventResultCompleted);
116 if (!params.message_reader.is_null()) {
117 params.message_reader.Run(&message, &result);
118 if (result.a == blink::WebServiceWorkerEventResultRejected)
119 status = params.next_status_code_on_event_rejection;
120 }
121 params.callback.Run(status);
86 } 122 }
87 123
88 void HandleFetchResponse(const ServiceWorkerVersion::FetchCallback& callback, 124 void HandleFetchResponse(const ServiceWorkerVersion::FetchCallback& callback,
89 ServiceWorkerStatusCode status, 125 ServiceWorkerStatusCode status,
90 const IPC::Message& message) { 126 const IPC::Message& message) {
91 if (status != SERVICE_WORKER_OK) { 127 if (status != SERVICE_WORKER_OK) {
92 callback.Run(status, 128 callback.Run(status,
93 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 129 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
94 ServiceWorkerResponse()); 130 ServiceWorkerResponse());
95 return; 131 return;
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 ServiceWorkerStatusCode status = 276 ServiceWorkerStatusCode status =
241 embedded_worker_->SendMessage(request_id, message); 277 embedded_worker_->SendMessage(request_id, message);
242 if (status != SERVICE_WORKER_OK) { 278 if (status != SERVICE_WORKER_OK) {
243 message_callbacks_.Remove(request_id); 279 message_callbacks_.Remove(request_id);
244 RunSoon(base::Bind(callback, status, IPC::Message())); 280 RunSoon(base::Bind(callback, status, IPC::Message()));
245 return; 281 return;
246 } 282 }
247 } 283 }
248 284
249 void ServiceWorkerVersion::DispatchInstallEvent( 285 void ServiceWorkerVersion::DispatchInstallEvent(
250 int active_version_embedded_worker_id, 286 int active_version_id,
251 const StatusCallback& callback) { 287 const StatusCallback& callback) {
252 DCHECK_EQ(NEW, status()) << status(); 288 DCHECK_EQ(NEW, status()) << status();
253 SetStatus(INSTALLING); 289 SetStatus(INSTALLING);
290 HandleInstallPhaseEventFinishedParameters params(
291 weak_factory_.GetWeakPtr(),
292 ServiceWorkerHostMsg_InstallEventFinished::ID,
293 base::Bind(&ServiceWorkerHostMsg_InstallEventFinished::Read),
294 callback,
295 INSTALLED,
296 NEW,
297 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED);
254 SendMessageAndRegisterCallback( 298 SendMessageAndRegisterCallback(
255 ServiceWorkerMsg_InstallEvent(active_version_embedded_worker_id), 299 ServiceWorkerMsg_InstallEvent(active_version_id),
256 base::Bind(&HandleEventFinished, weak_factory_.GetWeakPtr(), 300 base::Bind(&HandleInstallPhaseEventFinished, params));
257 ServiceWorkerHostMsg_InstallEventFinished::ID,
258 callback, INSTALLED, NEW));
259 } 301 }
260 302
261 void ServiceWorkerVersion::DispatchActivateEvent( 303 void ServiceWorkerVersion::DispatchActivateEvent(
262 const StatusCallback& callback) { 304 const StatusCallback& callback) {
263 DCHECK_EQ(INSTALLED, status()) << status(); 305 DCHECK_EQ(INSTALLED, status()) << status();
264 SetStatus(ACTIVATING); 306 SetStatus(ACTIVATING);
265 // TODO(kinuko): Implement. 307 // TODO(kinuko): Implement.
266 NOTIMPLEMENTED(); 308 NOTIMPLEMENTED();
267 RunSoon(base::Bind(&HandleEventFinished, weak_factory_.GetWeakPtr(), 309 HandleInstallPhaseEventFinishedParameters params(
268 -1 /* dummy message_id */, callback, ACTIVE, INSTALLED, 310 weak_factory_.GetWeakPtr(),
311 -1 /* dummy message_id */,
312 InstallPhaseEventFinishedMessageReader(),
313 callback,
314 ACTIVE,
315 INSTALLED,
316 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED);
317 RunSoon(base::Bind(&HandleInstallPhaseEventFinished,
318 params,
269 SERVICE_WORKER_OK, 319 SERVICE_WORKER_OK,
270 IPC::Message(-1, -1, IPC::Message::PRIORITY_NORMAL))); 320 IPC::Message(-1, -1, IPC::Message::PRIORITY_NORMAL)));
271 } 321 }
272 322
273 void ServiceWorkerVersion::DispatchFetchEvent( 323 void ServiceWorkerVersion::DispatchFetchEvent(
274 const ServiceWorkerFetchRequest& request, 324 const ServiceWorkerFetchRequest& request,
275 const FetchCallback& callback) { 325 const FetchCallback& callback) {
276 DCHECK_EQ(ACTIVE, status()) << status(); 326 DCHECK_EQ(ACTIVE, status()) << status();
277 SendMessageAndRegisterCallback( 327 SendMessageAndRegisterCallback(
278 ServiceWorkerMsg_FetchEvent(request), 328 ServiceWorkerMsg_FetchEvent(request),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 if (callback) { 371 if (callback) {
322 callback->Run(SERVICE_WORKER_OK, message); 372 callback->Run(SERVICE_WORKER_OK, message);
323 message_callbacks_.Remove(request_id); 373 message_callbacks_.Remove(request_id);
324 return; 374 return;
325 } 375 }
326 NOTREACHED() << "Got unexpected message: " << request_id 376 NOTREACHED() << "Got unexpected message: " << request_id
327 << " " << message.type(); 377 << " " << message.type();
328 } 378 }
329 379
330 } // namespace content 380 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/common/DEPS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698