diff options
author | eustas@chromium.org <eustas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 16:03:08 +0000 |
---|---|---|
committer | eustas@chromium.org <eustas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-02 16:03:08 +0000 |
commit | a4205207e8e6bba4ebe0946b9d0b34abe946065f (patch) | |
tree | d3eb03bd5a2b18d30be9a887bc0291e4a93ce455 /chrome/browser/devtools/devtools_network_controller.cc | |
parent | dbe9bfab6e9b264b1b339e8c1c422f0b5dfa2a6c (diff) | |
download | chromium_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.cc | 92 |
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; +} |