metrics_render_frame_observer.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Copyright 2015 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_METRICS_RENDER_FRAME_OBSERVER_H_
  5. #define COMPONENTS_PAGE_LOAD_METRICS_RENDERER_METRICS_RENDER_FRAME_OBSERVER_H_
  6. #include <memory>
  7. #include <set>
  8. #include "base/scoped_observation.h"
  9. #include "components/page_load_metrics/common/page_load_timing.h"
  10. #include "components/page_load_metrics/renderer/page_resource_data_use.h"
  11. #include "components/page_load_metrics/renderer/page_timing_metadata_recorder.h"
  12. #include "components/subresource_filter/content/renderer/ad_resource_tracker.h"
  13. #include "content/public/renderer/render_frame_observer.h"
  14. #include "third_party/blink/public/common/loader/loading_behavior_flag.h"
  15. #include "third_party/blink/public/common/responsiveness_metrics/user_interaction_latency.h"
  16. #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
  17. #include "third_party/blink/public/web/web_local_frame_client.h"
  18. class GURL;
  19. namespace base {
  20. class OneShotTimer;
  21. } // namespace base
  22. namespace page_load_metrics {
  23. class PageTimingMetricsSender;
  24. class PageTimingSender;
  25. // MetricsRenderFrameObserver observes RenderFrame notifications, and sends page
  26. // load timing information to the browser process over IPC. A
  27. // MetricsRenderFrameObserver is instantiated for each frame (main frames and
  28. // child frames). MetricsRenderFrameObserver dispatches timing and metadata
  29. // updates for main frames, but only metadata updates for child frames.
  30. class MetricsRenderFrameObserver
  31. : public content::RenderFrameObserver,
  32. public subresource_filter::AdResourceTracker::Observer {
  33. public:
  34. explicit MetricsRenderFrameObserver(content::RenderFrame* render_frame);
  35. MetricsRenderFrameObserver(const MetricsRenderFrameObserver&) = delete;
  36. MetricsRenderFrameObserver& operator=(const MetricsRenderFrameObserver&) =
  37. delete;
  38. ~MetricsRenderFrameObserver() override;
  39. // RenderFrameObserver implementation
  40. void DidChangePerformanceTiming() override;
  41. void DidObserveInputDelay(base::TimeDelta input_delay) override;
  42. void DidObserveUserInteraction(
  43. base::TimeDelta max_event_duration,
  44. blink::UserInteractionType interaction_type) override;
  45. void DidChangeCpuTiming(base::TimeDelta time) override;
  46. void DidObserveLoadingBehavior(blink::LoadingBehaviorFlag behavior) override;
  47. void DidObserveNewFeatureUsage(
  48. const blink::UseCounterFeature& feature) override;
  49. void DidObserveSoftNavigation(uint32_t count) override;
  50. void DidObserveLayoutShift(double score, bool after_input_or_scroll) override;
  51. void DidObserveLayoutNg(uint32_t all_block_count,
  52. uint32_t ng_block_count,
  53. uint32_t all_call_count,
  54. uint32_t ng_call_count) override;
  55. void DidStartResponse(
  56. const url::SchemeHostPort& final_response_url,
  57. int request_id,
  58. const network::mojom::URLResponseHead& response_head,
  59. network::mojom::RequestDestination request_destination) override;
  60. void DidReceiveTransferSizeUpdate(int request_id,
  61. int received_data_length) override;
  62. void DidCompleteResponse(
  63. int request_id,
  64. const network::URLLoaderCompletionStatus& status) override;
  65. void DidCancelResponse(int request_id) override;
  66. void DidLoadResourceFromMemoryCache(const GURL& response_url,
  67. int request_id,
  68. int64_t encoded_body_length,
  69. const std::string& mime_type,
  70. bool from_archive) override;
  71. void DidStartNavigation(
  72. const GURL& url,
  73. absl::optional<blink::WebNavigationType> navigation_type) override;
  74. void DidSetPageLifecycleState() override;
  75. void ReadyToCommitNavigation(
  76. blink::WebDocumentLoader* document_loader) override;
  77. void DidFailProvisionalLoad() override;
  78. void DidCommitProvisionalLoad(ui::PageTransition transition) override;
  79. void DidCreateDocumentElement() override;
  80. void OnDestruct() override;
  81. // Invoked when a frame is going away. This is our last chance to send IPCs
  82. // before being destroyed.
  83. void WillDetach() override;
  84. // Set the ad resource tracker that |this| observes.
  85. void SetAdResourceTracker(
  86. subresource_filter::AdResourceTracker* ad_resource_tracker);
  87. // AdResourceTracker implementation
  88. void OnAdResourceTrackerGoingAway() override;
  89. void OnAdResourceObserved(int request_id) override;
  90. void OnMainFrameIntersectionChanged(
  91. const gfx::Rect& main_frame_intersection_rect) override;
  92. void OnMainFrameViewportRectangleChanged(
  93. const gfx::Rect& main_frame_viewport_rect) override;
  94. void OnMobileFriendlinessChanged(const blink::MobileFriendliness&) override;
  95. bool SetUpSmoothnessReporting(
  96. base::ReadOnlySharedMemoryRegion& shared_memory) override;
  97. protected:
  98. // The relative and monotonic page load timings.
  99. struct Timing {
  100. Timing(mojom::PageLoadTimingPtr relative_timing,
  101. const PageTimingMetadataRecorder::MonotonicTiming& monotonic_timing);
  102. ~Timing();
  103. Timing(const Timing&) = delete;
  104. Timing& operator=(const Timing&) = delete;
  105. Timing(Timing&&);
  106. Timing& operator=(Timing&&);
  107. mojom::PageLoadTimingPtr relative_timing;
  108. PageTimingMetadataRecorder::MonotonicTiming monotonic_timing;
  109. };
  110. private:
  111. // Updates the metadata for the page resource associated with the given
  112. // request_id. Removes the request_id from the list of known ads if it is an
  113. // ad.
  114. void UpdateResourceMetadata(int request_id);
  115. // Called on the completion of a resource from network or cache to determine
  116. // if it completed before FCP.
  117. void MaybeSetCompletedBeforeFCP(int request_id);
  118. void SendMetrics();
  119. void OnMetricsSenderCreated();
  120. virtual Timing GetTiming() const;
  121. virtual std::unique_ptr<base::OneShotTimer> CreateTimer();
  122. virtual std::unique_ptr<PageTimingSender> CreatePageTimingSender(
  123. bool limited_sending_mode);
  124. virtual bool HasNoRenderFrame() const;
  125. // Collects the data use of the frame request for a provisional load until the
  126. // load is committed. We want to collect data use for completed navigations in
  127. // this class, but the various navigation callbacks do not provide enough data
  128. // for us to use them for data attribution. Instead, we try to get this
  129. // information from ongoing resource requests on the previous page (or right
  130. // before this page loads in a new renderer).
  131. std::unique_ptr<PageResourceDataUse> provisional_frame_resource_data_use_;
  132. int provisional_frame_resource_id_ = 0;
  133. base::ScopedObservation<subresource_filter::AdResourceTracker,
  134. subresource_filter::AdResourceTracker::Observer>
  135. scoped_ad_resource_observation_{this};
  136. // Set containing all request ids that were reported as ads from the renderer.
  137. std::set<int> ad_request_ids_;
  138. // Set containing all request ids that were reported as completing before FCP.
  139. std::set<int> before_fcp_request_ids_;
  140. // Handle to the shared memory for transporting smoothness related ukm data.
  141. base::ReadOnlySharedMemoryRegion ukm_smoothness_data_;
  142. // The main frame intersection rectangle signal received before
  143. // `page_timing_metrics_sender_` is created. The signal will be send out right
  144. // after `page_timing_metrics_sender_` is created.
  145. absl::optional<gfx::Rect>
  146. main_frame_intersection_rect_before_metrics_sender_created_;
  147. // Will be null when we're not actively sending metrics.
  148. std::unique_ptr<PageTimingMetricsSender> page_timing_metrics_sender_;
  149. };
  150. } // namespace page_load_metrics
  151. #endif // COMPONENTS_PAGE_LOAD_METRICS_RENDERER_METRICS_RENDER_FRAME_OBSERVER_H_