| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "blimp/common/logging.h" | 5 #include "blimp/common/logging.h" |
| 6 | 6 |
| 7 #include <iostream> | 7 #include <iostream> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 // Conversion function for all other types. | 59 // Conversion function for all other types. |
| 60 // Uses std::to_string() to serialize |value|. | 60 // Uses std::to_string() to serialize |value|. |
| 61 template <typename T> | 61 template <typename T> |
| 62 void AddField(const std::string& key, const T& value, LogFields* output) { | 62 void AddField(const std::string& key, const T& value, LogFields* output) { |
| 63 output->push_back(std::make_pair(key, std::to_string(value))); | 63 output->push_back(std::make_pair(key, std::to_string(value))); |
| 64 } | 64 } |
| 65 | 65 |
| 66 // The following LogExtractor subclasses contain logic for extracting loggable | 66 // The following LogExtractor subclasses contain logic for extracting loggable |
| 67 // fields from BlimpMessages. | 67 // fields from BlimpMessages. |
| 68 | 68 |
| 69 // Logs fields from TAB_CONTROL messages. | 69 // Logs fields from COMPOSITOR messages. |
| 70 class TabControlLogExtractor : public LogExtractor { | 70 class CompositorLogExtractor : public LogExtractor { |
| 71 void ExtractFields(const BlimpMessage& message, | 71 void ExtractFields(const BlimpMessage& message, |
| 72 LogFields* output) const override { | 72 LogFields* output) const override { |
| 73 switch (message.tab_control().type()) { | 73 AddField("render_widget_id", message.compositor().render_widget_id(), |
| 74 case TabControlMessage::CREATE_TAB: | 74 output); |
| 75 AddField("subtype", "CREATE_TAB", output); | 75 } |
| 76 }; |
| 77 |
| 78 // Logs fields from INPUT messages. |
| 79 class InputLogExtractor : public LogExtractor { |
| 80 void ExtractFields(const BlimpMessage& message, |
| 81 LogFields* output) const override { |
| 82 AddField("render_widget_id", message.input().render_widget_id(), output); |
| 83 AddField("timestamp_seconds", message.input().timestamp_seconds(), output); |
| 84 switch (message.input().type()) { |
| 85 case InputMessage::Type_GestureScrollBegin: |
| 86 AddField("subtype", "GestureScrollBegin", output); |
| 76 break; | 87 break; |
| 77 case TabControlMessage::CLOSE_TAB: | 88 case InputMessage::Type_GestureScrollEnd: |
| 78 AddField("subtype", "CLOSE_TAB", output); | 89 AddField("subtype", "GestureScrollEnd", output); |
| 79 break; | 90 break; |
| 80 case TabControlMessage::SIZE: | 91 case InputMessage::Type_GestureScrollUpdate: |
| 81 AddField("subtype", "SIZE", output); | 92 AddField("subtype", "GestureScrollUpdate", output); |
| 82 AddField("size", message.tab_control().size(), output); | 93 break; |
| 94 case InputMessage::Type_GestureFlingStart: |
| 95 AddField("subtype", "GestureFlingStart", output); |
| 96 break; |
| 97 case InputMessage::Type_GestureFlingCancel: |
| 98 AddField("subtype", "GestureFlingCancel", output); |
| 99 AddField("prevent_boosting", |
| 100 message.input().gesture_fling_cancel().prevent_boosting(), |
| 101 output); |
| 102 break; |
| 103 case InputMessage::Type_GestureTap: |
| 104 AddField("subtype", "GestureTap", output); |
| 105 break; |
| 106 case InputMessage::Type_GesturePinchBegin: |
| 107 AddField("subtype", "GesturePinchBegin", output); |
| 108 break; |
| 109 case InputMessage::Type_GesturePinchEnd: |
| 110 AddField("subtype", "GesturePinchEnd", output); |
| 111 break; |
| 112 case InputMessage::Type_GesturePinchUpdate: |
| 113 AddField("subtype", "GesturePinchUpdate", output); |
| 83 break; | 114 break; |
| 84 default: // unknown | 115 default: // unknown |
| 85 break; | 116 break; |
| 86 } | 117 } |
| 87 } | 118 } |
| 88 }; | 119 }; |
| 89 | 120 |
| 90 // Logs fields from NAVIGATION messages. | 121 // Logs fields from NAVIGATION messages. |
| 91 class NavigationLogExtractor : public LogExtractor { | 122 class NavigationLogExtractor : public LogExtractor { |
| 92 void ExtractFields(const BlimpMessage& message, | 123 void ExtractFields(const BlimpMessage& message, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 break; | 158 break; |
| 128 case NavigationMessage::RELOAD: | 159 case NavigationMessage::RELOAD: |
| 129 AddField("subtype", "RELOAD", output); | 160 AddField("subtype", "RELOAD", output); |
| 130 break; | 161 break; |
| 131 default: | 162 default: |
| 132 break; | 163 break; |
| 133 } | 164 } |
| 134 } | 165 } |
| 135 }; | 166 }; |
| 136 | 167 |
| 137 // Logs fields from COMPOSITOR messages. | 168 // Logs fields from PROTOCOL_CONTROL messages. |
| 138 class CompositorLogExtractor : public LogExtractor { | 169 class ProtocolControlLogExtractor : public LogExtractor { |
| 139 void ExtractFields(const BlimpMessage& message, | 170 void ExtractFields(const BlimpMessage& message, |
| 140 LogFields* output) const override { | 171 LogFields* output) const override { |
| 141 AddField("render_widget_id", message.compositor().render_widget_id(), | 172 switch (message.protocol_control().type()) { |
| 142 output); | 173 case ProtocolControlMessage::START_CONNECTION: |
| 143 } | 174 AddField("subtype", "START_CONNECTION", output); |
| 144 }; | 175 AddField("client_token", |
| 145 | 176 message.protocol_control().start_connection().client_token(), |
| 146 // Logs fields from INPUT messages. | 177 output); |
| 147 class InputLogExtractor : public LogExtractor { | 178 AddField( |
| 148 void ExtractFields(const BlimpMessage& message, | 179 "protocol_version", |
| 149 LogFields* output) const override { | 180 message.protocol_control().start_connection().protocol_version(), |
| 150 AddField("render_widget_id", message.input().render_widget_id(), output); | 181 output); |
| 151 AddField("timestamp_seconds", message.input().timestamp_seconds(), output); | |
| 152 switch (message.input().type()) { | |
| 153 case InputMessage::Type_GestureScrollBegin: | |
| 154 AddField("subtype", "GestureScrollBegin", output); | |
| 155 break; | 182 break; |
| 156 case InputMessage::Type_GestureScrollEnd: | 183 case ProtocolControlMessage::CHECKPOINT_ACK: |
| 157 AddField("subtype", "GestureScrollEnd", output); | 184 AddField("subtype", "CHECKPOINT_ACK", output); |
| 158 break; | 185 AddField("checkpoint_id", |
| 159 case InputMessage::Type_GestureScrollUpdate: | 186 message.protocol_control().checkpoint_ack().checkpoint_id(), |
| 160 AddField("subtype", "GestureScrollUpdate", output); | |
| 161 break; | |
| 162 case InputMessage::Type_GestureFlingStart: | |
| 163 AddField("subtype", "GestureFlingStart", output); | |
| 164 break; | |
| 165 case InputMessage::Type_GestureFlingCancel: | |
| 166 AddField("subtype", "GestureFlingCancel", output); | |
| 167 AddField("prevent_boosting", | |
| 168 message.input().gesture_fling_cancel().prevent_boosting(), | |
| 169 output); | 187 output); |
| 170 break; | 188 break; |
| 171 case InputMessage::Type_GestureTap: | 189 default: |
| 172 AddField("subtype", "GestureTap", output); | |
| 173 break; | |
| 174 case InputMessage::Type_GesturePinchBegin: | |
| 175 AddField("subtype", "GesturePinchBegin", output); | |
| 176 break; | |
| 177 case InputMessage::Type_GesturePinchEnd: | |
| 178 AddField("subtype", "GesturePinchEnd", output); | |
| 179 break; | |
| 180 case InputMessage::Type_GesturePinchUpdate: | |
| 181 AddField("subtype", "GesturePinchUpdate", output); | |
| 182 break; | |
| 183 default: // unknown | |
| 184 break; | 190 break; |
| 185 } | 191 } |
| 186 } | 192 } |
| 187 }; | 193 }; |
| 188 | 194 |
| 189 // Logs fields from RENDER_WIDGET messages. | 195 // Logs fields from RENDER_WIDGET messages. |
| 190 class RenderWidgetLogExtractor : public LogExtractor { | 196 class RenderWidgetLogExtractor : public LogExtractor { |
| 191 void ExtractFields(const BlimpMessage& message, | 197 void ExtractFields(const BlimpMessage& message, |
| 192 LogFields* output) const override { | 198 LogFields* output) const override { |
| 193 switch (message.render_widget().type()) { | 199 switch (message.render_widget().type()) { |
| 194 case RenderWidgetMessage::INITIALIZE: | 200 case RenderWidgetMessage::INITIALIZE: |
| 195 AddField("subtype", "INITIALIZE", output); | 201 AddField("subtype", "INITIALIZE", output); |
| 196 break; | 202 break; |
| 197 case RenderWidgetMessage::CREATED: | 203 case RenderWidgetMessage::CREATED: |
| 198 AddField("subtype", "CREATED", output); | 204 AddField("subtype", "CREATED", output); |
| 199 break; | 205 break; |
| 200 case RenderWidgetMessage::DELETED: | 206 case RenderWidgetMessage::DELETED: |
| 201 AddField("subtype", "DELETED", output); | 207 AddField("subtype", "DELETED", output); |
| 202 break; | 208 break; |
| 203 } | 209 } |
| 204 AddField("render_widget_id", message.render_widget().render_widget_id(), | 210 AddField("render_widget_id", message.render_widget().render_widget_id(), |
| 205 output); | 211 output); |
| 206 } | 212 } |
| 207 }; | 213 }; |
| 208 | 214 |
| 209 // Logs fields from PROTOCOL_CONTROL messages. | 215 // Logs fields from SETTINGS messages. |
| 210 class ProtocolControlLogExtractor : public LogExtractor { | 216 class SettingsLogExtractor : public LogExtractor { |
| 211 void ExtractFields(const BlimpMessage& message, | 217 void ExtractFields(const BlimpMessage& message, |
| 212 LogFields* output) const override { | 218 LogFields* output) const override { |
| 213 switch (message.protocol_control().type()) { | 219 if (message.settings().has_engine_settings()) { |
| 214 case ProtocolControlMessage::START_CONNECTION: | 220 const EngineSettingsMessage& engine_settings = |
| 215 AddField("subtype", "START_CONNECTION", output); | 221 message.settings().engine_settings(); |
| 216 AddField("client_token", | 222 AddField("subtype", "ENGINE_SETTINGS", output); |
| 217 message.protocol_control().start_connection().client_token(), | 223 AddField("record_whole_document", engine_settings.record_whole_document(), |
| 218 output); | 224 output); |
| 219 AddField( | 225 AddField("client_os_info", engine_settings.client_os_info(), output); |
| 220 "protocol_version", | 226 } |
| 221 message.protocol_control().start_connection().protocol_version(), | 227 } |
| 222 output); | 228 }; |
| 229 |
| 230 // Logs fields from TAB_CONTROL messages. |
| 231 class TabControlLogExtractor : public LogExtractor { |
| 232 void ExtractFields(const BlimpMessage& message, |
| 233 LogFields* output) const override { |
| 234 switch (message.tab_control().type()) { |
| 235 case TabControlMessage::CREATE_TAB: |
| 236 AddField("subtype", "CREATE_TAB", output); |
| 223 break; | 237 break; |
| 224 case ProtocolControlMessage::CHECKPOINT_ACK: | 238 case TabControlMessage::CLOSE_TAB: |
| 225 AddField("subtype", "CHECKPOINT_ACK", output); | 239 AddField("subtype", "CLOSE_TAB", output); |
| 226 AddField("checkpoint_id", | |
| 227 message.protocol_control().checkpoint_ack().checkpoint_id(), | |
| 228 output); | |
| 229 break; | 240 break; |
| 230 default: | 241 case TabControlMessage::SIZE: |
| 242 AddField("subtype", "SIZE", output); |
| 243 AddField("size", message.tab_control().size(), output); |
| 244 break; |
| 245 default: // unknown |
| 231 break; | 246 break; |
| 232 } | 247 } |
| 233 } | 248 } |
| 234 }; | 249 }; |
| 235 | 250 |
| 236 // No fields are extracted from |message|. | 251 // No fields are extracted from |message|. |
| 237 class NullLogExtractor : public LogExtractor { | 252 class NullLogExtractor : public LogExtractor { |
| 238 void ExtractFields(const BlimpMessage& message, | 253 void ExtractFields(const BlimpMessage& message, |
| 239 LogFields* output) const override {} | 254 LogFields* output) const override {} |
| 240 }; | 255 }; |
| 241 | 256 |
| 242 } // namespace | 257 } // namespace |
| 243 | 258 |
| 244 BlimpMessageLogger::BlimpMessageLogger() { | 259 BlimpMessageLogger::BlimpMessageLogger() { |
| 245 AddHandler("COMPOSITOR", BlimpMessage::COMPOSITOR, | 260 AddHandler("COMPOSITOR", BlimpMessage::COMPOSITOR, |
| 246 base::WrapUnique(new CompositorLogExtractor)); | 261 base::WrapUnique(new CompositorLogExtractor)); |
| 247 AddHandler("INPUT", BlimpMessage::INPUT, | 262 AddHandler("INPUT", BlimpMessage::INPUT, |
| 248 base::WrapUnique(new InputLogExtractor)); | 263 base::WrapUnique(new InputLogExtractor)); |
| 249 AddHandler("NAVIGATION", BlimpMessage::NAVIGATION, | 264 AddHandler("NAVIGATION", BlimpMessage::NAVIGATION, |
| 250 base::WrapUnique(new NavigationLogExtractor)); | 265 base::WrapUnique(new NavigationLogExtractor)); |
| 251 AddHandler("PROTOCOL_CONTROL", BlimpMessage::PROTOCOL_CONTROL, | 266 AddHandler("PROTOCOL_CONTROL", BlimpMessage::PROTOCOL_CONTROL, |
| 252 base::WrapUnique(new ProtocolControlLogExtractor)); | 267 base::WrapUnique(new ProtocolControlLogExtractor)); |
| 253 AddHandler("RENDER_WIDGET", BlimpMessage::RENDER_WIDGET, | 268 AddHandler("RENDER_WIDGET", BlimpMessage::RENDER_WIDGET, |
| 254 base::WrapUnique(new RenderWidgetLogExtractor)); | 269 base::WrapUnique(new RenderWidgetLogExtractor)); |
| 270 AddHandler("SETTINGS", BlimpMessage::SETTINGS, |
| 271 base::WrapUnique(new SettingsLogExtractor)); |
| 255 AddHandler("TAB_CONTROL", BlimpMessage::TAB_CONTROL, | 272 AddHandler("TAB_CONTROL", BlimpMessage::TAB_CONTROL, |
| 256 base::WrapUnique(new TabControlLogExtractor)); | 273 base::WrapUnique(new TabControlLogExtractor)); |
| 257 } | 274 } |
| 258 | 275 |
| 259 BlimpMessageLogger::~BlimpMessageLogger() {} | 276 BlimpMessageLogger::~BlimpMessageLogger() {} |
| 260 | 277 |
| 261 void BlimpMessageLogger::AddHandler(const std::string& type_name, | 278 void BlimpMessageLogger::AddHandler(const std::string& type_name, |
| 262 BlimpMessage::Type type, | 279 BlimpMessage::Type type, |
| 263 std::unique_ptr<LogExtractor> extractor) { | 280 std::unique_ptr<LogExtractor> extractor) { |
| 264 DCHECK(extractors_.find(type) == extractors_.end()); | 281 DCHECK(extractors_.find(type) == extractors_.end()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 297 } | 314 } |
| 298 *out << ">"; | 315 *out << ">"; |
| 299 } | 316 } |
| 300 | 317 |
| 301 std::ostream& operator<<(std::ostream& out, const BlimpMessage& message) { | 318 std::ostream& operator<<(std::ostream& out, const BlimpMessage& message) { |
| 302 g_logger.Get().LogMessageToStream(message, &out); | 319 g_logger.Get().LogMessageToStream(message, &out); |
| 303 return out; | 320 return out; |
| 304 } | 321 } |
| 305 | 322 |
| 306 } // namespace blimp | 323 } // namespace blimp |
| OLD | NEW |