// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/renderer/resource_timing_info_conversions.h"

#include <string>
#include <vector>

#include "content/common/resource_timing_info.h"
#include "third_party/blink/public/platform/web_resource_timing_info.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/platform/web_vector.h"

namespace content {

ResourceTimingInfo WebResourceTimingInfoToResourceTimingInfo(
    const blink::WebResourceTimingInfo& info) {
  // TODO(dcheng): This is sad. Move this to Mojo.
  ResourceTimingInfo resource_timing;
  resource_timing.name = info.name.Utf8();
  resource_timing.start_time = info.start_time;

  resource_timing.alpn_negotiated_protocol =
      info.alpn_negotiated_protocol.Utf8();
  resource_timing.connection_info = info.connection_info.Utf8();

  if (!info.timing.IsNull()) {
    resource_timing.timing.emplace();
    resource_timing.timing->request_time = info.timing.RequestTime();
    resource_timing.timing->proxy_start = info.timing.ProxyStart();
    resource_timing.timing->proxy_end = info.timing.ProxyEnd();
    resource_timing.timing->dns_start = info.timing.DnsStart();
    resource_timing.timing->dns_end = info.timing.DnsEnd();
    resource_timing.timing->connect_start = info.timing.ConnectStart();
    resource_timing.timing->connect_end = info.timing.ConnectEnd();
    resource_timing.timing->worker_start = info.timing.WorkerStart();
    resource_timing.timing->worker_ready = info.timing.WorkerReady();
    resource_timing.timing->send_start = info.timing.SendStart();
    resource_timing.timing->send_end = info.timing.SendEnd();
    resource_timing.timing->receive_headers_start =
        info.timing.ReceiveHeadersStart();
    resource_timing.timing->receive_headers_end =
        info.timing.ReceiveHeadersEnd();
    resource_timing.timing->ssl_start = info.timing.SslStart();
    resource_timing.timing->ssl_end = info.timing.SslEnd();
    resource_timing.timing->push_start = info.timing.PushStart();
    resource_timing.timing->push_end = info.timing.PushEnd();
  }

  resource_timing.last_redirect_end_time = info.last_redirect_end_time;
  resource_timing.finish_time = info.finish_time;

  resource_timing.transfer_size = info.transfer_size;
  resource_timing.encoded_body_size = info.encoded_body_size;
  resource_timing.decoded_body_size = info.decoded_body_size;

  resource_timing.did_reuse_connection = info.did_reuse_connection;

  resource_timing.allow_timing_details = info.allow_timing_details;
  resource_timing.allow_redirect_details = info.allow_redirect_details;

  resource_timing.allow_negative_values = info.allow_negative_values;

  for (const auto& entry : info.server_timing) {
    resource_timing.server_timing.emplace_back();
    auto& new_entry = resource_timing.server_timing.back();
    new_entry.name = entry.name.Utf8();
    new_entry.duration = entry.duration;
    new_entry.description = entry.description.Utf8();
  }

  return resource_timing;
}

blink::WebResourceTimingInfo ResourceTimingInfoToWebResourceTimingInfo(
    const ResourceTimingInfo& resource_timing) {
  // TODO(dcheng): This is sad. Move this to Mojo.
  blink::WebResourceTimingInfo info;
  info.name = blink::WebString::FromUTF8(resource_timing.name);
  info.start_time = resource_timing.start_time;

  info.alpn_negotiated_protocol =
      blink::WebString::FromUTF8(resource_timing.alpn_negotiated_protocol);
  info.connection_info =
      blink::WebString::FromUTF8(resource_timing.connection_info);

  if (resource_timing.timing) {
    info.timing.Initialize();
    info.timing.SetRequestTime(resource_timing.timing->request_time);
    info.timing.SetProxyStart(resource_timing.timing->proxy_start);
    info.timing.SetProxyEnd(resource_timing.timing->proxy_end);
    info.timing.SetDNSStart(resource_timing.timing->dns_start);
    info.timing.SetDNSEnd(resource_timing.timing->dns_end);
    info.timing.SetConnectStart(resource_timing.timing->connect_start);
    info.timing.SetConnectEnd(resource_timing.timing->connect_end);
    info.timing.SetWorkerStart(resource_timing.timing->worker_start);
    info.timing.SetWorkerReady(resource_timing.timing->worker_ready);
    info.timing.SetSendStart(resource_timing.timing->send_start);
    info.timing.SetSendEnd(resource_timing.timing->send_end);
    info.timing.SetReceiveHeadersStart(
        resource_timing.timing->receive_headers_start);
    info.timing.SetReceiveHeadersEnd(
        resource_timing.timing->receive_headers_end);
    info.timing.SetSSLStart(resource_timing.timing->ssl_start);
    info.timing.SetSSLEnd(resource_timing.timing->ssl_end);
    info.timing.SetPushStart(resource_timing.timing->push_start);
    info.timing.SetPushEnd(resource_timing.timing->push_end);
  }

  info.last_redirect_end_time = resource_timing.last_redirect_end_time;
  info.finish_time = resource_timing.finish_time;

  info.transfer_size = resource_timing.transfer_size;
  info.encoded_body_size = resource_timing.encoded_body_size;
  info.decoded_body_size = resource_timing.decoded_body_size;

  info.did_reuse_connection = resource_timing.did_reuse_connection;

  info.allow_timing_details = resource_timing.allow_timing_details;
  info.allow_redirect_details = resource_timing.allow_redirect_details;

  info.allow_negative_values = resource_timing.allow_negative_values;

  info.server_timing.reserve(resource_timing.server_timing.size());
  for (const auto& server_timing : resource_timing.server_timing) {
    info.server_timing.emplace_back(
        blink::WebString::FromUTF8(server_timing.name), server_timing.duration,
        blink::WebString::FromUTF8(server_timing.description));
  }

  return info;
}

}  // namespace content
