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