devtools_network_controller.cc revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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_transaction.h" 9#include "chrome/browser/profiles/profile.h" 10#include "chrome/browser/profiles/profile_io_data.h" 11#include "content/public/browser/browser_thread.h" 12#include "content/public/browser/resource_context.h" 13 14using content::BrowserThread; 15 16namespace { 17 18const char kDevToolsRequestInitiator[] = "X-DevTools-Request-Initiator"; 19 20} // namespace 21 22DevToolsNetworkController::DevToolsNetworkController() 23 : weak_ptr_factory_(this) { 24} 25 26DevToolsNetworkController::~DevToolsNetworkController() { 27} 28 29void DevToolsNetworkController::AddTransaction( 30 DevToolsNetworkTransaction* transaction) { 31 DCHECK(thread_checker_.CalledOnValidThread()); 32 transactions_.insert(transaction); 33} 34 35void DevToolsNetworkController::RemoveTransaction( 36 DevToolsNetworkTransaction* transaction) { 37 DCHECK(thread_checker_.CalledOnValidThread()); 38 DCHECK(transactions_.find(transaction) != transactions_.end()); 39 transactions_.erase(transaction); 40} 41 42void DevToolsNetworkController::SetNetworkState( 43 const std::string& client_id, 44 const scoped_refptr<DevToolsNetworkConditions> conditions) { 45 DCHECK_CURRENTLY_ON(BrowserThread::UI); 46 BrowserThread::PostTask( 47 content::BrowserThread::IO, 48 FROM_HERE, 49 base::Bind( 50 &DevToolsNetworkController::SetNetworkStateOnIO, 51 weak_ptr_factory_.GetWeakPtr(), 52 client_id, 53 conditions)); 54} 55 56void DevToolsNetworkController::SetNetworkStateOnIO( 57 const std::string& client_id, 58 const scoped_refptr<DevToolsNetworkConditions> conditions) { 59 DCHECK(thread_checker_.CalledOnValidThread()); 60 if (!conditions) { 61 if (client_id == active_client_id_) { 62 conditions_ = NULL; 63 active_client_id_ = std::string(); 64 } 65 return; 66 } 67 conditions_ = conditions; 68 active_client_id_ = client_id; 69 70 // Iterate over a copy of set, because failing of transaction could result in 71 // creating a new one, or (theoretically) destroying one. 72 Transactions old_transactions(transactions_); 73 for (Transactions::iterator it = old_transactions.begin(); 74 it != old_transactions.end(); ++it) { 75 if (transactions_.find(*it) == transactions_.end()) 76 continue; 77 if (!(*it)->request() || (*it)->failed()) 78 continue; 79 if (ShouldFail((*it)->request())) 80 (*it)->Fail(); 81 } 82} 83 84bool DevToolsNetworkController::ShouldFail( 85 const net::HttpRequestInfo* request) { 86 DCHECK(thread_checker_.CalledOnValidThread()); 87 DCHECK(request); 88 if (!conditions_ || !conditions_->IsOffline()) 89 return false; 90 91 if (!conditions_->HasMatchingDomain(request->url)) 92 return false; 93 94 return !request->extra_headers.HasHeader(kDevToolsRequestInitiator); 95} 96