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#include "chrome/browser/devtools/devtools_network_controller.h" 6 7#include "chrome/browser/devtools/devtools_network_conditions.h" 8#include "chrome/browser/devtools/devtools_network_interceptor.h" 9#include "chrome/browser/devtools/devtools_network_transaction.h" 10#include "content/public/browser/browser_thread.h" 11#include "net/base/load_flags.h" 12#include "net/http/http_request_info.h" 13 14using content::BrowserThread; 15 16DevToolsNetworkController::DevToolsNetworkController() 17 : default_interceptor_(new DevToolsNetworkInterceptor()), 18 appcache_interceptor_(new DevToolsNetworkInterceptor()), 19 weak_ptr_factory_(this) { 20} 21 22DevToolsNetworkController::~DevToolsNetworkController() { 23} 24 25base::WeakPtr<DevToolsNetworkInterceptor> 26DevToolsNetworkController::GetInterceptor( 27 DevToolsNetworkTransaction* transaction) { 28 DCHECK(thread_checker_.CalledOnValidThread()); 29 DCHECK(transaction->request()); 30 31 if (!interceptors_.size()) 32 return default_interceptor_->GetWeakPtr(); 33 34 if (transaction->request()->load_flags & net::LOAD_DISABLE_INTERCEPT) 35 return appcache_interceptor_->GetWeakPtr(); 36 37 transaction->ProcessRequest(); 38 39 const std::string& client_id = transaction->client_id(); 40 if (client_id.empty()) 41 return default_interceptor_->GetWeakPtr(); 42 43 DevToolsNetworkInterceptor* interceptor = interceptors_.get(client_id); 44 DCHECK(interceptor); 45 if (!interceptor) 46 return default_interceptor_->GetWeakPtr(); 47 48 return interceptor->GetWeakPtr(); 49} 50 51void DevToolsNetworkController::SetNetworkState( 52 const std::string& client_id, 53 scoped_ptr<DevToolsNetworkConditions> conditions) { 54 DCHECK_CURRENTLY_ON(BrowserThread::UI); 55 BrowserThread::PostTask( 56 content::BrowserThread::IO, 57 FROM_HERE, 58 base::Bind( 59 &DevToolsNetworkController::SetNetworkStateOnIO, 60 weak_ptr_factory_.GetWeakPtr(), 61 client_id, 62 base::Passed(&conditions))); 63} 64 65void DevToolsNetworkController::SetNetworkStateOnIO( 66 const std::string& client_id, 67 scoped_ptr<DevToolsNetworkConditions> conditions) { 68 DCHECK(thread_checker_.CalledOnValidThread()); 69 70 DevToolsNetworkInterceptor* interceptor = interceptors_.get(client_id); 71 if (!interceptor) { 72 DCHECK(conditions); 73 if (!conditions) 74 return; 75 Interceptor new_interceptor = Interceptor(new DevToolsNetworkInterceptor()); 76 new_interceptor->UpdateConditions(conditions.Pass()); 77 interceptors_.set(client_id, new_interceptor.Pass()); 78 } else { 79 if (!conditions) { 80 scoped_ptr<DevToolsNetworkConditions> online_conditions( 81 new DevToolsNetworkConditions()); 82 interceptor->UpdateConditions(online_conditions.Pass()); 83 interceptors_.erase(client_id); 84 } else { 85 interceptor->UpdateConditions(conditions.Pass()); 86 } 87 } 88 89 bool has_offline_interceptors = false; 90 Interceptors::iterator it = interceptors_.begin(); 91 for (; it != interceptors_.end(); ++it) { 92 if (it->second->conditions()->offline()) { 93 has_offline_interceptors = true; 94 break; 95 } 96 } 97 98 bool is_appcache_offline = appcache_interceptor_->conditions()->offline(); 99 if (is_appcache_offline != has_offline_interceptors) { 100 scoped_ptr<DevToolsNetworkConditions> appcache_conditions( 101 new DevToolsNetworkConditions(has_offline_interceptors)); 102 appcache_interceptor_->UpdateConditions(appcache_conditions.Pass()); 103 } 104} 105