summaryrefslogtreecommitdiffstats
path: root/chrome/browser/devtools/devtools_network_controller.cc
diff options
context:
space:
mode:
authoreustas@chromium.org <eustas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-02 16:03:08 +0000
committereustas@chromium.org <eustas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-02 16:03:08 +0000
commita4205207e8e6bba4ebe0946b9d0b34abe946065f (patch)
treed3eb03bd5a2b18d30be9a887bc0291e4a93ce455 /chrome/browser/devtools/devtools_network_controller.cc
parentdbe9bfab6e9b264b1b339e8c1c422f0b5dfa2a6c (diff)
downloadchromium_src-a4205207e8e6bba4ebe0946b9d0b34abe946065f.zip
chromium_src-a4205207e8e6bba4ebe0946b9d0b34abe946065f.tar.gz
chromium_src-a4205207e8e6bba4ebe0946b9d0b34abe946065f.tar.bz2
Add the ability for DevTools to wrap network transactions.
The eventual goal is to allow it to simulate flaky network connections. Docs: https://docs.google.com/a/google.com/document/d/1SkuWqLYIUpMDI05n7vgx8zdkunyUsxGs9tvUPDOqEJY/edit https://docs.google.com/a/google.com/document/d/19O_UeUfCFZg5cEnH5jkkZ6_tqsfaLQLYUEIGyXw3oTo/edit BUG=245436 Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=273584 Review URL: https://codereview.chromium.org/182993003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@274253 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/devtools/devtools_network_controller.cc')
-rw-r--r--chrome/browser/devtools/devtools_network_controller.cc92
1 files changed, 92 insertions, 0 deletions
diff --git a/chrome/browser/devtools/devtools_network_controller.cc b/chrome/browser/devtools/devtools_network_controller.cc
new file mode 100644
index 0000000..4ed7dfa
--- /dev/null
+++ b/chrome/browser/devtools/devtools_network_controller.cc
@@ -0,0 +1,92 @@
+// 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"
+
+using content::BrowserThread;
+
+namespace {
+
+const char kDevToolsRequestInitiator[] = "X-DevTools-Request-Initiator";
+
+} // namespace
+
+DevToolsNetworkController::DevToolsNetworkController()
+ : weak_ptr_factory_(this) {
+}
+
+DevToolsNetworkController::~DevToolsNetworkController() {
+}
+
+void DevToolsNetworkController::AddTransaction(
+ DevToolsNetworkTransaction* transaction) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ transactions_.insert(transaction);
+}
+
+void DevToolsNetworkController::RemoveTransaction(
+ DevToolsNetworkTransaction* transaction) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(transactions_.find(transaction) != transactions_.end());
+ transactions_.erase(transaction);
+}
+
+void DevToolsNetworkController::SetNetworkState(
+ const std::string& client_id,
+ bool offline) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ BrowserThread::PostTask(
+ content::BrowserThread::IO,
+ FROM_HERE,
+ base::Bind(
+ &DevToolsNetworkController::SetNetworkStateOnIO,
+ weak_ptr_factory_.GetWeakPtr(),
+ client_id,
+ offline));
+}
+
+void DevToolsNetworkController::SetNetworkStateOnIO(
+ const std::string& client_id,
+ bool offline) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ if (!offline) {
+ 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(thread_checker_.CalledOnValidThread());
+ DCHECK(request);
+ if (clients_.empty())
+ return false;
+
+ if (request->extra_headers.HasHeader(kDevToolsRequestInitiator))
+ return false;
+
+ // TODO: Add domain blacklist.
+
+ return true;
+}