| // Copyright 2025 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CHROME_BROWSER_LOADER_KEEP_ALIVE_REQUEST_TRACKER_H_ | 
 | #define CHROME_BROWSER_LOADER_KEEP_ALIVE_REQUEST_TRACKER_H_ | 
 |  | 
 | #include <memory> | 
 | #include <optional> | 
 | #include <string> | 
 |  | 
 | #include "base/functional/callback.h" | 
 | #include "base/time/time.h" | 
 | #include "content/public/browser/keep_alive_request_tracker.h" | 
 | #include "services/metrics/public/cpp/ukm_builders.h" | 
 | #include "services/metrics/public/cpp/ukm_source_id.h" | 
 | #include "services/network/public/cpp/resource_request.h" | 
 | #include "services/network/public/cpp/url_loader_completion_status.h" | 
 |  | 
 | // ChromeKeepAliveRequestTracker is responsible for recording browser-side | 
 | // metrics for an eligible fetch keepalive request. | 
 | // | 
 | // The UKM event logging happens only once when this tracker is about to be | 
 | // destroyed. | 
 | // | 
 | // See | 
 | // https://docs.google.com/document/d/1byKFqqKTsVFnj6rSb7ZjHi4LuRi1LNb-vf4maQbmSSQ/edit?resourcekey=0-7GAe1ae8j_55DMcvp3U3IQ&tab=t.0#heading=h.bk553qrz82t0 | 
 | class ChromeKeepAliveRequestTracker : public content::KeepAliveRequestTracker { | 
 |  public: | 
 |   ~ChromeKeepAliveRequestTracker() override; | 
 |  | 
 |   // Returns a tracker instance if `request` is eligible to be tracked. | 
 |   // | 
 |   // `ukm_source_id` is the UKM ID to associate with the events logged by the | 
 |   // returned tracker. | 
 |   // `is_context_detached_callback` tells if the context of `request` is | 
 |   // detached at the time running the callback. | 
 |   static std::unique_ptr<ChromeKeepAliveRequestTracker> | 
 |   MaybeCreateKeepAliveRequestTracker( | 
 |       const network::ResourceRequest& request, | 
 |       std::optional<ukm::SourceId> ukm_source_id, | 
 |       IsContextDetachedCallback is_context_detached_callback); | 
 |  | 
 |  private: | 
 |   ChromeKeepAliveRequestTracker( | 
 |       RequestType request_type, | 
 |       uint32_t request_category, | 
 |       ukm::SourceId ukm_source_id, | 
 |       IsContextDetachedCallback is_context_detached_callback, | 
 |       base::UnguessableToken keepalive_token); | 
 |  | 
 |   void AddStageMetrics(const RequestStage& stage) override; | 
 |  | 
 |   // Logs a UKM event for the tracked request. | 
 |   void LogUkmEvent(); | 
 |  | 
 |   // Records the time when this tracker is created. | 
 |   const base::TimeTicks created_time_; | 
 |  | 
 |   // The UKM builder for the tracked request. | 
 |   ukm::builders::FetchKeepAliveRequest_WithCategory ukm_builder_; | 
 |  | 
 |   // A callback to tell if the context of the request is detached. | 
 |   IsContextDetachedCallback is_context_detached_callback_; | 
 | }; | 
 |  | 
 | #endif  // CHROME_BROWSER_LOADER_KEEP_ALIVE_REQUEST_TRACKER_H_ |