// 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/WebKit/public/platform/WebResourceTimingInfo.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebVector.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_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.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
