| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 : internals_(internals), original_args_(original_args.Pass()) {} | 42 : internals_(internals), original_args_(original_args.Pass()) {} |
| 43 | 43 |
| 44 void GetRegistrationsOnIOThread(ServiceWorkerContextWrapper* context, | 44 void GetRegistrationsOnIOThread(ServiceWorkerContextWrapper* context, |
| 45 const base::FilePath& context_path); | 45 const base::FilePath& context_path); |
| 46 void UnregisterOnIOThread(scoped_refptr<ServiceWorkerContextWrapper> context, | 46 void UnregisterOnIOThread(scoped_refptr<ServiceWorkerContextWrapper> context, |
| 47 const GURL& scope); | 47 const GURL& scope); |
| 48 void StartWorkerOnIOThread(scoped_refptr<ServiceWorkerContextWrapper> context, | 48 void StartWorkerOnIOThread(scoped_refptr<ServiceWorkerContextWrapper> context, |
| 49 const GURL& scope); | 49 const GURL& scope); |
| 50 void StopWorkerOnIOThread(scoped_refptr<ServiceWorkerContextWrapper> context, | 50 void StopWorkerOnIOThread(scoped_refptr<ServiceWorkerContextWrapper> context, |
| 51 const GURL& scope); | 51 const GURL& scope); |
| 52 void DispatchSyncEventToWorkerOnIOThread( |
| 53 scoped_refptr<ServiceWorkerContextWrapper> context, |
| 54 const GURL& scope); |
| 52 | 55 |
| 53 private: | 56 private: |
| 54 friend class base::RefCountedThreadSafe<OperationProxy>; | 57 friend class base::RefCountedThreadSafe<OperationProxy>; |
| 55 ~OperationProxy() {} | 58 ~OperationProxy() {} |
| 56 void OnHaveRegistrations( | 59 void OnHaveRegistrations( |
| 57 const base::FilePath& context_path, | 60 const base::FilePath& context_path, |
| 58 const std::vector<ServiceWorkerRegistrationInfo>& registrations); | 61 const std::vector<ServiceWorkerRegistrationInfo>& registrations); |
| 59 | 62 |
| 60 void OperationComplete(ServiceWorkerStatusCode status); | 63 void OperationComplete(ServiceWorkerStatusCode status); |
| 61 | 64 |
| 62 void StartActiveWorker( | 65 void StartActiveWorker( |
| 63 ServiceWorkerStatusCode status, | 66 ServiceWorkerStatusCode status, |
| 64 const scoped_refptr<ServiceWorkerRegistration>& registration); | 67 const scoped_refptr<ServiceWorkerRegistration>& registration); |
| 65 | 68 |
| 66 void StopActiveWorker( | 69 void StopActiveWorker( |
| 67 ServiceWorkerStatusCode status, | 70 ServiceWorkerStatusCode status, |
| 68 const scoped_refptr<ServiceWorkerRegistration>& registration); | 71 const scoped_refptr<ServiceWorkerRegistration>& registration); |
| 69 | 72 |
| 73 void DispatchSyncEventToActiveWorker( |
| 74 ServiceWorkerStatusCode status, |
| 75 const scoped_refptr<ServiceWorkerRegistration>& registration); |
| 76 |
| 70 WeakPtr<ServiceWorkerInternalsUI> internals_; | 77 WeakPtr<ServiceWorkerInternalsUI> internals_; |
| 71 scoped_ptr<ListValue> original_args_; | 78 scoped_ptr<ListValue> original_args_; |
| 72 }; | 79 }; |
| 73 | 80 |
| 74 ServiceWorkerInternalsUI::ServiceWorkerInternalsUI(WebUI* web_ui) | 81 ServiceWorkerInternalsUI::ServiceWorkerInternalsUI(WebUI* web_ui) |
| 75 : WebUIController(web_ui) { | 82 : WebUIController(web_ui) { |
| 76 WebUIDataSource* source = | 83 WebUIDataSource* source = |
| 77 WebUIDataSource::Create(kChromeUIServiceWorkerInternalsHost); | 84 WebUIDataSource::Create(kChromeUIServiceWorkerInternalsHost); |
| 78 source->SetUseJsonJSFormatV2(); | 85 source->SetUseJsonJSFormatV2(); |
| 79 source->SetJsonPath("strings.js"); | 86 source->SetJsonPath("strings.js"); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 96 base::Bind(&ServiceWorkerInternalsUI::StartWorker, | 103 base::Bind(&ServiceWorkerInternalsUI::StartWorker, |
| 97 base::Unretained(this))); | 104 base::Unretained(this))); |
| 98 web_ui->RegisterMessageCallback( | 105 web_ui->RegisterMessageCallback( |
| 99 "stop", | 106 "stop", |
| 100 base::Bind(&ServiceWorkerInternalsUI::StopWorker, | 107 base::Bind(&ServiceWorkerInternalsUI::StopWorker, |
| 101 base::Unretained(this))); | 108 base::Unretained(this))); |
| 102 web_ui->RegisterMessageCallback( | 109 web_ui->RegisterMessageCallback( |
| 103 "unregister", | 110 "unregister", |
| 104 base::Bind(&ServiceWorkerInternalsUI::Unregister, | 111 base::Bind(&ServiceWorkerInternalsUI::Unregister, |
| 105 base::Unretained(this))); | 112 base::Unretained(this))); |
| 113 web_ui->RegisterMessageCallback( |
| 114 "sync", |
| 115 base::Bind(&ServiceWorkerInternalsUI::DispatchSyncEventToWorker, |
| 116 base::Unretained(this))); |
| 106 } | 117 } |
| 107 | 118 |
| 108 ServiceWorkerInternalsUI::~ServiceWorkerInternalsUI() {} | 119 ServiceWorkerInternalsUI::~ServiceWorkerInternalsUI() {} |
| 109 | 120 |
| 110 void ServiceWorkerInternalsUI::GetAllRegistrations(const ListValue* args) { | 121 void ServiceWorkerInternalsUI::GetAllRegistrations(const ListValue* args) { |
| 111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 122 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 112 | 123 |
| 113 BrowserContext* browser_context = | 124 BrowserContext* browser_context = |
| 114 web_ui()->GetWebContents()->GetBrowserContext(); | 125 web_ui()->GetWebContents()->GetBrowserContext(); |
| 115 | 126 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 BrowserContext::StoragePartitionCallback cb = | 182 BrowserContext::StoragePartitionCallback cb = |
| 172 base::Bind(&FindContext, *partition_path, &result_partition, context); | 183 base::Bind(&FindContext, *partition_path, &result_partition, context); |
| 173 BrowserContext::ForEachStoragePartition(browser_context, cb); | 184 BrowserContext::ForEachStoragePartition(browser_context, cb); |
| 174 | 185 |
| 175 if (!result_partition || !(*context)) | 186 if (!result_partition || !(*context)) |
| 176 return false; | 187 return false; |
| 177 | 188 |
| 178 return true; | 189 return true; |
| 179 } | 190 } |
| 180 | 191 |
| 192 void ServiceWorkerInternalsUI::DispatchSyncEventToWorker( |
| 193 const ListValue* args) { |
| 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 195 base::FilePath partition_path; |
| 196 GURL scope; |
| 197 scoped_refptr<ServiceWorkerContextWrapper> context; |
| 198 if (!GetRegistrationInfo(args, &partition_path, &scope, &context)) |
| 199 return; |
| 200 |
| 201 scoped_ptr<ListValue> args_copy(args->DeepCopy()); |
| 202 BrowserThread::PostTask( |
| 203 BrowserThread::IO, |
| 204 FROM_HERE, |
| 205 base::Bind(&ServiceWorkerInternalsUI::OperationProxy:: |
| 206 DispatchSyncEventToWorkerOnIOThread, |
| 207 new OperationProxy(AsWeakPtr(), args_copy.Pass()), |
| 208 context, |
| 209 scope)); |
| 210 } |
| 211 |
| 181 void ServiceWorkerInternalsUI::Unregister(const ListValue* args) { | 212 void ServiceWorkerInternalsUI::Unregister(const ListValue* args) { |
| 182 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 213 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 183 base::FilePath partition_path; | 214 base::FilePath partition_path; |
| 184 GURL scope; | 215 GURL scope; |
| 185 scoped_refptr<ServiceWorkerContextWrapper> context; | 216 scoped_refptr<ServiceWorkerContextWrapper> context; |
| 186 if (!GetRegistrationInfo(args, &partition_path, &scope, &context)) | 217 if (!GetRegistrationInfo(args, &partition_path, &scope, &context)) |
| 187 return; | 218 return; |
| 188 | 219 |
| 189 scoped_ptr<ListValue> args_copy(args->DeepCopy()); | 220 scoped_ptr<ListValue> args_copy(args->DeepCopy()); |
| 190 BrowserThread::PostTask( | 221 BrowserThread::PostTask( |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 const GURL& scope) { | 305 const GURL& scope) { |
| 275 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 306 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 276 // TODO(alecflett): Add support for starting/stopping workers for | 307 // TODO(alecflett): Add support for starting/stopping workers for |
| 277 // pending versions too. | 308 // pending versions too. |
| 278 context->context()->storage()->FindRegistrationForPattern( | 309 context->context()->storage()->FindRegistrationForPattern( |
| 279 scope, | 310 scope, |
| 280 base::Bind(&ServiceWorkerInternalsUI::OperationProxy::StopActiveWorker, | 311 base::Bind(&ServiceWorkerInternalsUI::OperationProxy::StopActiveWorker, |
| 281 this)); | 312 this)); |
| 282 } | 313 } |
| 283 | 314 |
| 315 void |
| 316 ServiceWorkerInternalsUI::OperationProxy::DispatchSyncEventToWorkerOnIOThread( |
| 317 scoped_refptr<ServiceWorkerContextWrapper> context, |
| 318 const GURL& scope) { |
| 319 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 320 context->context()->storage()->FindRegistrationForPattern( |
| 321 scope, |
| 322 base::Bind(&ServiceWorkerInternalsUI::OperationProxy:: |
| 323 DispatchSyncEventToActiveWorker, |
| 324 this)); |
| 325 } |
| 326 |
| 284 namespace { | 327 namespace { |
| 285 void UpdateVersionInfo(const ServiceWorkerVersionInfo& version, | 328 void UpdateVersionInfo(const ServiceWorkerVersionInfo& version, |
| 286 DictionaryValue* info) { | 329 DictionaryValue* info) { |
| 287 switch (version.running_status) { | 330 switch (version.running_status) { |
| 288 case ServiceWorkerVersion::STOPPED: | 331 case ServiceWorkerVersion::STOPPED: |
| 289 info->SetString("running_status", "STOPPED"); | 332 info->SetString("running_status", "STOPPED"); |
| 290 break; | 333 break; |
| 291 case ServiceWorkerVersion::STARTING: | 334 case ServiceWorkerVersion::STARTING: |
| 292 info->SetString("running_status", "STARTING"); | 335 info->SetString("running_status", "STARTING"); |
| 293 break; | 336 break; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 456 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 414 if (status == SERVICE_WORKER_OK) { | 457 if (status == SERVICE_WORKER_OK) { |
| 415 registration->active_version()->StopWorker(base::Bind( | 458 registration->active_version()->StopWorker(base::Bind( |
| 416 &ServiceWorkerInternalsUI::OperationProxy::OperationComplete, this)); | 459 &ServiceWorkerInternalsUI::OperationProxy::OperationComplete, this)); |
| 417 return; | 460 return; |
| 418 } | 461 } |
| 419 | 462 |
| 420 OperationComplete(status); | 463 OperationComplete(status); |
| 421 } | 464 } |
| 422 | 465 |
| 466 void ServiceWorkerInternalsUI::OperationProxy::DispatchSyncEventToActiveWorker( |
| 467 ServiceWorkerStatusCode status, |
| 468 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| 469 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 470 if (status == SERVICE_WORKER_OK && registration->active_version() && |
| 471 registration->active_version()->status() == |
| 472 ServiceWorkerVersion::ACTIVE) { |
| 473 registration->active_version()->DispatchSyncEvent(base::Bind( |
| 474 &ServiceWorkerInternalsUI::OperationProxy::OperationComplete, this)); |
| 475 return; |
| 476 } |
| 477 |
| 478 OperationComplete(SERVICE_WORKER_ERROR_FAILED); |
| 479 } |
| 480 |
| 423 } // namespace content | 481 } // namespace content |
| OLD | NEW |