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

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 1795863006: service worker: Attribute purpose to start worker attempts for UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: patch for landing? Created 4 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
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 <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
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
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(ServiceWorkerMetrics::EventType purpose,
369 const StatusCallback& callback) {
365 DCHECK_CURRENTLY_ON(BrowserThread::IO); 370 DCHECK_CURRENTLY_ON(BrowserThread::IO);
366 if (!context_) { 371 if (!context_) {
367 RecordStartWorkerResult(SERVICE_WORKER_ERROR_ABORT); 372 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_ABORT);
368 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); 373 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_ABORT));
369 return; 374 return;
370 } 375 }
371 if (is_redundant()) { 376 if (is_redundant()) {
372 RecordStartWorkerResult(SERVICE_WORKER_ERROR_REDUNDANT); 377 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_REDUNDANT);
373 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT)); 378 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT));
374 return; 379 return;
375 } 380 }
376 if (IsDisabled()) { 381 if (IsDisabled()) {
377 RecordStartWorkerResult(SERVICE_WORKER_ERROR_DISABLED_WORKER); 382 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_DISABLED_WORKER);
378 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISABLED_WORKER)); 383 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISABLED_WORKER));
379 384
380 // Show a message in DevTools for developers. 385 // Show a message in DevTools for developers.
381 ReportError(SERVICE_WORKER_ERROR_DISABLED_WORKER, 386 ReportError(SERVICE_WORKER_ERROR_DISABLED_WORKER,
382 "The service worker is disabled because its start failure " 387 "The service worker is disabled because its start failure "
383 "count is too high."); 388 "count is too high.");
384 return; 389 return;
385 } 390 }
386 391
387 // Check that the worker is allowed to start on the given scope. Since this 392 // 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. 393 // worker might not be used for a specific frame/process, use -1.
389 // resource_context() can return null in unit tests. 394 // resource_context() can return null in unit tests.
390 if (context_->wrapper()->resource_context() && 395 if (context_->wrapper()->resource_context() &&
391 !GetContentClient()->browser()->AllowServiceWorker( 396 !GetContentClient()->browser()->AllowServiceWorker(
392 scope_, scope_, context_->wrapper()->resource_context(), -1, -1)) { 397 scope_, scope_, context_->wrapper()->resource_context(), -1, -1)) {
393 RecordStartWorkerResult(SERVICE_WORKER_ERROR_DISALLOWED); 398 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_DISALLOWED);
394 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISALLOWED)); 399 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_DISALLOWED));
395 return; 400 return;
396 } 401 }
397 402
398 prestart_status_ = status_; 403 prestart_status_ = status_;
399 404
400 // Ensure the live registration during starting worker so that the worker can 405 // Ensure the live registration during starting worker so that the worker can
401 // get associated with it in SWDispatcherHost::OnSetHostedVersionId(). 406 // get associated with it in SWDispatcherHost::OnSetHostedVersionId().
402 context_->storage()->FindRegistrationForId( 407 context_->storage()->FindRegistrationForId(
403 registration_id_, 408 registration_id_, scope_.GetOrigin(),
404 scope_.GetOrigin(),
405 base::Bind(&ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker, 409 base::Bind(&ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker,
406 weak_factory_.GetWeakPtr(), 410 weak_factory_.GetWeakPtr(), purpose, callback));
407 callback));
408 } 411 }
409 412
410 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { 413 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) {
411 if (running_status() == STOPPED) { 414 if (running_status() == STOPPED) {
412 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 415 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
413 return; 416 return;
414 } 417 }
415 if (stop_callbacks_.empty()) { 418 if (stop_callbacks_.empty()) {
416 ServiceWorkerStatusCode status = embedded_worker_->Stop(); 419 ServiceWorkerStatusCode status = embedded_worker_->Stop();
417 if (status != SERVICE_WORKER_OK) { 420 if (status != SERVICE_WORKER_OK) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 custom_requests_.Remove(request_id); 510 custom_requests_.Remove(request_id);
508 if (is_redundant()) { 511 if (is_redundant()) {
509 // The stop should be already scheduled, but try to stop immediately, in 512 // The stop should be already scheduled, but try to stop immediately, in
510 // order to release worker resources soon. 513 // order to release worker resources soon.
511 StopWorkerIfIdle(); 514 StopWorkerIfIdle();
512 } 515 }
513 return true; 516 return true;
514 } 517 }
515 518
516 void ServiceWorkerVersion::RunAfterStartWorker( 519 void ServiceWorkerVersion::RunAfterStartWorker(
520 ServiceWorkerMetrics::EventType purpose,
517 const base::Closure& task, 521 const base::Closure& task,
518 const StatusCallback& error_callback) { 522 const StatusCallback& error_callback) {
519 if (running_status() == RUNNING) { 523 if (running_status() == RUNNING) {
520 DCHECK(start_callbacks_.empty()); 524 DCHECK(start_callbacks_.empty());
521 task.Run(); 525 task.Run();
522 return; 526 return;
523 } 527 }
524 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), 528 StartWorker(purpose,
529 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(),
525 error_callback, task)); 530 error_callback, task));
526 } 531 }
527 532
528 void ServiceWorkerVersion::DispatchMessageEvent( 533 void ServiceWorkerVersion::DispatchMessageEvent(
529 const base::string16& message, 534 const base::string16& message,
530 const std::vector<TransferredMessagePort>& sent_message_ports, 535 const std::vector<TransferredMessagePort>& sent_message_ports,
531 const StatusCallback& callback) { 536 const StatusCallback& callback) {
532 for (const TransferredMessagePort& port : sent_message_ports) { 537 for (const TransferredMessagePort& port : sent_message_ports) {
533 MessagePortService::GetInstance()->HoldMessages(port.id); 538 MessagePortService::GetInstance()->HoldMessages(port.id);
534 } 539 }
535 540
536 DispatchMessageEventInternal(message, sent_message_ports, callback); 541 DispatchMessageEventInternal(message, sent_message_ports, callback);
537 } 542 }
538 543
539 void ServiceWorkerVersion::DispatchMessageEventInternal( 544 void ServiceWorkerVersion::DispatchMessageEventInternal(
540 const base::string16& message, 545 const base::string16& message,
541 const std::vector<TransferredMessagePort>& sent_message_ports, 546 const std::vector<TransferredMessagePort>& sent_message_ports,
542 const StatusCallback& callback) { 547 const StatusCallback& callback) {
543 OnBeginEvent(); 548 OnBeginEvent();
544 if (running_status() != RUNNING) { 549 if (running_status() != RUNNING) {
545 // Schedule calling this method after starting the worker. 550 // Schedule calling this method after starting the worker.
546 StartWorker(base::Bind( 551 StartWorker(ServiceWorkerMetrics::EventType::MESSAGE,
547 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), 552 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(),
548 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), 553 base::Bind(&RunErrorMessageCallback,
549 base::Bind(&self::DispatchMessageEventInternal, 554 sent_message_ports, callback),
550 weak_factory_.GetWeakPtr(), message, sent_message_ports, 555 base::Bind(&self::DispatchMessageEventInternal,
551 callback))); 556 weak_factory_.GetWeakPtr(), message,
557 sent_message_ports, callback)));
552 return; 558 return;
553 } 559 }
554 560
555 // TODO(kinuko): Cleanup this (and corresponding unit test) when message 561 // TODO(kinuko): Cleanup this (and corresponding unit test) when message
556 // event becomes extendable, round-trip event. (crbug.com/498596) 562 // event becomes extendable, round-trip event. (crbug.com/498596)
557 RestartTick(&idle_time_); 563 RestartTick(&idle_time_);
558 564
559 MessagePortMessageFilter* filter = 565 MessagePortMessageFilter* filter =
560 embedded_worker_->message_port_message_filter(); 566 embedded_worker_->message_port_message_filter();
561 std::vector<int> new_routing_ids; 567 std::vector<int> new_routing_ids;
562 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); 568 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids);
563 ServiceWorkerStatusCode status = 569 ServiceWorkerStatusCode status =
564 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( 570 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker(
565 message, sent_message_ports, new_routing_ids)); 571 message, sent_message_ports, new_routing_ids));
566 RunSoon(base::Bind(callback, status)); 572 RunSoon(base::Bind(callback, status));
567 } 573 }
568 574
569 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( 575 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent(
570 const NavigatorConnectClient& client, 576 const NavigatorConnectClient& client,
571 const base::string16& message, 577 const base::string16& message,
572 const std::vector<TransferredMessagePort>& sent_message_ports, 578 const std::vector<TransferredMessagePort>& sent_message_ports,
573 const StatusCallback& callback) { 579 const StatusCallback& callback) {
574 OnBeginEvent(); 580 OnBeginEvent();
575 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to 581 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to
576 // have already put all the sent message ports on hold. So no need to do that 582 // have already put all the sent message ports on hold. So no need to do that
577 // here again. 583 // here again.
578 584
579 if (running_status() != RUNNING) { 585 if (running_status() != RUNNING) {
580 // Schedule calling this method after starting the worker. 586 // Schedule calling this method after starting the worker.
581 StartWorker(base::Bind( 587 StartWorker(ServiceWorkerMetrics::EventType::MESSAGE,
582 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), 588 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(),
583 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), 589 base::Bind(&RunErrorMessageCallback,
584 base::Bind(&self::DispatchCrossOriginMessageEvent, 590 sent_message_ports, callback),
585 weak_factory_.GetWeakPtr(), client, message, 591 base::Bind(&self::DispatchCrossOriginMessageEvent,
586 sent_message_ports, callback))); 592 weak_factory_.GetWeakPtr(), client,
593 message, sent_message_ports, callback)));
587 return; 594 return;
588 } 595 }
589 596
590 MessagePortMessageFilter* filter = 597 MessagePortMessageFilter* filter =
591 embedded_worker_->message_port_message_filter(); 598 embedded_worker_->message_port_message_filter();
592 std::vector<int> new_routing_ids; 599 std::vector<int> new_routing_ids;
593 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); 600 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids);
594 ServiceWorkerStatusCode status = 601 ServiceWorkerStatusCode status =
595 embedded_worker_->SendMessage(ServiceWorkerMsg_CrossOriginMessageToWorker( 602 embedded_worker_->SendMessage(ServiceWorkerMsg_CrossOriginMessageToWorker(
596 client, message, sent_message_ports, new_routing_ids)); 603 client, message, sent_message_ports, new_routing_ids));
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
1269 base::Bind(&KillEmbeddedWorkerProcess, embedded_worker_->process_id(), 1276 base::Bind(&KillEmbeddedWorkerProcess, embedded_worker_->process_id(),
1270 RESULT_CODE_KILLED_BAD_MESSAGE)); 1277 RESULT_CODE_KILLED_BAD_MESSAGE));
1271 return; 1278 return;
1272 } 1279 }
1273 } 1280 }
1274 set_foreign_fetch_scopes(sub_scopes); 1281 set_foreign_fetch_scopes(sub_scopes);
1275 set_foreign_fetch_origins(origins); 1282 set_foreign_fetch_origins(origins);
1276 } 1283 }
1277 1284
1278 void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker( 1285 void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker(
1286 ServiceWorkerMetrics::EventType purpose,
1279 const StatusCallback& callback, 1287 const StatusCallback& callback,
1280 ServiceWorkerStatusCode status, 1288 ServiceWorkerStatusCode status,
1281 const scoped_refptr<ServiceWorkerRegistration>& registration) { 1289 const scoped_refptr<ServiceWorkerRegistration>& registration) {
1282 scoped_refptr<ServiceWorkerRegistration> protect = registration; 1290 scoped_refptr<ServiceWorkerRegistration> protect = registration;
1283 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) { 1291 if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
1284 // When the registration has already been deleted from the storage but its 1292 // When the registration has already been deleted from the storage but its
1285 // active worker is still controlling clients, the event should be 1293 // active worker is still controlling clients, the event should be
1286 // dispatched on the worker. However, the storage cannot find the 1294 // dispatched on the worker. However, the storage cannot find the
1287 // registration. To handle the case, check the live registrations here. 1295 // registration. To handle the case, check the live registrations here.
1288 protect = context_->GetLiveRegistration(registration_id_); 1296 protect = context_->GetLiveRegistration(registration_id_);
1289 if (protect) { 1297 if (protect) {
1290 DCHECK(protect->is_deleted()); 1298 DCHECK(protect->is_deleted());
1291 status = SERVICE_WORKER_OK; 1299 status = SERVICE_WORKER_OK;
1292 } 1300 }
1293 } 1301 }
1294 if (status != SERVICE_WORKER_OK) { 1302 if (status != SERVICE_WORKER_OK) {
1295 RecordStartWorkerResult(status); 1303 RecordStartWorkerResult(purpose, status);
1296 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); 1304 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
1297 return; 1305 return;
1298 } 1306 }
1299 if (is_redundant()) { 1307 if (is_redundant()) {
1300 RecordStartWorkerResult(SERVICE_WORKER_ERROR_REDUNDANT); 1308 RecordStartWorkerResult(purpose, SERVICE_WORKER_ERROR_REDUNDANT);
1301 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT)); 1309 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_REDUNDANT));
1302 return; 1310 return;
1303 } 1311 }
1304 1312
1305 MarkIfStale(); 1313 MarkIfStale();
1306 1314
1307 switch (running_status()) { 1315 switch (running_status()) {
1308 case RUNNING: 1316 case RUNNING:
1309 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); 1317 RunSoon(base::Bind(callback, SERVICE_WORKER_OK));
1310 return; 1318 return;
1311 case STARTING: 1319 case STARTING:
1312 DCHECK(!start_callbacks_.empty()); 1320 DCHECK(!start_callbacks_.empty());
1313 break; 1321 break;
1314 case STOPPING: 1322 case STOPPING:
1315 case STOPPED: 1323 case STOPPED:
1316 if (start_callbacks_.empty()) { 1324 if (start_callbacks_.empty()) {
1317 start_callbacks_.push_back( 1325 start_callbacks_.push_back(
1318 base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult, 1326 base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult,
1319 weak_factory_.GetWeakPtr())); 1327 weak_factory_.GetWeakPtr(), purpose));
1320 } 1328 }
1321 break; 1329 break;
1322 } 1330 }
1323 1331
1324 // Keep the live registration while starting the worker. 1332 // Keep the live registration while starting the worker.
1325 start_callbacks_.push_back( 1333 start_callbacks_.push_back(
1326 base::Bind(&RunStartWorkerCallback, callback, protect)); 1334 base::Bind(&RunStartWorkerCallback, callback, protect));
1327 1335
1328 if (running_status() == STOPPED) 1336 if (running_status() == STOPPED)
1329 StartWorkerInternal(); 1337 StartWorkerInternal();
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 } 1509 }
1502 1510
1503 embedded_worker_->StopIfIdle(); 1511 embedded_worker_->StopIfIdle();
1504 } 1512 }
1505 1513
1506 bool ServiceWorkerVersion::HasInflightRequests() const { 1514 bool ServiceWorkerVersion::HasInflightRequests() const {
1507 return !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); 1515 return !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty();
1508 } 1516 }
1509 1517
1510 void ServiceWorkerVersion::RecordStartWorkerResult( 1518 void ServiceWorkerVersion::RecordStartWorkerResult(
1519 ServiceWorkerMetrics::EventType purpose,
1511 ServiceWorkerStatusCode status) { 1520 ServiceWorkerStatusCode status) {
1512 base::TimeTicks start_time = start_time_; 1521 base::TimeTicks start_time = start_time_;
1513 ClearTick(&start_time_); 1522 ClearTick(&start_time_);
1514 1523
1515 if (context_) 1524 if (context_)
1516 context_->UpdateVersionFailureCount(version_id_, status); 1525 context_->UpdateVersionFailureCount(version_id_, status);
1517 1526
1518 ServiceWorkerMetrics::RecordStartWorkerStatus(status, 1527 ServiceWorkerMetrics::RecordStartWorkerStatus(status, purpose,
1519 IsInstalled(prestart_status_)); 1528 IsInstalled(prestart_status_));
1520 1529
1521 if (status == SERVICE_WORKER_OK && !start_time.is_null() && 1530 if (status == SERVICE_WORKER_OK && !start_time.is_null() &&
1522 !skip_recording_startup_time_) { 1531 !skip_recording_startup_time_) {
1523 ServiceWorkerMetrics::RecordStartWorkerTime(GetTickDuration(start_time), 1532 ServiceWorkerMetrics::RecordStartWorkerTime(GetTickDuration(start_time),
1524 IsInstalled(prestart_status_)); 1533 IsInstalled(prestart_status_));
1525 } 1534 }
1526 1535
1527 if (status != SERVICE_WORKER_ERROR_TIMEOUT) 1536 if (status != SERVICE_WORKER_ERROR_TIMEOUT)
1528 return; 1537 return;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1693 void ServiceWorkerVersion::OnBeginEvent() { 1702 void ServiceWorkerVersion::OnBeginEvent() {
1694 if (should_exclude_from_uma_ || running_status() != RUNNING || 1703 if (should_exclude_from_uma_ || running_status() != RUNNING ||
1695 idle_time_.is_null()) { 1704 idle_time_.is_null()) {
1696 return; 1705 return;
1697 } 1706 }
1698 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - 1707 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() -
1699 idle_time_); 1708 idle_time_);
1700 } 1709 }
1701 1710
1702 } // namespace content 1711 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698