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 #include "content/browser/service_worker/service_worker_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
370 embedded_worker()->worker_devtools_agent_route_id()); | 370 embedded_worker()->worker_devtools_agent_route_id()); |
371 } | 371 } |
372 | 372 |
373 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { | 373 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { |
374 StartWorker(false, callback); | 374 StartWorker(false, callback); |
375 } | 375 } |
376 | 376 |
377 void ServiceWorkerVersion::StartWorker( | 377 void ServiceWorkerVersion::StartWorker( |
378 bool pause_after_download, | 378 bool pause_after_download, |
379 const StatusCallback& callback) { | 379 const StatusCallback& callback) { |
380 if (is_doomed()) { | 380 if (!context_) { |
381 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | 381 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
382 return; | 382 return; |
383 } | 383 } |
384 | |
385 // Ensure live registration during starting worker so that the worker can get | |
386 // associated with registration on SWDispatcherHost::OnSetHostedVersionId(). | |
387 context_->storage()->FindRegistrationForId( | |
388 registration_id_, | |
389 scope_.GetOrigin(), | |
390 base::Bind(&ServiceWorkerVersion::DidEnsureLiveRegistration, | |
391 weak_factory_.GetWeakPtr(), | |
392 pause_after_download, | |
393 callback)); | |
394 } | |
395 | |
396 void ServiceWorkerVersion::DidEnsureLiveRegistration( | |
397 bool pause_after_download, | |
398 const StatusCallback& callback, | |
399 ServiceWorkerStatusCode status, | |
400 const scoped_refptr<ServiceWorkerRegistration>& protect) { | |
401 if (status != SERVICE_WORKER_OK || is_doomed()) { | |
402 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | |
403 return; | |
404 } | |
405 | |
384 switch (running_status()) { | 406 switch (running_status()) { |
385 case RUNNING: | 407 case RUNNING: |
386 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 408 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
387 return; | 409 return; |
388 case STOPPING: | 410 case STOPPING: |
389 case STOPPED: | 411 case STOPPED: |
390 case STARTING: | 412 case STARTING: |
391 if (!timeout_timer_.IsRunning()) | 413 if (!timeout_timer_.IsRunning()) |
392 StartTimeoutTimer(); | 414 StartTimeoutTimer(); |
393 start_callbacks_.push_back(callback); | 415 start_callbacks_.push_back(callback); |
394 if (running_status() == STOPPED) { | 416 if (running_status() == STOPPED) { |
395 DCHECK(!cache_listener_.get()); | 417 DCHECK(!cache_listener_.get()); |
396 cache_listener_.reset(new ServiceWorkerCacheListener(this, context_)); | 418 cache_listener_.reset(new ServiceWorkerCacheListener(this, context_)); |
397 embedded_worker_->Start( | 419 embedded_worker_->Start( |
398 version_id_, scope_, script_url_, pause_after_download, | 420 version_id_, scope_, script_url_, pause_after_download, |
399 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, | 421 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
400 weak_factory_.GetWeakPtr())); | 422 weak_factory_.GetWeakPtr(), |
423 protect)); | |
kinuko
2015/03/11 14:41:56
I wonder just keeping this 'protect' in start_call
michaeln
2015/03/11 20:18:56
That sounds pretty good provided it can be made to
nhiroki
2015/03/12 05:27:11
Good idea. Modified the CL in this way.
| |
401 } | 424 } |
402 return; | 425 return; |
403 } | 426 } |
404 } | 427 } |
405 | 428 |
406 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { | 429 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { |
407 if (running_status() == STOPPED) { | 430 if (running_status() == STOPPED) { |
408 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 431 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
409 return; | 432 return; |
410 } | 433 } |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
874 streaming_url_request_jobs_.clear(); | 897 streaming_url_request_jobs_.clear(); |
875 | 898 |
876 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 899 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
877 | 900 |
878 // There should be no more communication from/to a stopped worker. Deleting | 901 // There should be no more communication from/to a stopped worker. Deleting |
879 // the listener prevents any pending completion callbacks from causing | 902 // the listener prevents any pending completion callbacks from causing |
880 // messages to be sent to the stopped worker. | 903 // messages to be sent to the stopped worker. |
881 cache_listener_.reset(); | 904 cache_listener_.reset(); |
882 | 905 |
883 // Restart worker if we have any start callbacks and the worker isn't doomed. | 906 // Restart worker if we have any start callbacks and the worker isn't doomed. |
884 if (should_restart) { | 907 if (should_restart) |
885 if (embedded_worker_->devtools_attached()) | 908 StartWorker(base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
886 ClearTick(&start_time_); | |
887 else | |
888 RestartTick(&start_time_); | |
889 cache_listener_.reset(new ServiceWorkerCacheListener(this, context_)); | |
890 embedded_worker_->Start( | |
891 version_id_, scope_, script_url_, false /* pause_after_download */, | |
892 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, | |
893 weak_factory_.GetWeakPtr())); | |
nhiroki
2015/03/11 09:08:08
kinuko@ or falken@: I'm not really sure whether th
kinuko
2015/03/11 14:41:57
It's minor and is probably ok, but it looks just c
nhiroki
2015/03/12 05:27:11
Reverted this because it's no longer necessary to
| |
894 } | |
895 } | 909 } |
896 | 910 |
897 void ServiceWorkerVersion::OnReportException( | 911 void ServiceWorkerVersion::OnReportException( |
898 const base::string16& error_message, | 912 const base::string16& error_message, |
899 int line_number, | 913 int line_number, |
900 int column_number, | 914 int column_number, |
901 const GURL& source_url) { | 915 const GURL& source_url) { |
902 FOR_EACH_OBSERVER( | 916 FOR_EACH_OBSERVER( |
903 Listener, | 917 Listener, |
904 listeners_, | 918 listeners_, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
956 OnSkipWaiting) | 970 OnSkipWaiting) |
957 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClaimClients, | 971 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClaimClients, |
958 OnClaimClients) | 972 OnClaimClients) |
959 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_Pong, OnPongFromWorker) | 973 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_Pong, OnPongFromWorker) |
960 IPC_MESSAGE_UNHANDLED(handled = false) | 974 IPC_MESSAGE_UNHANDLED(handled = false) |
961 IPC_END_MESSAGE_MAP() | 975 IPC_END_MESSAGE_MAP() |
962 return handled; | 976 return handled; |
963 } | 977 } |
964 | 978 |
965 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( | 979 void ServiceWorkerVersion::OnStartSentAndScriptEvaluated( |
980 scoped_refptr<ServiceWorkerRegistration> protect, | |
966 ServiceWorkerStatusCode status) { | 981 ServiceWorkerStatusCode status) { |
967 if (status != SERVICE_WORKER_OK) | 982 if (status != SERVICE_WORKER_OK) |
968 RunCallbacks(this, &start_callbacks_, status); | 983 RunCallbacks(this, &start_callbacks_, status); |
969 } | 984 } |
970 | 985 |
971 void ServiceWorkerVersion::DispatchInstallEventAfterStartWorker( | 986 void ServiceWorkerVersion::DispatchInstallEventAfterStartWorker( |
972 const StatusCallback& callback) { | 987 const StatusCallback& callback) { |
973 DCHECK_EQ(RUNNING, running_status()) | 988 DCHECK_EQ(RUNNING, running_status()) |
974 << "Worker stopped too soon after it was started."; | 989 << "Worker stopped too soon after it was started."; |
975 | 990 |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1615 int request_id) { | 1630 int request_id) { |
1616 callbacks->Remove(request_id); | 1631 callbacks->Remove(request_id); |
1617 if (is_doomed_) { | 1632 if (is_doomed_) { |
1618 // The stop should be already scheduled, but try to stop immediately, in | 1633 // The stop should be already scheduled, but try to stop immediately, in |
1619 // order to release worker resources soon. | 1634 // order to release worker resources soon. |
1620 StopWorkerIfIdle(); | 1635 StopWorkerIfIdle(); |
1621 } | 1636 } |
1622 } | 1637 } |
1623 | 1638 |
1624 } // namespace content | 1639 } // namespace content |
OLD | NEW |