diff options
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', |