Home | History | Annotate | Download | only in devtools
      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 
     17 class DevToolsNetworkConditions;
     18 class DevToolsNetworkTransaction;
     19 
     20 namespace base {
     21 class TimeDelta;
     22 class TimeTicks;
     23 }
     24 
     25 // DevToolsNetworkInterceptor emulates network conditions for transactions with
     26 // specific client id.
     27 class 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