1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_INTERCEPTOR_H_ 6#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_INTERCEPTOR_H_ 7 8#include <set> 9#include <string> 10#include <utility> 11#include <vector> 12 13#include "base/macros.h" 14#include "base/memory/scoped_ptr.h" 15#include "base/timer/timer.h" 16 17class DevToolsNetworkConditions; 18class DevToolsNetworkTransaction; 19 20namespace base { 21class TimeDelta; 22class TimeTicks; 23} 24 25// DevToolsNetworkInterceptor emulates network conditions for transactions with 26// specific client id. 27class DevToolsNetworkInterceptor { 28 29 public: 30 DevToolsNetworkInterceptor(); 31 virtual ~DevToolsNetworkInterceptor(); 32 33 base::WeakPtr<DevToolsNetworkInterceptor> GetWeakPtr(); 34 35 // Applies network emulation configuration. 36 void UpdateConditions(scoped_ptr<DevToolsNetworkConditions> conditions); 37 38 void AddTransaction(DevToolsNetworkTransaction* transaction); 39 void RemoveTransaction(DevToolsNetworkTransaction* transaction); 40 41 bool ShouldFail(const DevToolsNetworkTransaction* transaction); 42 bool ShouldThrottle(const DevToolsNetworkTransaction* transaction); 43 void ThrottleTransaction(DevToolsNetworkTransaction* transaction, bool start); 44 45 const DevToolsNetworkConditions* conditions() const { 46 return conditions_.get(); 47 } 48 49 private: 50 scoped_ptr<DevToolsNetworkConditions> conditions_; 51 52 void UpdateThrottledTransactions(base::TimeTicks now); 53 void UpdateSuspendedTransactions(base::TimeTicks now); 54 void ArmTimer(base::TimeTicks now); 55 void OnTimer(); 56 57 void FireThrottledCallback(DevToolsNetworkTransaction* transaction); 58 59 typedef std::set<DevToolsNetworkTransaction*> Transactions; 60 Transactions transactions_; 61 62 // Transactions suspended for a "latency" period. 63 typedef std::pair<DevToolsNetworkTransaction*, int64_t> SuspendedTransaction; 64 typedef std::vector<SuspendedTransaction> SuspendedTransactions; 65 SuspendedTransactions suspended_transactions_; 66 67 // Transactions waiting certain amount of transfer to be "accounted". 68 std::vector<DevToolsNetworkTransaction*> throttled_transactions_; 69 70 base::OneShotTimer<DevToolsNetworkInterceptor> timer_; 71 base::TimeTicks offset_; 72 base::TimeDelta tick_length_; 73 base::TimeDelta latency_length_; 74 uint64_t last_tick_; 75 76 base::WeakPtrFactory<DevToolsNetworkInterceptor> weak_ptr_factory_; 77 78 DISALLOW_COPY_AND_ASSIGN(DevToolsNetworkInterceptor); 79}; 80 81#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_INTERCEPTOR_H_ 82