blob: 561101268cd63b72bb9b24240536f5caf2c53ef5 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_RECORDER_H_
#define COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_RECORDER_H_
#include <stdint.h>
#include "base/containers/hash_tables.h"
#include "base/macros.h"
#include "base/supports_user_data.h"
#include "components/data_use_measurement/core/data_use.h"
#include "net/base/net_export.h"
namespace net {
class URLRequest;
}
namespace data_use_measurement {
// Tracks all network data used by a single high level entity. An entity
// can make multiple URLRequests, so there is a one:many relationship between
// DataUseRecorders and URLRequests. Data used by each URLRequest will be
// tracked by exactly one DataUseRecorder.
class DataUseRecorder {
public:
DataUseRecorder();
~DataUseRecorder();
// Returns the actual data used by the entity being tracked.
DataUse& data_use() { return data_use_; }
const base::hash_set<net::URLRequest*>& pending_url_requests() const {
return pending_url_requests_;
}
const net::URLRequest* main_url_request() const { return main_url_request_; }
void set_main_url_request(const net::URLRequest* request) {
main_url_request_ = request;
}
bool is_visible() const { return is_visible_; }
void set_is_visible(bool is_visible) { is_visible_ = is_visible; }
// Returns whether data use is complete and no additional data can be used
// by the entity tracked by this recorder. For example,
bool IsDataUseComplete();
// Adds |request| to the list of pending URLRequests that ascribe data use to
// this recorder.
void AddPendingURLRequest(net::URLRequest* request);
// Clears the list of pending URLRequests that ascribe data use to this
// recorder.
void RemoveAllPendingURLRequests();
// Returns whether there are any pending URLRequests whose data use is tracked
// by this DataUseRecorder.
bool HasPendingURLRequest(net::URLRequest* request);
// Merge another DataUseRecorder to this instance.
void MergeFrom(DataUseRecorder* other);
private:
friend class DataUseAscriber;
// Methods for tracking data use sources. These sources can initiate
// URLRequests directly or indirectly. The entity whose data use is being
// tracked by this recorder may comprise of sub-entities each of which use
// network data. These helper methods help track these sub-entities.
// A recorder will not be marked as having completed data use as long as it
// has pending data sources.
void AddPendingDataSource(void* source);
bool HasPendingDataSource(void* source);
void RemovePendingDataSource(void* source);
// Network Delegate methods:
void OnBeforeUrlRequest(net::URLRequest* request);
void OnUrlRequestDestroyed(net::URLRequest* request);
void OnNetworkBytesSent(net::URLRequest* request, int64_t bytes_sent);
void OnNetworkBytesReceived(net::URLRequest* request, int64_t bytes_received);
// Pending URLRequests whose data is being tracked by this DataUseRecorder.
base::hash_set<net::URLRequest*> pending_url_requests_;
// Data sources other than URLRequests, whose data is being tracked by this
// DataUseRecorder.
base::hash_set<const void*> pending_data_sources_;
// The main frame URLRequest for page loads. Null if this is not tracking a
// page load.
const net::URLRequest* main_url_request_;
// The network data use measured by this DataUseRecorder.
DataUse data_use_;
// Whether the entity that owns this data use is currently visible.
bool is_visible_;
DISALLOW_COPY_AND_ASSIGN(DataUseRecorder);
};
} // namespace data_use_measurement
#endif // COMPONENTS_DATA_USE_MEASUREMENT_CORE_DATA_USE_RECORDER_H_