| Index: remoting/protocol/performance_tracker.cc | 
| diff --git a/remoting/protocol/performance_tracker.cc b/remoting/protocol/performance_tracker.cc | 
| index 271336b588dc68f3594bcdeb12b82522287ed379..283e59b02bc62b94af8fe9fa1b4f09b493e1068a 100644 | 
| --- a/remoting/protocol/performance_tracker.cc | 
| +++ b/remoting/protocol/performance_tracker.cc | 
| @@ -20,6 +20,13 @@ const char kVideoPaintLatencyHistogram[] = "Chromoting.Video.PaintLatency"; | 
| const char kVideoFrameRateHistogram[] = "Chromoting.Video.FrameRate"; | 
| const char kVideoPacketRateHistogram[] = "Chromoting.Video.PacketRate"; | 
| const char kVideoBandwidthHistogram[] = "Chromoting.Video.Bandwidth"; | 
| +const char kCapturePendingLatencyHistogram[] = | 
| +    "Chromoting.Video.CapturePendingLatency"; | 
| +const char kCaptureOverheadHistogram[] = "Chromoting.Video.CaptureOverhead"; | 
| +const char kEncodePendingLatencyHistogram[] = | 
| +    "Chromoting.Video.EncodePendingLatency"; | 
| +const char kSendPendingLatencyHistogram[] = | 
| +    "Chromoting.Video.SendPendingLatency"; | 
|  | 
| // Custom count and custom time histograms are log-scaled by default. This | 
| // results in fine-grained buckets at lower values and wider-ranged buckets | 
| @@ -54,6 +61,16 @@ const int kBandwidthHistogramBuckets = 100; | 
| // boundary value, so set to 101. | 
| const int kMaxFramesPerSec = 101; | 
|  | 
| + | 
| +void UpdateUmaEnumHistogramStub(const std::string& histogram_name, | 
| +                                int64_t value, | 
| +                                int histogram_max) {} | 
| + | 
| +void UpdateUmaCustomHistogramStub(const std::string& histogram_name, | 
| +                                  int64_t value, | 
| +                                  int histogram_min, | 
| +                                  int histogram_max, | 
| +                                  int histogram_buckets) {} | 
| }  // namespace | 
|  | 
| namespace remoting { | 
| @@ -69,7 +86,11 @@ PerformanceTracker::PerformanceTracker() | 
| video_encode_ms_(kLatencySampleSize), | 
| video_decode_ms_(kLatencySampleSize), | 
| video_paint_ms_(kLatencySampleSize), | 
| -      round_trip_ms_(kLatencySampleSize) {} | 
| +      round_trip_ms_(kLatencySampleSize) { | 
| +  uma_custom_counts_updater_ = base::Bind(&UpdateUmaCustomHistogramStub); | 
| +  uma_custom_times_updater_ = base::Bind(&UpdateUmaCustomHistogramStub); | 
| +  uma_enum_histogram_updater_ = base::Bind(&UpdateUmaEnumHistogramStub); | 
| +} | 
|  | 
| PerformanceTracker::~PerformanceTracker() {} | 
|  | 
| @@ -77,6 +98,10 @@ void PerformanceTracker::SetUpdateUmaCallbacks( | 
| UpdateUmaCustomHistogramCallback update_uma_custom_counts_callback, | 
| UpdateUmaCustomHistogramCallback update_uma_custom_times_callback, | 
| UpdateUmaEnumHistogramCallback update_uma_enum_histogram_callback) { | 
| +  DCHECK(!update_uma_custom_counts_callback.is_null()); | 
| +  DCHECK(!update_uma_custom_times_callback.is_null()); | 
| +  DCHECK(!update_uma_enum_histogram_callback.is_null()); | 
| + | 
| uma_custom_counts_updater_ = update_uma_custom_counts_callback; | 
| uma_custom_times_updater_ = update_uma_custom_times_callback; | 
| uma_enum_histogram_updater_ = update_uma_enum_histogram_callback; | 
| @@ -105,11 +130,10 @@ void PerformanceTracker::RecordVideoPacketStats(const VideoPacket& packet) { | 
|  | 
| round_trip_ms_.Record(round_trip_latency.InMilliseconds()); | 
|  | 
| -    if (!uma_custom_times_updater_.is_null()) | 
| -      uma_custom_times_updater_.Run( | 
| -          kRoundTripLatencyHistogram, round_trip_latency.InMilliseconds(), | 
| -          kLatencyHistogramMinMs, kLatencyHistogramMaxMs, | 
| -          kLatencyHistogramBuckets); | 
| +    uma_custom_times_updater_.Run( | 
| +        kRoundTripLatencyHistogram, round_trip_latency.InMilliseconds(), | 
| +        kLatencyHistogramMinMs, kLatencyHistogramMaxMs, | 
| +        kLatencyHistogramBuckets); | 
| } | 
|  | 
| // If the packet is empty, there are no other stats to update. | 
| @@ -121,49 +145,71 @@ void PerformanceTracker::RecordVideoPacketStats(const VideoPacket& packet) { | 
|  | 
| if (packet.has_capture_time_ms()) { | 
| video_capture_ms_.Record(packet.capture_time_ms()); | 
| -    if (!uma_custom_times_updater_.is_null()) | 
| -      uma_custom_times_updater_.Run( | 
| -          kVideoCaptureLatencyHistogram, packet.capture_time_ms(), | 
| -          kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| -          kVideoActionsHistogramsBuckets); | 
| +    uma_custom_times_updater_.Run( | 
| +        kVideoCaptureLatencyHistogram, packet.capture_time_ms(), | 
| +        kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| +        kVideoActionsHistogramsBuckets); | 
| } | 
|  | 
| if (packet.has_encode_time_ms()) { | 
| video_encode_ms_.Record(packet.encode_time_ms()); | 
| -    if (!uma_custom_times_updater_.is_null()) | 
| -      uma_custom_times_updater_.Run( | 
| -          kVideoEncodeLatencyHistogram, packet.encode_time_ms(), | 
| -          kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| -          kVideoActionsHistogramsBuckets); | 
| +    uma_custom_times_updater_.Run( | 
| +        kVideoEncodeLatencyHistogram, packet.encode_time_ms(), | 
| +        kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| +        kVideoActionsHistogramsBuckets); | 
| +  } | 
| + | 
| +  if (packet.has_capture_pending_time_ms()) { | 
| +    uma_custom_times_updater_.Run( | 
| +        kCapturePendingLatencyHistogram, packet.capture_pending_time_ms(), | 
| +        kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| +        kVideoActionsHistogramsBuckets); | 
| +  } | 
| + | 
| +  if (packet.has_capture_overhead_time_ms()) { | 
| +    uma_custom_times_updater_.Run( | 
| +        kCaptureOverheadHistogram, packet.capture_overhead_time_ms(), | 
| +        kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| +        kVideoActionsHistogramsBuckets); | 
| +  } | 
| + | 
| +  if (packet.has_encode_pending_time_ms()) { | 
| +    uma_custom_times_updater_.Run( | 
| +        kEncodePendingLatencyHistogram, packet.encode_pending_time_ms(), | 
| +        kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| +        kVideoActionsHistogramsBuckets); | 
| +  } | 
| + | 
| +  if (packet.has_send_pending_time_ms()) { | 
| +    uma_custom_times_updater_.Run( | 
| +        kSendPendingLatencyHistogram, packet.send_pending_time_ms(), | 
| +        kVideoActionsHistogramsMinMs, kVideoActionsHistogramsMaxMs, | 
| +        kVideoActionsHistogramsBuckets); | 
| } | 
| } | 
|  | 
| void PerformanceTracker::RecordDecodeTime(double value) { | 
| video_decode_ms_.Record(value); | 
| -  if (!uma_custom_times_updater_.is_null()) | 
| -    uma_custom_times_updater_.Run( | 
| -        kVideoDecodeLatencyHistogram, value, kVideoActionsHistogramsMinMs, | 
| -        kVideoActionsHistogramsMaxMs, kVideoActionsHistogramsBuckets); | 
| +  uma_custom_times_updater_.Run( | 
| +      kVideoDecodeLatencyHistogram, value, kVideoActionsHistogramsMinMs, | 
| +      kVideoActionsHistogramsMaxMs, kVideoActionsHistogramsBuckets); | 
| } | 
|  | 
| void PerformanceTracker::RecordPaintTime(double value) { | 
| video_paint_ms_.Record(value); | 
| -  if (!uma_custom_times_updater_.is_null()) | 
| -    uma_custom_times_updater_.Run( | 
| -        kVideoPaintLatencyHistogram, value, kVideoActionsHistogramsMinMs, | 
| -        kVideoActionsHistogramsMaxMs, kVideoActionsHistogramsBuckets); | 
| +  uma_custom_times_updater_.Run( | 
| +      kVideoPaintLatencyHistogram, value, kVideoActionsHistogramsMinMs, | 
| +      kVideoActionsHistogramsMaxMs, kVideoActionsHistogramsBuckets); | 
| } | 
|  | 
| void PerformanceTracker::UploadRateStatsToUma() { | 
| -  if (!uma_enum_histogram_updater_.is_null()) { | 
| -    uma_enum_histogram_updater_.Run(kVideoFrameRateHistogram, | 
| -                                    video_frame_rate(), kMaxFramesPerSec); | 
| -    uma_enum_histogram_updater_.Run(kVideoPacketRateHistogram, | 
| -                                    video_packet_rate(), kMaxFramesPerSec); | 
| -    uma_custom_counts_updater_.Run( | 
| -        kVideoBandwidthHistogram, video_bandwidth(), kBandwidthHistogramMinBps, | 
| -        kBandwidthHistogramMaxBps, kBandwidthHistogramBuckets); | 
| -  } | 
| +  uma_enum_histogram_updater_.Run(kVideoFrameRateHistogram, video_frame_rate(), | 
| +                                  kMaxFramesPerSec); | 
| +  uma_enum_histogram_updater_.Run(kVideoPacketRateHistogram, | 
| +                                  video_packet_rate(), kMaxFramesPerSec); | 
| +  uma_custom_counts_updater_.Run( | 
| +      kVideoBandwidthHistogram, video_bandwidth(), kBandwidthHistogramMinBps, | 
| +      kBandwidthHistogramMaxBps, kBandwidthHistogramBuckets); | 
| } | 
|  | 
| void PerformanceTracker::OnPauseStateChanged(bool paused) { | 
|  |