OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_internals_ui.h" | 5 #include "content/browser/service_worker/service_worker_internals_ui.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 internals->web_ui()->CallJavascriptFunction( | 57 internals->web_ui()->CallJavascriptFunction( |
58 "serviceworker.onOperationComplete", | 58 "serviceworker.onOperationComplete", |
59 FundamentalValue(static_cast<int>(status)), | 59 FundamentalValue(static_cast<int>(status)), |
60 FundamentalValue(callback_id)); | 60 FundamentalValue(callback_id)); |
61 } | 61 } |
62 } | 62 } |
63 | 63 |
64 void CallServiceWorkerVersionMethodWithVersionID( | 64 void CallServiceWorkerVersionMethodWithVersionID( |
65 ServiceWorkerInternalsUI::ServiceWorkerVersionMethod method, | 65 ServiceWorkerInternalsUI::ServiceWorkerVersionMethod method, |
66 scoped_refptr<ServiceWorkerContextWrapper> context, | 66 scoped_refptr<ServiceWorkerContextWrapper> context, |
67 int64 version_id, | 67 std::string version_uuid, |
68 const ServiceWorkerInternalsUI::StatusCallback& callback) { | 68 const ServiceWorkerInternalsUI::StatusCallback& callback) { |
69 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 69 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
70 BrowserThread::PostTask( | 70 BrowserThread::PostTask( |
71 BrowserThread::IO, | 71 BrowserThread::IO, FROM_HERE, |
72 FROM_HERE, | 72 base::Bind(CallServiceWorkerVersionMethodWithVersionID, method, context, |
73 base::Bind(CallServiceWorkerVersionMethodWithVersionID, | 73 version_uuid, callback)); |
74 method, | |
75 context, | |
76 version_id, | |
77 callback)); | |
78 return; | 74 return; |
79 } | 75 } |
80 | 76 |
81 scoped_refptr<ServiceWorkerVersion> version = | 77 scoped_refptr<ServiceWorkerVersion> version = |
82 context->GetLiveVersion(version_id); | 78 context->GetLiveVersion(version_uuid); |
83 if (!version.get()) { | 79 if (!version.get()) { |
84 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND); | 80 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND); |
85 return; | 81 return; |
86 } | 82 } |
87 (*version.get().*method)(callback); | 83 (*version.get().*method)(callback); |
88 } | 84 } |
89 | 85 |
90 void DispatchPushEventWithVersionID( | 86 void DispatchPushEventWithVersionID( |
91 scoped_refptr<ServiceWorkerContextWrapper> context, | 87 scoped_refptr<ServiceWorkerContextWrapper> context, |
92 int64 version_id, | 88 std::string version_uuid, |
93 const ServiceWorkerInternalsUI::StatusCallback& callback) { | 89 const ServiceWorkerInternalsUI::StatusCallback& callback) { |
94 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 90 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
95 BrowserThread::PostTask( | 91 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
96 BrowserThread::IO, | 92 base::Bind(DispatchPushEventWithVersionID, context, |
97 FROM_HERE, | 93 version_uuid, callback)); |
98 base::Bind(DispatchPushEventWithVersionID, | |
99 context, | |
100 version_id, | |
101 callback)); | |
102 return; | 94 return; |
103 } | 95 } |
104 | 96 |
105 scoped_refptr<ServiceWorkerVersion> version = | 97 scoped_refptr<ServiceWorkerVersion> version = |
106 context->GetLiveVersion(version_id); | 98 context->GetLiveVersion(version_uuid); |
107 if (!version.get()) { | 99 if (!version.get()) { |
108 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND); | 100 callback.Run(SERVICE_WORKER_ERROR_NOT_FOUND); |
109 return; | 101 return; |
110 } | 102 } |
111 std::string data = "Test push message from ServiceWorkerInternals."; | 103 std::string data = "Test push message from ServiceWorkerInternals."; |
112 version->DispatchPushEvent(callback, data); | 104 version->DispatchPushEvent(callback, data); |
113 } | 105 } |
114 | 106 |
115 void UpdateVersionInfo(const ServiceWorkerVersionInfo& version, | 107 void UpdateVersionInfo(const ServiceWorkerVersionInfo& version, |
116 DictionaryValue* info) { | 108 DictionaryValue* info) { |
(...skipping 26 matching lines...) Expand all Loading... |
143 info->SetString("status", "ACTIVATING"); | 135 info->SetString("status", "ACTIVATING"); |
144 break; | 136 break; |
145 case ServiceWorkerVersion::ACTIVATED: | 137 case ServiceWorkerVersion::ACTIVATED: |
146 info->SetString("status", "ACTIVATED"); | 138 info->SetString("status", "ACTIVATED"); |
147 break; | 139 break; |
148 case ServiceWorkerVersion::REDUNDANT: | 140 case ServiceWorkerVersion::REDUNDANT: |
149 info->SetString("status", "REDUNDANT"); | 141 info->SetString("status", "REDUNDANT"); |
150 break; | 142 break; |
151 } | 143 } |
152 info->SetString("script_url", version.script_url.spec()); | 144 info->SetString("script_url", version.script_url.spec()); |
153 info->SetString("version_id", base::Int64ToString(version.version_id)); | 145 info->SetString("version_uuid", version.version_uuid); |
154 info->SetInteger("process_id", version.process_id); | 146 info->SetInteger("process_id", version.process_id); |
155 info->SetInteger("thread_id", version.thread_id); | 147 info->SetInteger("thread_id", version.thread_id); |
156 info->SetInteger("devtools_agent_route_id", version.devtools_agent_route_id); | 148 info->SetInteger("devtools_agent_route_id", version.devtools_agent_route_id); |
157 } | 149 } |
158 | 150 |
159 ListValue* GetRegistrationListValue( | 151 ListValue* GetRegistrationListValue( |
160 const std::vector<ServiceWorkerRegistrationInfo>& registrations) { | 152 const std::vector<ServiceWorkerRegistrationInfo>& registrations) { |
161 ListValue* result = new ListValue(); | 153 ListValue* result = new ListValue(); |
162 for (std::vector<ServiceWorkerRegistrationInfo>::const_iterator it = | 154 for (std::vector<ServiceWorkerRegistrationInfo>::const_iterator it = |
163 registrations.begin(); | 155 registrations.begin(); |
164 it != registrations.end(); | 156 it != registrations.end(); |
165 ++it) { | 157 ++it) { |
166 const ServiceWorkerRegistrationInfo& registration = *it; | 158 const ServiceWorkerRegistrationInfo& registration = *it; |
167 DictionaryValue* registration_info = new DictionaryValue(); | 159 DictionaryValue* registration_info = new DictionaryValue(); |
168 registration_info->SetString("scope", registration.pattern.spec()); | 160 registration_info->SetString("scope", registration.pattern.spec()); |
169 registration_info->SetString( | 161 registration_info->SetString( |
170 "registration_id", base::Int64ToString(registration.registration_id)); | 162 "registration_id", base::Int64ToString(registration.registration_id)); |
171 | 163 |
172 if (registration.active_version.version_id != | 164 if (!registration.active_version.version_uuid.empty()) { |
173 kInvalidServiceWorkerVersionId) { | |
174 DictionaryValue* active_info = new DictionaryValue(); | 165 DictionaryValue* active_info = new DictionaryValue(); |
175 UpdateVersionInfo(registration.active_version, active_info); | 166 UpdateVersionInfo(registration.active_version, active_info); |
176 registration_info->Set("active", active_info); | 167 registration_info->Set("active", active_info); |
177 } | 168 } |
178 | 169 |
179 if (registration.waiting_version.version_id != | 170 if (!registration.waiting_version.version_uuid.empty()) { |
180 kInvalidServiceWorkerVersionId) { | |
181 DictionaryValue* waiting_info = new DictionaryValue(); | 171 DictionaryValue* waiting_info = new DictionaryValue(); |
182 UpdateVersionInfo(registration.waiting_version, waiting_info); | 172 UpdateVersionInfo(registration.waiting_version, waiting_info); |
183 registration_info->Set("waiting", waiting_info); | 173 registration_info->Set("waiting", waiting_info); |
184 } | 174 } |
185 | 175 |
186 result->Append(registration_info); | 176 result->Append(registration_info); |
187 } | 177 } |
188 return result; | 178 return result; |
189 } | 179 } |
190 | 180 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 | 234 |
245 } // namespace | 235 } // namespace |
246 | 236 |
247 class ServiceWorkerInternalsUI::PartitionObserver | 237 class ServiceWorkerInternalsUI::PartitionObserver |
248 : public ServiceWorkerContextObserver { | 238 : public ServiceWorkerContextObserver { |
249 public: | 239 public: |
250 PartitionObserver(int partition_id, WebUI* web_ui) | 240 PartitionObserver(int partition_id, WebUI* web_ui) |
251 : partition_id_(partition_id), web_ui_(web_ui) {} | 241 : partition_id_(partition_id), web_ui_(web_ui) {} |
252 ~PartitionObserver() override {} | 242 ~PartitionObserver() override {} |
253 // ServiceWorkerContextObserver overrides: | 243 // ServiceWorkerContextObserver overrides: |
254 void OnRunningStateChanged(int64 version_id, | 244 void OnRunningStateChanged(std::string version_uuid, |
255 ServiceWorkerVersion::RunningStatus) override { | 245 ServiceWorkerVersion::RunningStatus) override { |
256 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 246 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
257 web_ui_->CallJavascriptFunction( | 247 web_ui_->CallJavascriptFunction("serviceworker.onRunningStateChanged", |
258 "serviceworker.onRunningStateChanged", FundamentalValue(partition_id_), | 248 FundamentalValue(partition_id_), |
259 StringValue(base::Int64ToString(version_id))); | 249 StringValue(version_uuid)); |
260 } | 250 } |
261 void OnVersionStateChanged(int64 version_id, | 251 void OnVersionStateChanged(std::string version_uuid, |
262 ServiceWorkerVersion::Status) override { | 252 ServiceWorkerVersion::Status) override { |
263 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 253 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
264 web_ui_->CallJavascriptFunction( | 254 web_ui_->CallJavascriptFunction("serviceworker.onVersionStateChanged", |
265 "serviceworker.onVersionStateChanged", | 255 FundamentalValue(partition_id_), |
266 FundamentalValue(partition_id_), | 256 StringValue(version_uuid)); |
267 StringValue(base::Int64ToString(version_id))); | |
268 } | 257 } |
269 void OnErrorReported(int64 version_id, | 258 void OnErrorReported(std::string version_uuid, |
270 int process_id, | 259 int process_id, |
271 int thread_id, | 260 int thread_id, |
272 const ErrorInfo& info) override { | 261 const ErrorInfo& info) override { |
273 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 262 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
274 ScopedVector<const Value> args; | 263 ScopedVector<const Value> args; |
275 args.push_back(new FundamentalValue(partition_id_)); | 264 args.push_back(new FundamentalValue(partition_id_)); |
276 args.push_back(new StringValue(base::Int64ToString(version_id))); | 265 args.push_back(new StringValue(version_uuid)); |
277 args.push_back(new FundamentalValue(process_id)); | 266 args.push_back(new FundamentalValue(process_id)); |
278 args.push_back(new FundamentalValue(thread_id)); | 267 args.push_back(new FundamentalValue(thread_id)); |
279 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 268 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
280 value->SetString("message", info.error_message); | 269 value->SetString("message", info.error_message); |
281 value->SetInteger("lineNumber", info.line_number); | 270 value->SetInteger("lineNumber", info.line_number); |
282 value->SetInteger("columnNumber", info.column_number); | 271 value->SetInteger("columnNumber", info.column_number); |
283 value->SetString("sourceURL", info.source_url.spec()); | 272 value->SetString("sourceURL", info.source_url.spec()); |
284 args.push_back(value.release()); | 273 args.push_back(value.release()); |
285 web_ui_->CallJavascriptFunction("serviceworker.onErrorReported", | 274 web_ui_->CallJavascriptFunction("serviceworker.onErrorReported", |
286 args.get()); | 275 args.get()); |
287 } | 276 } |
288 void OnReportConsoleMessage(int64 version_id, | 277 void OnReportConsoleMessage(std::string version_uuid, |
289 int process_id, | 278 int process_id, |
290 int thread_id, | 279 int thread_id, |
291 const ConsoleMessage& message) override { | 280 const ConsoleMessage& message) override { |
292 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 281 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
293 ScopedVector<const Value> args; | 282 ScopedVector<const Value> args; |
294 args.push_back(new FundamentalValue(partition_id_)); | 283 args.push_back(new FundamentalValue(partition_id_)); |
295 args.push_back(new StringValue(base::Int64ToString(version_id))); | 284 args.push_back(new StringValue(version_uuid)); |
296 args.push_back(new FundamentalValue(process_id)); | 285 args.push_back(new FundamentalValue(process_id)); |
297 args.push_back(new FundamentalValue(thread_id)); | 286 args.push_back(new FundamentalValue(thread_id)); |
298 scoped_ptr<DictionaryValue> value(new DictionaryValue()); | 287 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
299 value->SetInteger("sourceIdentifier", message.source_identifier); | 288 value->SetInteger("sourceIdentifier", message.source_identifier); |
300 value->SetInteger("message_level", message.message_level); | 289 value->SetInteger("message_level", message.message_level); |
301 value->SetString("message", message.message); | 290 value->SetString("message", message.message); |
302 value->SetInteger("lineNumber", message.line_number); | 291 value->SetInteger("lineNumber", message.line_number); |
303 value->SetString("sourceURL", message.source_url.spec()); | 292 value->SetString("sourceURL", message.source_url.spec()); |
304 args.push_back(value.release()); | 293 args.push_back(value.release()); |
305 web_ui_->CallJavascriptFunction("serviceworker.onConsoleMessageReported", | 294 web_ui_->CallJavascriptFunction("serviceworker.onConsoleMessageReported", |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 } | 477 } |
489 | 478 |
490 void ServiceWorkerInternalsUI::CallServiceWorkerVersionMethod( | 479 void ServiceWorkerInternalsUI::CallServiceWorkerVersionMethod( |
491 ServiceWorkerVersionMethod method, | 480 ServiceWorkerVersionMethod method, |
492 const ListValue* args) { | 481 const ListValue* args) { |
493 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 482 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
494 int callback_id; | 483 int callback_id; |
495 const DictionaryValue* cmd_args = NULL; | 484 const DictionaryValue* cmd_args = NULL; |
496 int partition_id; | 485 int partition_id; |
497 scoped_refptr<ServiceWorkerContextWrapper> context; | 486 scoped_refptr<ServiceWorkerContextWrapper> context; |
498 std::string version_id_string; | 487 std::string version_uuid; |
499 int64 version_id = 0; | |
500 if (!args->GetInteger(0, &callback_id) || | 488 if (!args->GetInteger(0, &callback_id) || |
501 !args->GetDictionary(1, &cmd_args) || | 489 !args->GetDictionary(1, &cmd_args) || |
502 !cmd_args->GetInteger("partition_id", &partition_id) || | 490 !cmd_args->GetInteger("partition_id", &partition_id) || |
503 !GetServiceWorkerContext(partition_id, &context) || | 491 !GetServiceWorkerContext(partition_id, &context) || |
504 !cmd_args->GetString("version_id", &version_id_string) || | 492 !cmd_args->GetString("version_uuid", &version_uuid)) { |
505 !base::StringToInt64(version_id_string, &version_id)) { | |
506 return; | 493 return; |
507 } | 494 } |
508 | 495 |
509 base::Callback<void(ServiceWorkerStatusCode)> callback = | 496 base::Callback<void(ServiceWorkerStatusCode)> callback = |
510 base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id); | 497 base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id); |
511 CallServiceWorkerVersionMethodWithVersionID( | 498 CallServiceWorkerVersionMethodWithVersionID(method, context, version_uuid, |
512 method, context, version_id, callback); | 499 callback); |
513 } | 500 } |
514 | 501 |
515 void ServiceWorkerInternalsUI::DispatchPushEvent( | 502 void ServiceWorkerInternalsUI::DispatchPushEvent( |
516 const ListValue* args) { | 503 const ListValue* args) { |
517 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 504 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
518 int callback_id; | 505 int callback_id; |
519 int partition_id; | 506 int partition_id; |
520 int64 version_id = 0; | 507 std::string version_uuid = 0; |
521 std::string version_id_string; | |
522 const DictionaryValue* cmd_args = NULL; | 508 const DictionaryValue* cmd_args = NULL; |
523 scoped_refptr<ServiceWorkerContextWrapper> context; | 509 scoped_refptr<ServiceWorkerContextWrapper> context; |
524 if (!args->GetInteger(0, &callback_id) || | 510 if (!args->GetInteger(0, &callback_id) || |
525 !args->GetDictionary(1, &cmd_args) || | 511 !args->GetDictionary(1, &cmd_args) || |
526 !cmd_args->GetInteger("partition_id", &partition_id) || | 512 !cmd_args->GetInteger("partition_id", &partition_id) || |
527 !GetServiceWorkerContext(partition_id, &context) || | 513 !GetServiceWorkerContext(partition_id, &context) || |
528 !cmd_args->GetString("version_id", &version_id_string) || | 514 !cmd_args->GetString("version_uuid", &version_uuid)) { |
529 !base::StringToInt64(version_id_string, &version_id)) { | |
530 return; | 515 return; |
531 } | 516 } |
532 | 517 |
533 base::Callback<void(ServiceWorkerStatusCode)> callback = | 518 base::Callback<void(ServiceWorkerStatusCode)> callback = |
534 base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id); | 519 base::Bind(OperationCompleteCallback, AsWeakPtr(), callback_id); |
535 DispatchPushEventWithVersionID(context, version_id, callback); | 520 DispatchPushEventWithVersionID(context, version_uuid, callback); |
536 } | 521 } |
537 | 522 |
538 void ServiceWorkerInternalsUI::InspectWorker(const ListValue* args) { | 523 void ServiceWorkerInternalsUI::InspectWorker(const ListValue* args) { |
539 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 524 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
540 int callback_id; | 525 int callback_id; |
541 const DictionaryValue* cmd_args = NULL; | 526 const DictionaryValue* cmd_args = NULL; |
542 int process_id = 0; | 527 int process_id = 0; |
543 int devtools_agent_route_id = 0; | 528 int devtools_agent_route_id = 0; |
544 if (!args->GetInteger(0, &callback_id) || | 529 if (!args->GetInteger(0, &callback_id) || |
545 !args->GetDictionary(1, &cmd_args) || | 530 !args->GetDictionary(1, &cmd_args) || |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 601 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
617 return; | 602 return; |
618 } | 603 } |
619 | 604 |
620 // ServiceWorkerContextWrapper::UnregisterServiceWorker doesn't work here | 605 // ServiceWorkerContextWrapper::UnregisterServiceWorker doesn't work here |
621 // because that reduces a status code to boolean. | 606 // because that reduces a status code to boolean. |
622 context->context()->UnregisterServiceWorker(scope, callback); | 607 context->context()->UnregisterServiceWorker(scope, callback); |
623 } | 608 } |
624 | 609 |
625 } // namespace content | 610 } // namespace content |
OLD | NEW |