page_timing_metadata_recorder.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/page_load_metrics/renderer/page_timing_metadata_recorder.h"
  5. namespace page_load_metrics {
  6. namespace {
  7. bool IsTimeTicksRangeSensible(base::TimeTicks start, base::TimeTicks end) {
  8. return start <= end && end <= base::TimeTicks::Now();
  9. }
  10. } // namespace
  11. // The next instance id to use for a PageTimingMetadataRecorder.
  12. int g_next_instance_id = 1;
  13. PageTimingMetadataRecorder::MonotonicTiming::MonotonicTiming() = default;
  14. PageTimingMetadataRecorder::MonotonicTiming::MonotonicTiming(
  15. const MonotonicTiming&) = default;
  16. PageTimingMetadataRecorder::MonotonicTiming&
  17. PageTimingMetadataRecorder::MonotonicTiming::operator=(const MonotonicTiming&) =
  18. default;
  19. PageTimingMetadataRecorder::MonotonicTiming::MonotonicTiming(
  20. MonotonicTiming&&) = default;
  21. PageTimingMetadataRecorder::MonotonicTiming&
  22. PageTimingMetadataRecorder::MonotonicTiming::operator=(MonotonicTiming&&) =
  23. default;
  24. PageTimingMetadataRecorder::PageTimingMetadataRecorder(
  25. const MonotonicTiming& initial_timing)
  26. : instance_id_(g_next_instance_id++) {
  27. UpdateMetadata(initial_timing);
  28. }
  29. PageTimingMetadataRecorder::~PageTimingMetadataRecorder() = default;
  30. void PageTimingMetadataRecorder::UpdateMetadata(const MonotonicTiming& timing) {
  31. UpdateFirstContentfulPaintMetadata(timing.navigation_start,
  32. timing.first_contentful_paint);
  33. UpdateFirstInputDelayMetadata(timing.first_input_timestamp,
  34. timing.first_input_delay);
  35. timing_ = timing;
  36. }
  37. void PageTimingMetadataRecorder::ApplyMetadataToPastSamples(
  38. base::TimeTicks period_start,
  39. base::TimeTicks period_end,
  40. base::StringPiece name,
  41. int64_t key,
  42. int64_t value,
  43. base::SampleMetadataScope scope) {
  44. base::ApplyMetadataToPastSamples(period_start, period_end, name, key, value,
  45. scope);
  46. }
  47. void PageTimingMetadataRecorder::UpdateFirstInputDelayMetadata(
  48. const absl::optional<base::TimeTicks>& first_input_timestamp,
  49. const absl::optional<base::TimeDelta>& first_input_delay) {
  50. // Applying metadata to past samples has non-trivial cost so only do so if
  51. // the relevant values changed.
  52. const bool should_apply_metadata =
  53. first_input_timestamp.has_value() && first_input_delay.has_value() &&
  54. (timing_.first_input_timestamp != first_input_timestamp ||
  55. timing_.first_input_delay != first_input_delay);
  56. if (should_apply_metadata) {
  57. ApplyMetadataToPastSamples(
  58. *first_input_timestamp, *first_input_timestamp + *first_input_delay,
  59. "PageLoad.InteractiveTiming.FirstInputDelay4", /* key=*/instance_id_,
  60. /* value=*/1, base::SampleMetadataScope::kProcess);
  61. }
  62. }
  63. void PageTimingMetadataRecorder::UpdateFirstContentfulPaintMetadata(
  64. const absl::optional<base::TimeTicks>& navigation_start,
  65. const absl::optional<base::TimeTicks>& first_contentful_paint) {
  66. // Applying metadata to past samples has non-trivial cost so only do so if
  67. // the relevant values changed.
  68. const bool should_apply_metadata =
  69. navigation_start.has_value() && first_contentful_paint.has_value() &&
  70. (timing_.navigation_start != navigation_start ||
  71. timing_.first_contentful_paint != first_contentful_paint);
  72. if (should_apply_metadata &&
  73. IsTimeTicksRangeSensible(*navigation_start, *first_contentful_paint)) {
  74. ApplyMetadataToPastSamples(
  75. *navigation_start, *first_contentful_paint,
  76. "PageLoad.PaintTiming.NavigationToFirstContentfulPaint",
  77. /* key=*/instance_id_,
  78. /* value=*/1, base::SampleMetadataScope::kProcess);
  79. }
  80. }
  81. } // namespace page_load_metrics