Index: chrome/browser/net/network_controller.cc |
diff --git a/chrome/browser/net/network_controller.cc b/chrome/browser/net/network_controller.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a857691ba357e1d5696bd21523fc5dddac910dd9 |
--- /dev/null |
+++ b/chrome/browser/net/network_controller.cc |
@@ -0,0 +1,95 @@ |
+// 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/net/network_controller.h" |
+ |
+#include "chrome/browser/net/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" |
+ |
+NetworkController::NetworkController() { |
+} |
+ |
+NetworkController::~NetworkController() { |
+} |
+ |
+void NetworkController::AddTransaction( |
+ uint64 transaction_id, |
+ NetworkTransaction* transaction) { |
+ transactions_[transaction_id] = transaction; |
+} |
+ |
+void NetworkController::RemoveTransaction(uint64 transaction_id) { |
+ transactions_.erase(transaction_id); |
+} |
+ |
+// static |
+void NetworkController::DisableNetwork( |
+ Profile* profile, |
+ const std::string& client_id, |
+ bool disable_network) { |
+ CHECK(profile); |
+ content::ResourceContext* resourceContext = profile->GetResourceContext(); |
+ CHECK(resourceContext); |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind( |
+ &NetworkController::DisableNetworkOnIO, |
+ resourceContext, |
+ client_id, |
+ disable_network)); |
+} |
+ |
+// static |
+void NetworkController::DisableNetworkOnIO( |
+ content::ResourceContext* resourceContext, |
+ const std::string& client_id, |
+ bool disable_network) { |
+ CHECK(resourceContext); |
+ NetworkController* controller = ProfileIOData::FromResourceContext( |
+ resourceContext)->network_controller(); |
+ CHECK(controller); |
+ controller->DisableNetwork(client_id, disable_network); |
+} |
+ |
+void NetworkController::DisableNetwork( |
+ const std::string& client_id, |
+ bool disable_network) { |
+ ClientsSet::iterator client = clients_set_.find(client_id); |
+ if (client != clients_set_.end()) { |
+ if (!disable_network) |
+ clients_set_.erase(client); |
+ return; |
+ } |
+ |
+ if (!disable_network) |
+ return; |
+ |
+ bool first_client = clients_set_.size() == 0; |
+ clients_set_.insert(client_id); |
+ if (!first_client) |
+ return; |
+ |
+ Transactions::iterator it = transactions_.begin(); |
+ while (it != transactions_.end()) { |
+ Transactions::iterator current = it++; |
+ NetworkTransaction* transaction = current->second; |
+ if (IsBlockedURL(transaction->GetURL())) { |
+ transactions_.erase(current); |
+ transaction->Stop(); |
+ } |
+ } |
+} |
+ |
+bool NetworkController::IsBlockedURL(const GURL& url) { |
+ if (clients_set_.size() == 0) |
+ return false; |
+ |
+ // TODO: Add whitelist. |
+ |
+ return true; |
+} |