blob: 8c4f0f5ff7da737954c77db37f5b26007092b54c [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_TIME_TRACKER_H_
#define EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_TIME_TRACKER_H_
#include <stdint.h>
#include <map>
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
// This class monitors how much delay extensions add to network requests
// by using the webRequest API.
class ExtensionWebRequestTimeTracker {
public:
ExtensionWebRequestTimeTracker();
ExtensionWebRequestTimeTracker(const ExtensionWebRequestTimeTracker&) =
delete;
ExtensionWebRequestTimeTracker& operator=(
const ExtensionWebRequestTimeTracker&) = delete;
~ExtensionWebRequestTimeTracker();
// Records the time that a request was created. |has_listener| will be true
// if there is at least one webRequest listener registered.
// |has_extra_headers_listener| will be true if there is at least one listener
// with 'extraHeaders' in the extraInfoSpec.
void LogRequestStartTime(int64_t request_id,
const base::TimeTicks& start_time,
bool has_listener,
bool has_extra_headers_listener);
// Records the time at which an onBeforeRequest event was dispatched to
// listeners.
void LogBeforeRequestDispatchTime(int64_t request_id,
base::TimeTicks dispatch_time);
// Records the time at which an onBeforeRequest event received a response
// from all blocking listeners and the responses have been handled. Only
// called if there was at least one blocking listener.
void LogBeforeRequestCompletionTime(int64_t request_id,
base::TimeTicks completion_time);
// Records the time at which Chrome started to evaluate declarativeNetRequest
// rules at the beginning of a request.
void LogBeforeRequestDNRStartTime(int64_t request_id,
base::TimeTicks start_time);
// Records the time at which Chrome has completed handling
// declarativeNetRequest rules. Only called if at least one rule was applied.
void LogBeforeRequestDNRCompletionTime(int64_t request_id,
base::TimeTicks completion_time);
// Records the time that a request either completed or encountered an error.
void LogRequestEndTime(int64_t request_id, const base::TimeTicks& end_time);
// Records an additional delay for the given request caused by all extensions
// combined.
void IncrementTotalBlockTime(int64_t request_id,
const base::TimeDelta& block_time);
// Called when an extension has canceled the given request.
void SetRequestCanceled(int64_t request_id);
// Called when an extension has redirected the given request to another URL.
void SetRequestRedirected(int64_t request_id);
private:
FRIEND_TEST_ALL_PREFIXES(ExtensionWebRequestTimeTrackerTest, Histograms);
// Timing information for a single request.
struct RequestTimeLog {
base::TimeTicks request_start_time;
base::TimeTicks before_request_listener_dispatch_time;
base::TimeTicks before_request_dnr_start_time;
base::TimeTicks before_request_dnr_completion_time;
base::TimeTicks before_request_listener_completion_time;
base::TimeDelta block_duration;
bool has_listener = false;
bool has_extra_headers_listener = false;
RequestTimeLog();
RequestTimeLog(const RequestTimeLog&) = delete;
RequestTimeLog& operator=(const RequestTimeLog&) = delete;
~RequestTimeLog();
};
// Records UMA metrics for the given request and its end time.
void AnalyzeLogRequest(const RequestTimeLog& log,
const base::TimeTicks& end_time);
// A map of current request IDs to timing info for each request.
std::map<int64_t, RequestTimeLog> request_time_logs_;
};
#endif // EXTENSIONS_BROWSER_API_WEB_REQUEST_WEB_REQUEST_TIME_TRACKER_H_