blob: 2a8a9e169a52272abf3657d889184657a5033232 [file] [log] [blame]
// Copyright 2014 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_DOMAIN_RELIABILITY_CONTEXT_H_
#define COMPONENTS_DOMAIN_RELIABILITY_CONTEXT_H_
#include <deque>
#include <map>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "components/domain_reliability/beacon.h"
#include "components/domain_reliability/config.h"
#include "components/domain_reliability/domain_reliability_export.h"
#include "components/domain_reliability/scheduler.h"
#include "components/domain_reliability/uploader.h"
#include "components/domain_reliability/util.h"
class GURL;
namespace domain_reliability {
class DomainReliabilityDispatcher;
class MockableTime;
// The per-domain context for the Domain Reliability client; includes the
// domain's config and per-resource beacon queues.
class DOMAIN_RELIABILITY_EXPORT DomainReliabilityContext {
public:
DomainReliabilityContext(
MockableTime* time,
const DomainReliabilityScheduler::Params& scheduler_params,
DomainReliabilityDispatcher* dispatcher,
DomainReliabilityUploader* uploader,
scoped_ptr<const DomainReliabilityConfig> config);
virtual ~DomainReliabilityContext();
void AddBeacon(const DomainReliabilityBeacon& beacon, const GURL& url);
void GetQueuedDataForTesting(
int resource_index,
std::vector<DomainReliabilityBeacon>* beacons_out,
int* successful_requests_out,
int* failed_requests_out) const;
const DomainReliabilityConfig& config() { return *config_.get(); }
// Maximum number of beacons queued per context; if more than this many are
// queued; the oldest beacons will be removed.
static const int kMaxQueuedBeacons;
private:
// Resource-specific state (queued beacons and request counts).
class ResourceState {
public:
ResourceState(DomainReliabilityContext* context,
const DomainReliabilityConfig::Resource* config);
~ResourceState();
scoped_ptr<base::Value> ToValue(base::TimeTicks upload_time) const;
// Remembers the current state of the resource data when an upload starts.
void MarkUpload();
// Uses the state remembered by |MarkUpload| to remove successfully uploaded
// data but keep beacons and request counts added after the upload started.
void CommitUpload();
// Gets the start time of the oldest beacon, if there are any. Returns true
// and sets |oldest_start_out| if so; otherwise, returns false.
bool GetOldestBeaconStart(base::TimeTicks* oldest_start_out) const;
// Removes the oldest beacon. DCHECKs if there isn't one.
void RemoveOldestBeacon();
DomainReliabilityContext* context;
const DomainReliabilityConfig::Resource* config;
std::deque<DomainReliabilityBeacon> beacons;
int successful_requests;
int failed_requests;
// State saved during uploads; if an upload succeeds, these are used to
// remove uploaded data from the beacon list and request counters.
size_t uploading_beacons_size;
int uploading_successful_requests;
int uploading_failed_requests;
private:
DISALLOW_COPY_AND_ASSIGN(ResourceState);
};
typedef ScopedVector<ResourceState> ResourceStateVector;
typedef ResourceStateVector::const_iterator ResourceStateIterator;
void InitializeResourceStates();
void ScheduleUpload(base::TimeDelta min_delay, base::TimeDelta max_delay);
void StartUpload();
void OnUploadComplete(bool success);
scoped_ptr<const base::Value> CreateReport(base::TimeTicks upload_time) const;
// Remembers the current state of the context when an upload starts.
void MarkUpload();
// Uses the state remembered by |MarkUpload| to remove successfully uploaded
// data but keep beacons and request counts added after the upload started.
void CommitUpload();
// Finds and removes the oldest beacon. DCHECKs if there is none. (Called
// when there are too many beacons queued.)
void RemoveOldestBeacon();
scoped_ptr<const DomainReliabilityConfig> config_;
MockableTime* time_;
DomainReliabilityScheduler scheduler_;
DomainReliabilityDispatcher* dispatcher_;
DomainReliabilityUploader* uploader_;
// Each ResourceState in |states_| corresponds to the Resource of the same
// index in the config.
ResourceStateVector states_;
int beacon_count_;
int uploading_beacon_count_;
base::TimeTicks upload_time_;
base::TimeTicks last_upload_time_;
base::WeakPtrFactory<DomainReliabilityContext> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(DomainReliabilityContext);
};
} // namespace domain_reliability
#endif // COMPONENTS_DOMAIN_RELIABILITY_CONTEXT_H_