| Index: net/base/network_throttle_manager.h
|
| diff --git a/net/base/network_throttle_manager.h b/net/base/network_throttle_manager.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..4fde0f245d249efcd1820247b54dfaf7d1d78e27
|
| --- /dev/null
|
| +++ b/net/base/network_throttle_manager.h
|
| @@ -0,0 +1,94 @@
|
| +// 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 NET_BASE_NETWORK_THROTTLE_MANAGER_H_
|
| +#define NET_BASE_NETWORK_THROTTLE_MANAGER_H_
|
| +
|
| +#include <memory>
|
| +
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "net/base/net_export.h"
|
| +#include "net/base/request_priority.h"
|
| +
|
| +namespace net {
|
| +
|
| +// This class controls throttling based on priority level and number of
|
| +// outstanding requests. It vends Throttle objects, and tracks
|
| +// outstanding requests by the lifetime of those objects. Consumers
|
| +// determine whether or not they are throttled by consulting those
|
| +// Throttle objects.
|
| +//
|
| +// This class must outlive all Throttles created from it via CreateThrottle().
|
| +//
|
| +// Methods are virtual to allow for test mocks.
|
| +class NET_EXPORT_PRIVATE NetworkThrottleManager {
|
| + public:
|
| + // Abstract base class other classes can inherit from to get
|
| + // notifications from throttle state changes.
|
| + class NET_EXPORT_PRIVATE ThrottleDelegate {
|
| + public:
|
| + // Called whenever the throttle state of this stream has changed.
|
| + // The new state can be determined through Throttle::IsThrottled().
|
| + //
|
| + // Note that this call may occur as the result of either a call to
|
| + // Throttle::SetPriority (on the throttle related to this delegate
|
| + // or another throttle) or the destruction of a Throttle, and if
|
| + // so will occur synchronously during those events. It will not
|
| + // be called from the destructor of the Throttle associated with
|
| + // the ThrottleDelegate.
|
| + virtual void OnThrottleStateChanged() = 0;
|
| +
|
| + protected:
|
| + virtual ~ThrottleDelegate() {}
|
| + };
|
| +
|
| + // Class owned by external stream representations that
|
| + // routes notifications. It may be constructed in either the
|
| + // throttled or unthrottled state according to the state of the
|
| + // NetworkThrottleManager; if it's constructed in the throttled
|
| + // state, it will only make a single transition to unthrottled,
|
| + // which will be signaled by delegate->OnThrottleStateChanged().
|
| + // If it's constructed in the unthrottled state, it will remain
|
| + // there.
|
| + class NET_EXPORT_PRIVATE Throttle {
|
| + public:
|
| + virtual ~Throttle() {}
|
| +
|
| + virtual bool IsThrottled() const = 0;
|
| +
|
| + // Note that this may result in a possibly reentrant call to
|
| + // |ThrottleDelegate::OnThrottleStateChanged|, as well as the resumption
|
| + // of this or other requests, which may result in request completion
|
| + // and destruction before return. Any caller of this function
|
| + // should not rely on this object or containing objects surviving
|
| + // this call.
|
| + virtual void SetPriority(RequestPriority priority) = 0;
|
| +
|
| + protected:
|
| + Throttle() {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(Throttle);
|
| + };
|
| +
|
| + virtual ~NetworkThrottleManager() {}
|
| +
|
| + // Caller must ensure that |*delegate| outlives the returned
|
| + // Throttle.
|
| + virtual std::unique_ptr<Throttle> CreateThrottle(ThrottleDelegate* delegate,
|
| + RequestPriority priority,
|
| + bool ignore_limits) = 0;
|
| +
|
| + static std::unique_ptr<NetworkThrottleManager> CreateThrottler();
|
| +
|
| + protected:
|
| + NetworkThrottleManager() {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(NetworkThrottleManager);
|
| +};
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // NET_BASE_NETWORK_THROTTLE_MANAGER_H_
|
|
|