| Index: blimp/common/logging.cc
 | 
| diff --git a/blimp/common/logging.cc b/blimp/common/logging.cc
 | 
| deleted file mode 100644
 | 
| index 9ec2a76997331ab6b47899bfe111dcffb6e505ff..0000000000000000000000000000000000000000
 | 
| --- a/blimp/common/logging.cc
 | 
| +++ /dev/null
 | 
| @@ -1,410 +0,0 @@
 | 
| -// Copyright 2016 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 "blimp/common/logging.h"
 | 
| -
 | 
| -#include <iostream>
 | 
| -#include <string>
 | 
| -#include <utility>
 | 
| -#include <vector>
 | 
| -
 | 
| -#include "base/format_macros.h"
 | 
| -#include "base/json/string_escape.h"
 | 
| -#include "base/lazy_instance.h"
 | 
| -#include "base/memory/ptr_util.h"
 | 
| -#include "base/strings/string_number_conversions.h"
 | 
| -#include "base/strings/string_util.h"
 | 
| -#include "base/strings/stringprintf.h"
 | 
| -#include "blimp/common/create_blimp_message.h"
 | 
| -#include "blimp/common/proto/blimp_message.pb.h"
 | 
| -
 | 
| -namespace blimp {
 | 
| -namespace {
 | 
| -
 | 
| -using LogFields = std::vector<std::pair<std::string, std::string>>;
 | 
| -
 | 
| -// The AddField() suite of functions are used to convert KV pairs with
 | 
| -// arbitrarily typed values into string/string KV pairs for logging.
 | 
| -
 | 
| -// Specialization for string values, surrounding them with quotes and escaping
 | 
| -// characters as necessary.
 | 
| -void AddField(const std::string& key,
 | 
| -              const std::string& value,
 | 
| -              LogFields* output) {
 | 
| -  std::string escaped_value;
 | 
| -  base::EscapeJSONString(value, true, &escaped_value);
 | 
| -  output->push_back(std::make_pair(key, escaped_value));
 | 
| -}
 | 
| -
 | 
| -// Specialization for string literal values.
 | 
| -void AddField(const std::string& key, const char* value, LogFields* output) {
 | 
| -  output->push_back(std::make_pair(key, std::string(value)));
 | 
| -}
 | 
| -
 | 
| -// Specialization for boolean values (serialized as "true" or "false").
 | 
| -void AddField(const std::string& key, bool value, LogFields* output) {
 | 
| -  output->push_back(std::make_pair(key, (value ? "true" : "false")));
 | 
| -}
 | 
| -
 | 
| -// Specialization for SizeMessage values, serializing them as
 | 
| -// WIDTHxHEIGHT:RATIO. RATIO is rounded to two digits of precision
 | 
| -// (e.g. 2.123 => 2.12).
 | 
| -void AddField(const std::string& key,
 | 
| -              const SizeMessage& value,
 | 
| -              LogFields* output) {
 | 
| -  output->push_back(std::make_pair(
 | 
| -      key, base::StringPrintf("%" PRIu64 "x%" PRIu64 ":%.2lf", value.width(),
 | 
| -                              value.height(), value.device_pixel_ratio())));
 | 
| -}
 | 
| -
 | 
| -// Conversion function for all other types.
 | 
| -// Uses std::to_string() to serialize |value|.
 | 
| -template <typename T>
 | 
| -void AddField(const std::string& key, const T& value, LogFields* output) {
 | 
| -  output->push_back(std::make_pair(key, std::to_string(value)));
 | 
| -}
 | 
| -
 | 
| -// The following LogExtractor subclasses contain logic for extracting loggable
 | 
| -// fields from BlimpMessages.
 | 
| -
 | 
| -// Logs fields from COMPOSITOR messages.
 | 
| -void ExtractCompositorMessageFields(const BlimpMessage& message,
 | 
| -                                    LogFields* output) {
 | 
| -  AddField("render_widget_id", message.compositor().render_widget_id(), output);
 | 
| -}
 | 
| -
 | 
| -// Logs fields from IME messages.
 | 
| -void ExtractImeMessageFields(const BlimpMessage& message, LogFields* output) {
 | 
| -  AddField("render_widget_id", message.ime().render_widget_id(), output);
 | 
| -  switch (message.ime().type()) {
 | 
| -    case ImeMessage::SHOW_IME:
 | 
| -      AddField("subtype", "SHOW_IME", output);
 | 
| -      AddField("text_input_type", message.ime().text_input_type(), output);
 | 
| -      break;
 | 
| -    case ImeMessage::HIDE_IME:
 | 
| -      AddField("subtype", "HIDE_IME", output);
 | 
| -      break;
 | 
| -    case ImeMessage::SET_TEXT:
 | 
| -      AddField("subtype", "SET_TEXT", output);
 | 
| -      AddField("ime_text(length)", message.ime().ime_text().size(), output);
 | 
| -      break;
 | 
| -    case ImeMessage::UNKNOWN:
 | 
| -      AddField("subtype", "UNKNOWN", output);
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from INPUT messages.
 | 
| -void ExtractInputMessageFields(const BlimpMessage& message, LogFields* output) {
 | 
| -  AddField("render_widget_id", message.input().render_widget_id(), output);
 | 
| -  AddField("timestamp_seconds", message.input().timestamp_seconds(), output);
 | 
| -  switch (message.input().type()) {
 | 
| -    case InputMessage::Type_GestureScrollBegin:
 | 
| -      AddField("subtype", "GestureScrollBegin", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureScrollEnd:
 | 
| -      AddField("subtype", "GestureScrollEnd", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureScrollUpdate:
 | 
| -      AddField("subtype", "GestureScrollUpdate", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureFlingStart:
 | 
| -      AddField("subtype", "GestureFlingStart", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureFlingCancel:
 | 
| -      AddField("subtype", "GestureFlingCancel", output);
 | 
| -      AddField("prevent_boosting",
 | 
| -               message.input().gesture_fling_cancel().prevent_boosting(),
 | 
| -               output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureTap:
 | 
| -      AddField("subtype", "GestureTap", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GesturePinchBegin:
 | 
| -      AddField("subtype", "GesturePinchBegin", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GesturePinchEnd:
 | 
| -      AddField("subtype", "GesturePinchEnd", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GesturePinchUpdate:
 | 
| -      AddField("subtype", "GesturePinchUpdate", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureTapDown:
 | 
| -      AddField("subtype", "GestureTapDown", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureTapCancel:
 | 
| -      AddField("subtype", "GestureTapCancel", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureTapUnconfirmed:
 | 
| -      AddField("subtype", "GestureTapUnconfirmed", output);
 | 
| -      break;
 | 
| -    case InputMessage::Type_GestureShowPress:
 | 
| -      AddField("subtype", "GestureShowPress", output);
 | 
| -      break;
 | 
| -    case InputMessage::UNKNOWN:
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from NAVIGATION messages.
 | 
| -void ExtractNavigationMessageFields(const BlimpMessage& message,
 | 
| -                                    LogFields* output) {
 | 
| -  switch (message.navigation().type()) {
 | 
| -    case NavigationMessage::NAVIGATION_STATE_CHANGED:
 | 
| -      AddField("subtype", "NAVIGATION_STATE_CHANGED", output);
 | 
| -      if (message.navigation().navigation_state_changed().has_url()) {
 | 
| -        AddField("url", message.navigation().navigation_state_changed().url(),
 | 
| -                 output);
 | 
| -      }
 | 
| -      if (message.navigation().navigation_state_changed().has_favicon()) {
 | 
| -        AddField(
 | 
| -            "favicon_size",
 | 
| -            message.navigation().navigation_state_changed().favicon().size(),
 | 
| -            output);
 | 
| -      }
 | 
| -      if (message.navigation().navigation_state_changed().has_title()) {
 | 
| -        AddField("title",
 | 
| -                 message.navigation().navigation_state_changed().title(),
 | 
| -                 output);
 | 
| -      }
 | 
| -      if (message.navigation().navigation_state_changed().has_loading()) {
 | 
| -        AddField("loading",
 | 
| -                 message.navigation().navigation_state_changed().loading(),
 | 
| -                 output);
 | 
| -      }
 | 
| -      break;
 | 
| -    case NavigationMessage::LOAD_URL:
 | 
| -      AddField("subtype", "LOAD_URL", output);
 | 
| -      AddField("url", message.navigation().load_url().url(), output);
 | 
| -      break;
 | 
| -    case NavigationMessage::GO_BACK:
 | 
| -      AddField("subtype", "GO_BACK", output);
 | 
| -      break;
 | 
| -    case NavigationMessage::GO_FORWARD:
 | 
| -      AddField("subtype", "GO_FORWARD", output);
 | 
| -      break;
 | 
| -    case NavigationMessage::RELOAD:
 | 
| -      AddField("subtype", "RELOAD", output);
 | 
| -      break;
 | 
| -    case NavigationMessage::UNKNOWN:
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from PROTOCOL_CONTROL messages.
 | 
| -void ExtractProtocolControlMessageFields(const BlimpMessage& message,
 | 
| -                                         LogFields* output) {
 | 
| -  switch (message.protocol_control().connection_message_case()) {
 | 
| -    case ProtocolControlMessage::kStartConnection:
 | 
| -      AddField("subtype", "START_CONNECTION", output);
 | 
| -      AddField(
 | 
| -          "client_token",
 | 
| -          message.protocol_control().start_connection().client_auth_token(),
 | 
| -          output);
 | 
| -      AddField("protocol_version",
 | 
| -               message.protocol_control().start_connection().protocol_version(),
 | 
| -               output);
 | 
| -      break;
 | 
| -    case ProtocolControlMessage::kCheckpointAck:
 | 
| -      AddField("subtype", "CHECKPOINT_ACK", output);
 | 
| -      AddField("checkpoint_id",
 | 
| -               message.protocol_control().checkpoint_ack().checkpoint_id(),
 | 
| -               output);
 | 
| -      break;
 | 
| -    case ProtocolControlMessage::kEndConnection:
 | 
| -      AddField("subtype", "END_CONNECTION", output);
 | 
| -      switch (message.protocol_control().end_connection().reason()) {
 | 
| -        case EndConnectionMessage::AUTHENTICATION_FAILED:
 | 
| -          AddField("reason", "AUTHENTICATION_FAILED", output);
 | 
| -          break;
 | 
| -        case EndConnectionMessage::PROTOCOL_MISMATCH:
 | 
| -          AddField("reason", "PROTOCOL_MISMATCH", output);
 | 
| -          break;
 | 
| -        case EndConnectionMessage::UNKNOWN:
 | 
| -          break;
 | 
| -      }
 | 
| -      break;
 | 
| -    case ProtocolControlMessage::CONNECTION_MESSAGE_NOT_SET:
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from RENDER_WIDGET messages.
 | 
| -void ExtractRenderWidgetMessageFields(const BlimpMessage& message,
 | 
| -                                      LogFields* output) {
 | 
| -  switch (message.render_widget().type()) {
 | 
| -    case RenderWidgetMessage::INITIALIZE:
 | 
| -      AddField("subtype", "INITIALIZE", output);
 | 
| -      break;
 | 
| -    case RenderWidgetMessage::CREATED:
 | 
| -      AddField("subtype", "CREATED", output);
 | 
| -      break;
 | 
| -    case RenderWidgetMessage::DELETED:
 | 
| -      AddField("subtype", "DELETED", output);
 | 
| -      break;
 | 
| -    case RenderWidgetMessage::UNKNOWN:
 | 
| -      break;
 | 
| -  }
 | 
| -  AddField("render_widget_id", message.render_widget().render_widget_id(),
 | 
| -           output);
 | 
| -}
 | 
| -
 | 
| -// Logs fields from SETTINGS messages.
 | 
| -void ExtractSettingsMessageFields(const BlimpMessage& message,
 | 
| -                                  LogFields* output) {
 | 
| -  if (message.settings().has_engine_settings()) {
 | 
| -    const EngineSettingsMessage& engine_settings =
 | 
| -        message.settings().engine_settings();
 | 
| -    AddField("subtype", "ENGINE_SETTINGS", output);
 | 
| -    AddField("record_whole_document", engine_settings.record_whole_document(),
 | 
| -             output);
 | 
| -    AddField("client_os_info", engine_settings.client_os_info(), output);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from TAB_CONTROL messages.
 | 
| -void ExtractTabControlMessageFields(const BlimpMessage& message,
 | 
| -                                    LogFields* output) {
 | 
| -  switch (message.tab_control().tab_control_case()) {
 | 
| -    case TabControlMessage::kCreateTab:
 | 
| -      AddField("subtype", "CREATE_TAB", output);
 | 
| -      break;
 | 
| -    case TabControlMessage::kCloseTab:
 | 
| -      AddField("subtype", "CLOSE_TAB", output);
 | 
| -      break;
 | 
| -    case TabControlMessage::kSize:
 | 
| -      AddField("subtype", "SIZE", output);
 | 
| -      AddField("size", message.tab_control().size(), output);
 | 
| -      break;
 | 
| -    case TabControlMessage::TAB_CONTROL_NOT_SET:
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from BLOB_CHANNEL messages.
 | 
| -void ExtractBlobChannelMessageFields(const BlimpMessage& message,
 | 
| -                                     LogFields* output) {
 | 
| -  switch (message.blob_channel().type_case()) {
 | 
| -    case BlobChannelMessage::TypeCase::kTransferBlob:
 | 
| -      AddField("subtype", "TRANSFER_BLOB", output);
 | 
| -      AddField("id",
 | 
| -               base::HexEncode(
 | 
| -                   message.blob_channel().transfer_blob().blob_id().data(),
 | 
| -                   message.blob_channel().transfer_blob().blob_id().size()),
 | 
| -               output);
 | 
| -      AddField("payload_size",
 | 
| -               message.blob_channel().transfer_blob().payload().size(), output);
 | 
| -      break;
 | 
| -    case BlobChannelMessage::TypeCase::TYPE_NOT_SET:  // unknown
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -// Logs fields from GEOLOCATION messages.
 | 
| -void ExtractGeolocationMessageFields(const BlimpMessage& message,
 | 
| -                                     LogFields* output) {
 | 
| -  switch (message.geolocation().type_case()) {
 | 
| -    case GeolocationMessage::TypeCase::kSetInterestLevel:
 | 
| -      AddField("subtype", "SET_INTEREST_LEVEL", output);
 | 
| -      AddField("level", message.geolocation().set_interest_level().level(),
 | 
| -               output);
 | 
| -      break;
 | 
| -    case GeolocationMessage::TypeCase::kRequestRefresh:
 | 
| -      AddField("subtype", "REQUEST_REFRESH", output);
 | 
| -      break;
 | 
| -    case GeolocationMessage::TypeCase::kCoordinates: {
 | 
| -      const GeolocationCoordinatesMessage& coordinates =
 | 
| -          message.geolocation().coordinates();
 | 
| -      AddField("subtype", "COORDINATES", output);
 | 
| -      AddField("latitude", coordinates.latitude(), output);
 | 
| -      AddField("longitude", coordinates.longitude(), output);
 | 
| -      AddField("altitude", coordinates.altitude(), output);
 | 
| -      AddField("accuracy", coordinates.accuracy(), output);
 | 
| -      AddField("altitude_accuracy", coordinates.altitude_accuracy(), output);
 | 
| -      AddField("heading", coordinates.heading(), output);
 | 
| -      AddField("speed", coordinates.speed(), output);
 | 
| -      break;
 | 
| -    }
 | 
| -    case GeolocationMessage::TypeCase::kError:
 | 
| -      AddField("subtype", "ERROR", output);
 | 
| -      AddField("error_code", message.geolocation().error().error_code(),
 | 
| -               output);
 | 
| -      AddField("error_message", message.geolocation().error().error_message(),
 | 
| -               output);
 | 
| -      break;
 | 
| -    case GeolocationMessage::TypeCase::TYPE_NOT_SET:
 | 
| -      break;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -}  // namespace
 | 
| -
 | 
| -std::ostream& operator<<(std::ostream& out, const BlimpMessage& message) {
 | 
| -  LogFields fields;
 | 
| -
 | 
| -  switch (message.feature_case()) {
 | 
| -    case BlimpMessage::kCompositor:
 | 
| -      AddField("type", "COMPOSITOR", &fields);
 | 
| -      ExtractCompositorMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kInput:
 | 
| -      AddField("type", "INPUT", &fields);
 | 
| -      ExtractInputMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kNavigation:
 | 
| -      AddField("type", "NAVIGATION", &fields);
 | 
| -      ExtractNavigationMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kProtocolControl:
 | 
| -      AddField("type", "PROTOCOL_CONTROL", &fields);
 | 
| -      ExtractProtocolControlMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kRenderWidget:
 | 
| -      AddField("type", "RENDER_WIDGET", &fields);
 | 
| -      ExtractRenderWidgetMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kSettings:
 | 
| -      AddField("type", "SETTINGS", &fields);
 | 
| -      ExtractSettingsMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kTabControl:
 | 
| -      AddField("type", "TAB_CONTROL", &fields);
 | 
| -      ExtractTabControlMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kBlobChannel:
 | 
| -      AddField("type", "BLOB_CHANNEL", &fields);
 | 
| -      ExtractBlobChannelMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kIme:
 | 
| -      AddField("type", "IME", &fields);
 | 
| -      ExtractImeMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::kGeolocation:
 | 
| -      AddField("type", "GEOLOCATION", &fields);
 | 
| -      ExtractGeolocationMessageFields(message, &fields);
 | 
| -      break;
 | 
| -    case BlimpMessage::FEATURE_NOT_SET:
 | 
| -      AddField("type", "<UNKNOWN>", &fields);
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  // Append "target_tab_id" (if present) and "byte_size" to the field set.
 | 
| -  if (message.has_target_tab_id()) {
 | 
| -    AddField("target_tab_id", message.target_tab_id(), &fields);
 | 
| -  }
 | 
| -  AddField("byte_size", message.ByteSize(), &fields);
 | 
| -
 | 
| -  // Format message using the syntax:
 | 
| -  // <BlimpMessage field1=value1 field2="value 2">
 | 
| -  out << "<BlimpMessage ";
 | 
| -  for (size_t i = 0; i < fields.size(); ++i) {
 | 
| -    out << fields[i].first << "=" << fields[i].second
 | 
| -        << (i != fields.size() - 1 ? " " : "");
 | 
| -  }
 | 
| -  out << ">";
 | 
| -
 | 
| -  return out;
 | 
| -}
 | 
| -
 | 
| -}  // namespace blimp
 | 
| 
 |