| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 | 296 |
| 297 ServiceWorkerVersion::~ServiceWorkerVersion() { | 297 ServiceWorkerVersion::~ServiceWorkerVersion() { |
| 298 in_dtor_ = true; | 298 in_dtor_ = true; |
| 299 | 299 |
| 300 // The user may have closed the tab waiting for SW to start up. | 300 // The user may have closed the tab waiting for SW to start up. |
| 301 if (GetTickDuration(start_time_) > | 301 if (GetTickDuration(start_time_) > |
| 302 base::TimeDelta::FromSeconds( | 302 base::TimeDelta::FromSeconds( |
| 303 kDestructedStartingWorkerTimeoutThresholdSeconds)) { | 303 kDestructedStartingWorkerTimeoutThresholdSeconds)) { |
| 304 DCHECK(timeout_timer_.IsRunning()); | 304 DCHECK(timeout_timer_.IsRunning()); |
| 305 DCHECK(!embedded_worker_->devtools_attached()); | 305 DCHECK(!embedded_worker_->devtools_attached()); |
| 306 RecordStartWorkerResult(SERVICE_WORKER_ERROR_TIMEOUT); | 306 |
| 307 // RecordStartWorkerResult must be in start_callbacks_. |
| 308 DCHECK(!start_callbacks_.empty()); |
| 309 RecordStartWorkerResult(ServiceWorkerMetrics::EventType::UNKNOWN, |
| 310 SERVICE_WORKER_ERROR_TIMEOUT); |
| 307 } | 311 } |
| 308 | 312 |
| 309 if (context_) | 313 if (context_) |
| 310 context_->RemoveLiveVersion(version_id_); | 314 context_->RemoveLiveVersion(version_id_); |
| 311 | 315 |
| 312 if (running_status() == STARTING || running_status() == RUNNING) | 316 if (running_status() == STARTING || running_status() == RUNNING) |
| 313 embedded_worker_->Stop(); | 317 embedded_worker_->Stop(); |
| 314 embedded_worker_->RemoveListener(this); | 318 embedded_worker_->RemoveListener(this); |
| 315 } | 319 } |
| 316 | 320 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 } | 358 } |
| 355 if (!main_script_http_info_) | 359 if (!main_script_http_info_) |
| 356 return info; | 360 return info; |
| 357 info.script_response_time = main_script_http_info_->response_time; | 361 info.script_response_time = main_script_http_info_->response_time; |
| 358 if (main_script_http_info_->headers) | 362 if (main_script_http_info_->headers) |
| 359 main_script_http_info_->headers->GetLastModifiedValue( | 363 main_script_http_info_->headers->GetLastModifiedValue( |
| 360 &info.script_last_modified); | 364 &info.script_last_modified); |
| 361 return info; | 365 return info; |
| 362 } | 366 } |
| 363 | 367 |
| 364 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { | 368 void ServiceWorkerVersion::StartWorker( |
| 369 const StatusCallback& callback, |
| 370 ServiceWorkerMetrics::EventType purpose) { |
| 365 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 371 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 366 if (!context_) { | 372 if (!context_) { |
| 367 RecordStartWorkerResult(SERVICE_WORKER_ERROR_ABORT); | 373 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_ABORT); |
| 368 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); | 374 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); |
| 369 return; | 375 return; |
| 370 } | 376 } |
| 371 if (is_redundant()) { | 377 if (is_redundant()) { |
| 372 RecordStartWorkerResult(SERVICE_WORKER_ERROR_REDUNDANT); | 378 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_REDUNDANT); |
| 373 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT)); | 379 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT)); |
| 374 return; | 380 return; |
| 375 } | 381 } |
| 376 if (IsDisabled()) { | 382 if (IsDisabled()) { |
| 377 RecordStartWorkerResult(SERVICE_WORKER_ERROR_DISABLED_WORKER); | 383 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_DISABLED_WORKER); |
| 378 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISABLED_WORKER)); | 384 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISABLED_WORKER)); |
| 379 | 385 |
| 380 // Show a message in DevTools for developers. | 386 // Show a message in DevTools for developers. |
| 381 ReportError(SERVICE_WORKER_ERROR_DISABLED_WORKER, | 387 ReportError(SERVICE_WORKER_ERROR_DISABLED_WORKER, |
| 382 "The service worker is disabled because its start failure " | 388 "The service worker is disabled because its start failure " |
| 383 "count is too high."); | 389 "count is too high."); |
| 384 return; | 390 return; |
| 385 } | 391 } |
| 386 | 392 |
| 387 // Check that the worker is allowed to start on the given scope. Since this | 393 // Check that the worker is allowed to start on the given scope. Since this |
| 388 // worker might not be used for a specific frame/process, use -1. | 394 // worker might not be used for a specific frame/process, use -1. |
| 389 // resource_context() can return null in unit tests. | 395 // resource_context() can return null in unit tests. |
| 390 if (context_->wrapper()->resource_context() && | 396 if (context_->wrapper()->resource_context() && |
| 391 !GetContentClient()->browser()->AllowServiceWorker( | 397 !GetContentClient()->browser()->AllowServiceWorker( |
| 392 scope_, scope_, context_->wrapper()->resource_context(), -1, -1)) { | 398 scope_, scope_, context_->wrapper()->resource_context(), -1, -1)) { |
| 393 RecordStartWorkerResult(SERVICE_WORKER_ERROR_DISALLOWED); | 399 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_DISALLOWED); |
| 394 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISALLOWED)); | 400 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISALLOWED)); |
| 395 return; | 401 return; |
| 396 } | 402 } |
| 397 | 403 |
| 398 prestart_status_ = status_; | 404 prestart_status_ = status_; |
| 399 | 405 |
| 400 // Ensure the live registration during starting worker so that the worker can | 406 // Ensure the live registration during starting worker so that the worker can |
| 401 // get associated with it in SWDispatcherHost::OnSetHostedVersionId(). | 407 // get associated with it in SWDispatcherHost::OnSetHostedVersionId(). |
| 402 context_->storage()->FindRegistrationForId( | 408 context_->storage()->FindRegistrationForId( |
| 403 registration_id_, | 409 registration_id_, scope_.GetOrigin(), |
| 404 scope_.GetOrigin(), | |
| 405 base::Bind(&ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker, | 410 base::Bind(&ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker, |
| 406 weak_factory_.GetWeakPtr(), | 411 weak_factory_.GetWeakPtr(), purpose, callback)); |
| 407 callback)); | |
| 408 } | 412 } |
| 409 | 413 |
| 410 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { | 414 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { |
| 411 if (running_status() == STOPPED) { | 415 if (running_status() == STOPPED) { |
| 412 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 416 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| 413 return; | 417 return; |
| 414 } | 418 } |
| 415 if (stop_callbacks_.empty()) { | 419 if (stop_callbacks_.empty()) { |
| 416 ServiceWorkerStatusCode status = embedded_worker_->Stop(); | 420 ServiceWorkerStatusCode status = embedded_worker_->Stop(); |
| 417 if (status != SERVICE_WORKER_OK) { | 421 if (status != SERVICE_WORKER_OK) { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 if (is_redundant()) { | 512 if (is_redundant()) { |
| 509 // The stop should be already scheduled, but try to stop immediately, in | 513 // The stop should be already scheduled, but try to stop immediately, in |
| 510 // order to release worker resources soon. | 514 // order to release worker resources soon. |
| 511 StopWorkerIfIdle(); | 515 StopWorkerIfIdle(); |
| 512 } | 516 } |
| 513 return true; | 517 return true; |
| 514 } | 518 } |
| 515 | 519 |
| 516 void ServiceWorkerVersion::RunAfterStartWorker( | 520 void ServiceWorkerVersion::RunAfterStartWorker( |
| 517 const base::Closure& task, | 521 const base::Closure& task, |
| 518 const StatusCallback& error_callback) { | 522 const StatusCallback& error_callback, |
| 523 ServiceWorkerMetrics::EventType purpose) { |
| 519 if (running_status() == RUNNING) { | 524 if (running_status() == RUNNING) { |
| 520 DCHECK(start_callbacks_.empty()); | 525 DCHECK(start_callbacks_.empty()); |
| 521 task.Run(); | 526 task.Run(); |
| 522 return; | 527 return; |
| 523 } | 528 } |
| 524 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 529 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 525 error_callback, task)); | 530 error_callback, task), |
| 531 purpose); |
| 526 } | 532 } |
| 527 | 533 |
| 528 void ServiceWorkerVersion::DispatchExtendableMessageEvent( | 534 void ServiceWorkerVersion::DispatchExtendableMessageEvent( |
| 529 ServiceWorkerProviderHost* sender_provider_host, | 535 ServiceWorkerProviderHost* sender_provider_host, |
| 530 const base::string16& message, | 536 const base::string16& message, |
| 531 const url::Origin& source_origin, | 537 const url::Origin& source_origin, |
| 532 const std::vector<TransferredMessagePort>& sent_message_ports, | 538 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 533 const StatusCallback& callback) { | 539 const StatusCallback& callback) { |
| 534 for (const TransferredMessagePort& port : sent_message_ports) | 540 for (const TransferredMessagePort& port : sent_message_ports) |
| 535 MessagePortService::GetInstance()->HoldMessages(port.id); | 541 MessagePortService::GetInstance()->HoldMessages(port.id); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 DispatchMessageEventInternal(message, sent_message_ports, callback); | 585 DispatchMessageEventInternal(message, sent_message_ports, callback); |
| 580 } | 586 } |
| 581 | 587 |
| 582 void ServiceWorkerVersion::DispatchMessageEventInternal( | 588 void ServiceWorkerVersion::DispatchMessageEventInternal( |
| 583 const base::string16& message, | 589 const base::string16& message, |
| 584 const std::vector<TransferredMessagePort>& sent_message_ports, | 590 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 585 const StatusCallback& callback) { | 591 const StatusCallback& callback) { |
| 586 OnBeginEvent(); | 592 OnBeginEvent(); |
| 587 if (running_status() != RUNNING) { | 593 if (running_status() != RUNNING) { |
| 588 // Schedule calling this method after starting the worker. | 594 // Schedule calling this method after starting the worker. |
| 589 StartWorker(base::Bind( | 595 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 590 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 596 base::Bind(&RunErrorMessageCallback, |
| 591 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), | 597 sent_message_ports, callback), |
| 592 base::Bind(&self::DispatchMessageEventInternal, | 598 base::Bind(&self::DispatchMessageEventInternal, |
| 593 weak_factory_.GetWeakPtr(), message, sent_message_ports, | 599 weak_factory_.GetWeakPtr(), message, |
| 594 callback))); | 600 sent_message_ports, callback)), |
| 601 ServiceWorkerMetrics::EventType::MESSAGE); |
| 595 return; | 602 return; |
| 596 } | 603 } |
| 597 | 604 |
| 598 // TODO(kinuko): Cleanup this (and corresponding unit test) when message | 605 // TODO(kinuko): Cleanup this (and corresponding unit test) when message |
| 599 // event becomes extendable, round-trip event. (crbug.com/498596) | 606 // event becomes extendable, round-trip event. (crbug.com/498596) |
| 600 RestartTick(&idle_time_); | 607 RestartTick(&idle_time_); |
| 601 | 608 |
| 602 MessagePortMessageFilter* filter = | 609 MessagePortMessageFilter* filter = |
| 603 embedded_worker_->message_port_message_filter(); | 610 embedded_worker_->message_port_message_filter(); |
| 604 std::vector<int> new_routing_ids; | 611 std::vector<int> new_routing_ids; |
| 605 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 612 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
| 606 ServiceWorkerStatusCode status = | 613 ServiceWorkerStatusCode status = |
| 607 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( | 614 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( |
| 608 message, sent_message_ports, new_routing_ids)); | 615 message, sent_message_ports, new_routing_ids)); |
| 609 RunSoon(base::Bind(callback, status)); | 616 RunSoon(base::Bind(callback, status)); |
| 610 } | 617 } |
| 611 | 618 |
| 612 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( | 619 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( |
| 613 const NavigatorConnectClient& client, | 620 const NavigatorConnectClient& client, |
| 614 const base::string16& message, | 621 const base::string16& message, |
| 615 const std::vector<TransferredMessagePort>& sent_message_ports, | 622 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 616 const StatusCallback& callback) { | 623 const StatusCallback& callback) { |
| 617 OnBeginEvent(); | 624 OnBeginEvent(); |
| 618 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to | 625 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to |
| 619 // have already put all the sent message ports on hold. So no need to do that | 626 // have already put all the sent message ports on hold. So no need to do that |
| 620 // here again. | 627 // here again. |
| 621 | 628 |
| 622 if (running_status() != RUNNING) { | 629 if (running_status() != RUNNING) { |
| 623 // Schedule calling this method after starting the worker. | 630 // Schedule calling this method after starting the worker. |
| 624 StartWorker(base::Bind( | 631 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 625 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 632 base::Bind(&RunErrorMessageCallback, |
| 626 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), | 633 sent_message_ports, callback), |
| 627 base::Bind(&self::DispatchCrossOriginMessageEvent, | 634 base::Bind(&self::DispatchCrossOriginMessageEvent, |
| 628 weak_factory_.GetWeakPtr(), client, message, | 635 weak_factory_.GetWeakPtr(), client, |
| 629 sent_message_ports, callback))); | 636 message, sent_message_ports, callback)), |
| 637 ServiceWorkerMetrics::EventType::MESSAGE); |
| 630 return; | 638 return; |
| 631 } | 639 } |
| 632 | 640 |
| 633 MessagePortMessageFilter* filter = | 641 MessagePortMessageFilter* filter = |
| 634 embedded_worker_->message_port_message_filter(); | 642 embedded_worker_->message_port_message_filter(); |
| 635 std::vector<int> new_routing_ids; | 643 std::vector<int> new_routing_ids; |
| 636 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 644 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
| 637 ServiceWorkerStatusCode status = | 645 ServiceWorkerStatusCode status = |
| 638 embedded_worker_->SendMessage(ServiceWorkerMsg_CrossOriginMessageToWorker( | 646 embedded_worker_->SendMessage(ServiceWorkerMsg_CrossOriginMessageToWorker( |
| 639 client, message, sent_message_ports, new_routing_ids)); | 647 client, message, sent_message_ports, new_routing_ids)); |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 RunErrorMessageCallback(sent_message_ports, callback, | 957 RunErrorMessageCallback(sent_message_ports, callback, |
| 950 SERVICE_WORKER_ERROR_FAILED); | 958 SERVICE_WORKER_ERROR_FAILED); |
| 951 return; | 959 return; |
| 952 } | 960 } |
| 953 RunAfterStartWorker( | 961 RunAfterStartWorker( |
| 954 base::Bind( | 962 base::Bind( |
| 955 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, | 963 &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker, |
| 956 weak_factory_.GetWeakPtr(), message, source_origin, | 964 weak_factory_.GetWeakPtr(), message, source_origin, |
| 957 sent_message_ports, ExtendableMessageEventSource(source_info), | 965 sent_message_ports, ExtendableMessageEventSource(source_info), |
| 958 callback), | 966 callback), |
| 959 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback)); | 967 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), |
| 968 ServiceWorkerMetrics::EventType::MESSAGE); |
| 960 } | 969 } |
| 961 | 970 |
| 962 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( | 971 void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker( |
| 963 const base::string16& message, | 972 const base::string16& message, |
| 964 const url::Origin& source_origin, | 973 const url::Origin& source_origin, |
| 965 const std::vector<TransferredMessagePort>& sent_message_ports, | 974 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 966 const ExtendableMessageEventSource& source, | 975 const ExtendableMessageEventSource& source, |
| 967 const StatusCallback& callback) { | 976 const StatusCallback& callback) { |
| 968 int request_id = | 977 int request_id = |
| 969 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); | 978 StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); |
| (...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1366 base::Bind(&KillEmbeddedWorkerProcess, embedded_worker_->process_id(), | 1375 base::Bind(&KillEmbeddedWorkerProcess, embedded_worker_->process_id(), |
| 1367 RESULT_CODE_KILLED_BAD_MESSAGE)); | 1376 RESULT_CODE_KILLED_BAD_MESSAGE)); |
| 1368 return; | 1377 return; |
| 1369 } | 1378 } |
| 1370 } | 1379 } |
| 1371 set_foreign_fetch_scopes(sub_scopes); | 1380 set_foreign_fetch_scopes(sub_scopes); |
| 1372 set_foreign_fetch_origins(origins); | 1381 set_foreign_fetch_origins(origins); |
| 1373 } | 1382 } |
| 1374 | 1383 |
| 1375 void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker( | 1384 void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker( |
| 1385 ServiceWorkerMetrics::EventType purpose, |
| 1376 const StatusCallback& callback, | 1386 const StatusCallback& callback, |
| 1377 ServiceWorkerStatusCode status, | 1387 ServiceWorkerStatusCode status, |
| 1378 const scoped_refptr<ServiceWorkerRegistration>& registration) { | 1388 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
| 1379 scoped_refptr<ServiceWorkerRegistration> protect = registration; | 1389 scoped_refptr<ServiceWorkerRegistration> protect = registration; |
| 1380 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { | 1390 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { |
| 1381 // When the registration has already been deleted from the storage but its | 1391 // When the registration has already been deleted from the storage but its |
| 1382 // active worker is still controlling clients, the event should be | 1392 // active worker is still controlling clients, the event should be |
| 1383 // dispatched on the worker. However, the storage cannot find the | 1393 // dispatched on the worker. However, the storage cannot find the |
| 1384 // registration. To handle the case, check the live registrations here. | 1394 // registration. To handle the case, check the live registrations here. |
| 1385 protect = context_->GetLiveRegistration(registration_id_); | 1395 protect = context_->GetLiveRegistration(registration_id_); |
| 1386 if (protect) { | 1396 if (protect) { |
| 1387 DCHECK(protect->is_deleted()); | 1397 DCHECK(protect->is_deleted()); |
| 1388 status = SERVICE_WORKER_OK; | 1398 status = SERVICE_WORKER_OK; |
| 1389 } | 1399 } |
| 1390 } | 1400 } |
| 1391 if (status != SERVICE_WORKER_OK) { | 1401 if (status != SERVICE_WORKER_OK) { |
| 1392 RecordStartWorkerResult(status); | 1402 RecordStartWorkerResult(purpose, status); |
| 1393 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | 1403 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
| 1394 return; | 1404 return; |
| 1395 } | 1405 } |
| 1396 if (is_redundant()) { | 1406 if (is_redundant()) { |
| 1397 RecordStartWorkerResult(SERVICE_WORKER_ERROR_REDUNDANT); | 1407 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_REDUNDANT); |
| 1398 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT)); | 1408 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT)); |
| 1399 return; | 1409 return; |
| 1400 } | 1410 } |
| 1401 | 1411 |
| 1402 MarkIfStale(); | 1412 MarkIfStale(); |
| 1403 | 1413 |
| 1404 switch (running_status()) { | 1414 switch (running_status()) { |
| 1405 case RUNNING: | 1415 case RUNNING: |
| 1406 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 1416 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| 1407 return; | 1417 return; |
| 1408 case STARTING: | 1418 case STARTING: |
| 1409 DCHECK(!start_callbacks_.empty()); | 1419 DCHECK(!start_callbacks_.empty()); |
| 1410 break; | 1420 break; |
| 1411 case STOPPING: | 1421 case STOPPING: |
| 1412 case STOPPED: | 1422 case STOPPED: |
| 1413 if (start_callbacks_.empty()) { | 1423 if (start_callbacks_.empty()) { |
| 1414 start_callbacks_.push_back( | 1424 start_callbacks_.push_back( |
| 1415 base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult, | 1425 base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult, |
| 1416 weak_factory_.GetWeakPtr())); | 1426 weak_factory_.GetWeakPtr(), purpose)); |
| 1417 } | 1427 } |
| 1418 break; | 1428 break; |
| 1419 } | 1429 } |
| 1420 | 1430 |
| 1421 // Keep the live registration while starting the worker. | 1431 // Keep the live registration while starting the worker. |
| 1422 start_callbacks_.push_back( | 1432 start_callbacks_.push_back( |
| 1423 base::Bind(&RunStartWorkerCallback, callback, protect)); | 1433 base::Bind(&RunStartWorkerCallback, callback, protect)); |
| 1424 | 1434 |
| 1425 if (running_status() == STOPPED) | 1435 if (running_status() == STOPPED) |
| 1426 StartWorkerInternal(); | 1436 StartWorkerInternal(); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1598 } | 1608 } |
| 1599 | 1609 |
| 1600 embedded_worker_->StopIfIdle(); | 1610 embedded_worker_->StopIfIdle(); |
| 1601 } | 1611 } |
| 1602 | 1612 |
| 1603 bool ServiceWorkerVersion::HasInflightRequests() const { | 1613 bool ServiceWorkerVersion::HasInflightRequests() const { |
| 1604 return !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); | 1614 return !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); |
| 1605 } | 1615 } |
| 1606 | 1616 |
| 1607 void ServiceWorkerVersion::RecordStartWorkerResult( | 1617 void ServiceWorkerVersion::RecordStartWorkerResult( |
| 1618 ServiceWorkerMetrics::EventType purpose, |
| 1608 ServiceWorkerStatusCode status) { | 1619 ServiceWorkerStatusCode status) { |
| 1609 base::TimeTicks start_time = start_time_; | 1620 base::TimeTicks start_time = start_time_; |
| 1610 ClearTick(&start_time_); | 1621 ClearTick(&start_time_); |
| 1611 | 1622 |
| 1612 if (context_) | 1623 if (context_) |
| 1613 context_->UpdateVersionFailureCount(version_id_, status); | 1624 context_->UpdateVersionFailureCount(version_id_, status); |
| 1614 | 1625 |
| 1615 ServiceWorkerMetrics::RecordStartWorkerStatus(status, | 1626 ServiceWorkerMetrics::RecordStartWorkerStatus(status, purpose, |
| 1616 IsInstalled(prestart_status_)); | 1627 IsInstalled(prestart_status_)); |
| 1617 | 1628 |
| 1618 if (status == SERVICE_WORKER_OK && !start_time.is_null() && | 1629 if (status == SERVICE_WORKER_OK && !start_time.is_null() && |
| 1619 !skip_recording_startup_time_) { | 1630 !skip_recording_startup_time_) { |
| 1620 ServiceWorkerMetrics::RecordStartWorkerTime(GetTickDuration(start_time), | 1631 ServiceWorkerMetrics::RecordStartWorkerTime(GetTickDuration(start_time), |
| 1621 IsInstalled(prestart_status_)); | 1632 IsInstalled(prestart_status_)); |
| 1622 } | 1633 } |
| 1623 | 1634 |
| 1624 if (status != SERVICE_WORKER_ERROR_TIMEOUT) | 1635 if (status != SERVICE_WORKER_ERROR_TIMEOUT) |
| 1625 return; | 1636 return; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1790 void ServiceWorkerVersion::OnBeginEvent() { | 1801 void ServiceWorkerVersion::OnBeginEvent() { |
| 1791 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1802 if (should_exclude_from_uma_ || running_status() != RUNNING || |
| 1792 idle_time_.is_null()) { | 1803 idle_time_.is_null()) { |
| 1793 return; | 1804 return; |
| 1794 } | 1805 } |
| 1795 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1806 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1796 idle_time_); | 1807 idle_time_); |
| 1797 } | 1808 } |
| 1798 | 1809 |
| 1799 } // namespace content | 1810 } // namespace content |
| OLD | NEW |