Chromium Code Reviews| Index: chrome/browser/devtools/devtools_network_controller.cc |
| diff --git a/chrome/browser/devtools/devtools_network_controller.cc b/chrome/browser/devtools/devtools_network_controller.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c81e2f608bb4a3d580df08fd4cfc5066af29fc08 |
| --- /dev/null |
| +++ b/chrome/browser/devtools/devtools_network_controller.cc |
| @@ -0,0 +1,101 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "chrome/browser/devtools/devtools_network_controller.h" |
| + |
| +#include "chrome/browser/devtools/devtools_network_transaction.h" |
| +#include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/profiles/profile_io_data.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/resource_context.h" |
| + |
| +namespace { |
| + |
| +const char kDevToolsRequestInitiator[] = "X-DevTools-Request-Initiator"; |
| + |
| +} // namespace |
| + |
| +DevToolsNetworkController::DevToolsNetworkController() { |
| +} |
| + |
| +DevToolsNetworkController::~DevToolsNetworkController() { |
| +} |
| + |
| +void DevToolsNetworkController::AddTransaction( |
| + DevToolsNetworkTransaction* transaction) { |
| + transactions_.insert(transaction); |
|
pfeldman
2014/04/23 13:00:28
DCHECK every method on the IO thread please.
eustas
2014/04/29 08:14:42
Done. But I've used thread checker to avoid compex
|
| +} |
| + |
| +void DevToolsNetworkController::RemoveTransaction( |
| + DevToolsNetworkTransaction* transaction) { |
| + DCHECK(transactions_.find(transaction) != transactions_.end()); |
| + transactions_.erase(transaction); |
| +} |
| + |
| +// static |
| +void DevToolsNetworkController::DisableNetwork( |
| + Profile* profile, |
| + const std::string& client_id, |
| + bool disable_network) { |
| + DCHECK(profile); |
| + content::ResourceContext* resource_context = profile->GetResourceContext(); |
| + DCHECK(resource_context); |
| + content::BrowserThread::PostTask( |
| + content::BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind( |
| + &DevToolsNetworkController::DisableNetworkOnIO, |
| + resource_context, |
| + client_id, |
| + disable_network)); |
| +} |
| + |
| +// static |
| +void DevToolsNetworkController::DisableNetworkOnIO( |
| + content::ResourceContext* resource_context, |
| + const std::string& client_id, |
| + bool disable_network) { |
| + DCHECK(resource_context); |
| + DevToolsNetworkController* controller = ProfileIOData::FromResourceContext( |
| + resource_context)->network_controller(); |
| + DCHECK(controller); |
| + controller->DisableNetwork(client_id, disable_network); |
| +} |
| + |
| +void DevToolsNetworkController::DisableNetwork( |
| + const std::string& client_id, |
| + bool disable_network) { |
| + if (!disable_network) { |
| + clients_.erase(client_id); |
| + return; |
| + } |
| + clients_.insert(client_id); |
| + |
| + // Iterate over a copy of set, because failing of transaction could result in |
| + // creating a new one, or (theoretically) destroying one. |
| + Transactions old_transactions(transactions_); |
| + for (Transactions::iterator it = old_transactions.begin(); |
| + it != old_transactions.end(); ++it) { |
| + if (transactions_.find(*it) == transactions_.end()) |
| + continue; |
| + if (!(*it)->request() || (*it)->failed()) |
| + continue; |
| + if (ShouldFail((*it)->request())) |
| + (*it)->Fail(); |
| + } |
| +} |
| + |
| +bool DevToolsNetworkController::ShouldFail( |
| + const net::HttpRequestInfo* request) { |
| + DCHECK(request); |
| + if (clients_.empty()) |
| + return false; |
| + |
| + if (request->extra_headers.HasHeader(kDevToolsRequestInitiator)) |
| + return false; |
| + |
| + // TODO: Add domain blacklist. |
| + |
| + return true; |
| +} |