summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoreustas@chromium.org <eustas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-05 19:08:51 +0000
committereustas@chromium.org <eustas@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-05 19:08:51 +0000
commita77afb833488ea6134311dae2ea5b085c5a8adc6 (patch)
tree298ae894f0c311c07e17671989e8b801ba98e2a8 /chrome
parent1d71337d17c8062d21ff7e4bbd6cf8ffb39a869c (diff)
downloadchromium_src-a77afb833488ea6134311dae2ea5b085c5a8adc6.zip
chromium_src-a77afb833488ea6134311dae2ea5b085c5a8adc6.tar.gz
chromium_src-a77afb833488ea6134311dae2ea5b085c5a8adc6.tar.bz2
DevToolsNetworkController: support disabling network for specified domains.
BUG=245436 Review URL: https://codereview.chromium.org/316843002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275209 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/devtools/chrome_devtools_manager_delegate.cc12
-rw-r--r--chrome/browser/devtools/chrome_devtools_manager_delegate.h6
-rw-r--r--chrome/browser/devtools/devtools_network_conditions.cc30
-rw-r--r--chrome/browser/devtools/devtools_network_conditions.h36
-rw-r--r--chrome/browser/devtools/devtools_network_controller.cc25
-rw-r--r--chrome/browser/devtools/devtools_network_controller.h15
-rw-r--r--chrome/browser/devtools/devtools_network_controller_unittest.cc25
-rw-r--r--chrome/chrome_debugger.gypi2
8 files changed, 129 insertions, 22 deletions
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 9eb641c..898f50a 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
#include "base/values.h"
+#include "chrome/browser/devtools/devtools_network_conditions.h"
#include "chrome/browser/devtools/devtools_network_controller.h"
#include "chrome/browser/devtools/devtools_protocol.h"
#include "chrome/browser/devtools/devtools_protocol_constants.h"
@@ -87,22 +88,25 @@ ChromeDevToolsManagerDelegate::EmulateNetworkConditions(
return command->InvalidParamResponse(offline_param);
EnsureDevtoolsCallbackRegistered();
- UpdateNetworkState(agent_host, offline);
+ scoped_refptr<DevToolsNetworkConditions> conditions;
+ if (offline)
+ conditions = new DevToolsNetworkConditions(std::vector<std::string>());
+ UpdateNetworkState(agent_host, conditions);
return command->SuccessResponse(NULL);
}
void ChromeDevToolsManagerDelegate::UpdateNetworkState(
content::DevToolsAgentHost* agent_host,
- bool offline) {
+ scoped_refptr<DevToolsNetworkConditions> conditions) {
Profile* profile = GetProfile(agent_host);
if (!profile)
return;
profile->GetDevToolsNetworkController()->SetNetworkState(
- agent_host->GetId(), offline);
+ agent_host->GetId(), conditions);
}
void ChromeDevToolsManagerDelegate::OnDevToolsStateChanged(
content::DevToolsAgentHost* agent_host,
bool attached) {
- UpdateNetworkState(agent_host, false);
+ UpdateNetworkState(agent_host, scoped_refptr<DevToolsNetworkConditions>());
}
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
index 9b38332..6385c0c 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.h
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
@@ -8,9 +8,11 @@
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
+#include "base/memory/ref_counted.h"
#include "chrome/browser/devtools/devtools_protocol.h"
#include "content/public/browser/devtools_manager_delegate.h"
+class DevToolsNetworkConditions;
class Profile;
class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
@@ -36,7 +38,9 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
content::DevToolsAgentHost* agent_host,
DevToolsProtocol::Command* command);
- void UpdateNetworkState(content::DevToolsAgentHost* agent_host, bool offline);
+ void UpdateNetworkState(
+ content::DevToolsAgentHost* agent_host,
+ const scoped_refptr<DevToolsNetworkConditions> conditions);
void OnDevToolsStateChanged(content::DevToolsAgentHost* agent_host,
bool attached);
diff --git a/chrome/browser/devtools/devtools_network_conditions.cc b/chrome/browser/devtools/devtools_network_conditions.cc
new file mode 100644
index 0000000..aa656c7
--- /dev/null
+++ b/chrome/browser/devtools/devtools_network_conditions.cc
@@ -0,0 +1,30 @@
+// 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_conditions.h"
+
+#include "url/gurl.h"
+
+DevToolsNetworkConditions::DevToolsNetworkConditions(
+ const std::vector<std::string>& domains)
+ : domains_(domains){
+}
+
+DevToolsNetworkConditions::~DevToolsNetworkConditions() {
+}
+
+bool DevToolsNetworkConditions::HasMatchingDomain(const GURL& url) const {
+ Domains::const_iterator domain = domains_.begin();
+ if (domain == domains_.end())
+ return true;
+ for (; domain != domains_.end(); ++domain) {
+ if (url.DomainIs(domain->data()))
+ return true;
+ }
+ return false;
+}
+
+bool DevToolsNetworkConditions::IsOffline() const {
+ return true;
+}
diff --git a/chrome/browser/devtools/devtools_network_conditions.h b/chrome/browser/devtools/devtools_network_conditions.h
new file mode 100644
index 0000000..c6bd212
--- /dev/null
+++ b/chrome/browser/devtools/devtools_network_conditions.h
@@ -0,0 +1,36 @@
+// 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.
+
+#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_CONDITIONS_H_
+#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_CONDITIONS_H_
+
+#include <string>
+#include <vector>
+
+#include "base/memory/ref_counted.h"
+
+class GURL;
+
+// DevToolsNetworkConditions holds information about desired network conditions.
+class DevToolsNetworkConditions
+ : public base::RefCounted<DevToolsNetworkConditions> {
+ public:
+ explicit DevToolsNetworkConditions(const std::vector<std::string>& domains);
+
+ bool HasMatchingDomain(const GURL& url) const;
+ bool IsOffline() const;
+
+ private:
+ friend class base::RefCounted<DevToolsNetworkConditions>;
+
+ virtual ~DevToolsNetworkConditions();
+
+ // List of domains that will be affected by network conditions.
+ typedef std::vector<std::string> Domains;
+ const Domains domains_;
+
+ DISALLOW_COPY_AND_ASSIGN(DevToolsNetworkConditions);
+};
+
+#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_NETWORK_CONDITIONS_H_
diff --git a/chrome/browser/devtools/devtools_network_controller.cc b/chrome/browser/devtools/devtools_network_controller.cc
index 4ed7dfa..362dc46 100644
--- a/chrome/browser/devtools/devtools_network_controller.cc
+++ b/chrome/browser/devtools/devtools_network_controller.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/devtools/devtools_network_controller.h"
+#include "chrome/browser/devtools/devtools_network_conditions.h"
#include "chrome/browser/devtools/devtools_network_transaction.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_io_data.h"
@@ -40,7 +41,7 @@ void DevToolsNetworkController::RemoveTransaction(
void DevToolsNetworkController::SetNetworkState(
const std::string& client_id,
- bool offline) {
+ const scoped_refptr<DevToolsNetworkConditions> conditions) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
BrowserThread::PostTask(
content::BrowserThread::IO,
@@ -49,18 +50,22 @@ void DevToolsNetworkController::SetNetworkState(
&DevToolsNetworkController::SetNetworkStateOnIO,
weak_ptr_factory_.GetWeakPtr(),
client_id,
- offline));
+ conditions));
}
void DevToolsNetworkController::SetNetworkStateOnIO(
const std::string& client_id,
- bool offline) {
+ const scoped_refptr<DevToolsNetworkConditions> conditions) {
DCHECK(thread_checker_.CalledOnValidThread());
- if (!offline) {
- clients_.erase(client_id);
+ if (!conditions) {
+ if (client_id == active_client_id_) {
+ conditions_ = NULL;
+ active_client_id_ = std::string();
+ }
return;
}
- clients_.insert(client_id);
+ conditions_ = conditions;
+ active_client_id_ = client_id;
// Iterate over a copy of set, because failing of transaction could result in
// creating a new one, or (theoretically) destroying one.
@@ -80,13 +85,11 @@ bool DevToolsNetworkController::ShouldFail(
const net::HttpRequestInfo* request) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(request);
- if (clients_.empty())
+ if (!conditions_ || !conditions_->IsOffline())
return false;
- if (request->extra_headers.HasHeader(kDevToolsRequestInitiator))
+ if (!conditions_->HasMatchingDomain(request->url))
return false;
- // TODO: Add domain blacklist.
-
- return true;
+ return !request->extra_headers.HasHeader(kDevToolsRequestInitiator);
}
diff --git a/chrome/browser/devtools/devtools_network_controller.h b/chrome/browser/devtools/devtools_network_controller.h
index b917049..f057412 100644
--- a/chrome/browser/devtools/devtools_network_controller.h
+++ b/chrome/browser/devtools/devtools_network_controller.h
@@ -9,10 +9,12 @@
#include <string>
#include "base/macros.h"
+#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
+class DevToolsNetworkConditions;
class DevToolsNetworkTransaction;
class GURL;
class Profile;
@@ -44,7 +46,7 @@ class DevToolsNetworkController {
// |client_id| should be DevToolsAgentHost GUID.
void SetNetworkState(
const std::string& client_id,
- bool disable_network);
+ const scoped_refptr<DevToolsNetworkConditions> conditions);
bool ShouldFail(const net::HttpRequestInfo* request);
@@ -55,15 +57,20 @@ class DevToolsNetworkController {
// Controller must be constructed on IO thread.
base::ThreadChecker thread_checker_;
+ typedef scoped_refptr<DevToolsNetworkConditions> Conditions;
+
void SetNetworkStateOnIO(
const std::string& client_id,
- bool disable_network);
+ const Conditions conditions);
typedef std::set<DevToolsNetworkTransaction*> Transactions;
Transactions transactions_;
- typedef std::set<std::string> Clients;
- Clients clients_;
+ // Active client id.
+ std::string active_client_id_;
+
+ // Active network conditions.
+ Conditions conditions_;
base::WeakPtrFactory<DevToolsNetworkController> weak_ptr_factory_;
diff --git a/chrome/browser/devtools/devtools_network_controller_unittest.cc b/chrome/browser/devtools/devtools_network_controller_unittest.cc
index 6fe6256..ef8e65f 100644
--- a/chrome/browser/devtools/devtools_network_controller_unittest.cc
+++ b/chrome/browser/devtools/devtools_network_controller_unittest.cc
@@ -8,6 +8,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
+#include "chrome/browser/devtools/devtools_network_conditions.h"
#include "chrome/browser/devtools/devtools_network_controller.h"
#include "chrome/browser/devtools/devtools_network_transaction.h"
#include "net/http/http_transaction_test_util.h"
@@ -19,6 +20,10 @@ namespace test {
const char kClientId[] = "42";
const char kAnotherClientId[] = "24";
+const char kHttpDotCom[] = "http://dot.com";
+const char kHttpDotOrg[] = "http://dot.org";
+const char kCom[] = "com";
+
class TestCallback {
public:
TestCallback() : run_count_(0), value_(0) {}
@@ -42,7 +47,7 @@ class DevToolsNetworkControllerHelper {
mock_transaction_(kSimpleGET_Transaction),
buffer_(new net::IOBuffer(64)) {
mock_transaction_.test_mode = TEST_MODE_SYNC_NET_START;
- mock_transaction_.url = "http://dot.com";
+ mock_transaction_.url = kHttpDotCom;
AddMockTransaction(&mock_transaction_);
scoped_ptr<net::HttpTransaction> network_transaction;
@@ -59,7 +64,12 @@ class DevToolsNetworkControllerHelper {
}
void SetNetworkState(const std::string& client_id, bool offline) {
- controller_.SetNetworkStateOnIO(client_id, offline);
+ std::vector<std::string> domains;
+ domains.push_back(kCom);
+ scoped_refptr<DevToolsNetworkConditions> conditions;
+ if (offline)
+ conditions = new DevToolsNetworkConditions(domains);
+ controller_.SetNetworkStateOnIO(client_id, conditions);
}
int Start() {
@@ -190,4 +200,15 @@ TEST(DevToolsNetworkControllerTest, AllowsDevToolsRequests) {
EXPECT_FALSE(controller->ShouldFail(request));
}
+TEST(DevToolsNetworkControllerTest, AllowsNotMatchingRequests) {
+ DevToolsNetworkControllerHelper helper;
+ helper.mock_transaction()->url = kHttpDotOrg;
+ DevToolsNetworkController* controller = helper.controller();
+ net::HttpRequestInfo* request = helper.GetRequest();
+
+ EXPECT_FALSE(controller->ShouldFail(request));
+ helper.SetNetworkState(kClientId, true);
+ EXPECT_FALSE(controller->ShouldFail(request));
+}
+
} // namespace test
diff --git a/chrome/chrome_debugger.gypi b/chrome/chrome_debugger.gypi
index 5a80c58..fd5627f 100644
--- a/chrome/chrome_debugger.gypi
+++ b/chrome/chrome_debugger.gypi
@@ -64,6 +64,8 @@
'browser/devtools/devtools_file_helper.h',
'browser/devtools/devtools_file_system_indexer.cc',
'browser/devtools/devtools_file_system_indexer.h',
+ 'browser/devtools/devtools_network_conditions.cc',
+ 'browser/devtools/devtools_network_conditions.h',
'browser/devtools/devtools_network_controller.cc',
'browser/devtools/devtools_network_controller.h',
'browser/devtools/devtools_network_transaction.cc',