447static int currentTimeMinusRequestTime(double requestTime)
448{
449 return static_cast<int>((monotonicallyIncreasingTime() - requestTime) * 1000.0);
450}
451
452#if ENABLE(WEB_TIMING)
453static void wroteBodyCallback(SoupMessage *, gpointer data)
454{
455 RefPtr<ResourceHandle> handle = static_cast<ResourceHandle*>(data);
456 if (!handle)
457 return;
458
459 ResourceHandleInternal* d = handle->getInternal();
460 if (!d->m_response.resourceLoadTiming())
461 return;
462
463 d->m_response.resourceLoadTiming()->sendEnd = currentTimeMinusRequestTime(d->m_response.resourceLoadTiming()->requestTime);
464}
465
466static void requestStartedCallback(SoupSession *, SoupMessage *soupMessage, SoupSocket *, gpointer data)
467{
468 RefPtr<ResourceHandle> handle = static_cast<ResourceHandle*>(data);
469 if (!handle)
470 return;
471
472 ResourceHandleInternal* d = handle->getInternal();
473 if (!d->m_response.resourceLoadTiming())
474 return;
475
476 if (d->m_soupMessage.get() != soupMessage)
477 return;
478
479 d->m_response.resourceLoadTiming()->sendStart = currentTimeMinusRequestTime(d->m_response.resourceLoadTiming()->requestTime);
480}
481
482static void networkEventCallback(SoupMessage *, GSocketClientEvent event, GIOStream *, gpointer data)
483{
484 ResourceHandle* handle = static_cast<ResourceHandle*>(data);
485 if (!handle)
486 return;
487 ResourceHandleInternal* d = handle->getInternal();
488 if (d->m_cancelled)
489 return;
490
491 int deltaTime = currentTimeMinusRequestTime(d->m_response.resourceLoadTiming()->requestTime);
492 switch (event) {
493 case G_SOCKET_CLIENT_RESOLVING:
494 d->m_response.resourceLoadTiming()->dnsStart = deltaTime;
495 break;
496 case G_SOCKET_CLIENT_RESOLVED:
497 d->m_response.resourceLoadTiming()->dnsEnd = deltaTime;
498 break;
499 case G_SOCKET_CLIENT_CONNECTING:
500 d->m_response.resourceLoadTiming()->connectStart = deltaTime;
501 if (d->m_response.resourceLoadTiming()->dnsStart != -1)
502 // WebCore/inspector/front-end/ResourceTimingView.js assumes that DNS time is included
503 // in connection time so must substract here the DNS delta that will be added later.
504 d->m_response.resourceLoadTiming()->connectStart -=
505 d->m_response.resourceLoadTiming()->dnsEnd - d->m_response.resourceLoadTiming()->dnsStart;
506 break;
507 case G_SOCKET_CLIENT_CONNECTED:
508 // Web Timing considers that connection time involves dns, proxy & TLS negotiation...
509 // so we better pick G_SOCKET_CLIENT_COMPLETE for connectEnd
510 break;
511 case G_SOCKET_CLIENT_PROXY_NEGOTIATING:
512 d->m_response.resourceLoadTiming()->proxyStart = deltaTime;
513 break;
514 case G_SOCKET_CLIENT_PROXY_NEGOTIATED:
515 d->m_response.resourceLoadTiming()->proxyEnd = deltaTime;
516 break;
517 case G_SOCKET_CLIENT_TLS_HANDSHAKING:
518 d->m_response.resourceLoadTiming()->sslStart = deltaTime;
519 break;
520 case G_SOCKET_CLIENT_TLS_HANDSHAKED:
521 d->m_response.resourceLoadTiming()->sslEnd = deltaTime;
522 break;
523 case G_SOCKET_CLIENT_COMPLETE:
524 d->m_response.resourceLoadTiming()->connectEnd = deltaTime;
525 break;
526 default:
527 ASSERT_NOT_REACHED();
528 break;
529 }
530}
531#endif
532