page_timing_metadata_recorder.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. #ifndef COMPONENTS_PAGE_LOAD_METRICS_RENDERER_PAGE_TIMING_METADATA_RECORDER_H_
  5. #define COMPONENTS_PAGE_LOAD_METRICS_RENDERER_PAGE_TIMING_METADATA_RECORDER_H_
  6. #include "base/profiler/sample_metadata.h"
  7. #include "base/time/time.h"
  8. #include "third_party/abseil-cpp/absl/types/optional.h"
  9. namespace page_load_metrics {
  10. // Records metadata corresponding to page load metrics on sampling profiler
  11. // stack samples. PageTimingMetadataRecorder is currently only intended to be
  12. // used for the sampling profiler. If you have a new use case in mind, please
  13. // reach out to page_load_metrics owners to discuss it.
  14. class PageTimingMetadataRecorder {
  15. public:
  16. // Records the monotonic times that define
  17. // - First contentful paint
  18. // - First input delay
  19. struct MonotonicTiming {
  20. MonotonicTiming();
  21. MonotonicTiming(const MonotonicTiming&);
  22. MonotonicTiming& operator=(const MonotonicTiming&);
  23. MonotonicTiming(MonotonicTiming&&);
  24. MonotonicTiming& operator=(MonotonicTiming&&);
  25. absl::optional<base::TimeTicks> navigation_start;
  26. absl::optional<base::TimeTicks> first_contentful_paint;
  27. absl::optional<base::TimeTicks> first_input_timestamp;
  28. absl::optional<base::TimeDelta> first_input_delay;
  29. };
  30. PageTimingMetadataRecorder(const MonotonicTiming& initial_timing);
  31. ~PageTimingMetadataRecorder();
  32. PageTimingMetadataRecorder(const PageTimingMetadataRecorder&) = delete;
  33. PageTimingMetadataRecorder& operator=(const PageTimingMetadataRecorder&) =
  34. delete;
  35. // Updates the metadata on past samples based on given timing. Called whenever
  36. // `PageTimingMetricsSender::Update` is called.
  37. void UpdateMetadata(const MonotonicTiming& timing);
  38. protected:
  39. // To be overridden by test class.
  40. virtual void ApplyMetadataToPastSamples(base::TimeTicks period_start,
  41. base::TimeTicks period_end,
  42. base::StringPiece name,
  43. int64_t key,
  44. int64_t value,
  45. base::SampleMetadataScope scope);
  46. private:
  47. void UpdateFirstInputDelayMetadata(
  48. const absl::optional<base::TimeTicks>& first_input_timestamp,
  49. const absl::optional<base::TimeDelta>& first_input_delay);
  50. void UpdateFirstContentfulPaintMetadata(
  51. const absl::optional<base::TimeTicks>& navigation_start,
  52. const absl::optional<base::TimeTicks>& first_contentful_paint);
  53. // Uniquely identifies an instance of the PageTimingMetadataRecorder. Used to
  54. // distinguish page loads for different documents when applying sample
  55. // metadata.
  56. const int instance_id_;
  57. MonotonicTiming timing_;
  58. };
  59. } // namespace page_load_metrics
  60. #endif // COMPONENTS_PAGE_LOAD_METRICS_RENDERER_PAGE_TIMING_METADATA_RECORDER_H_