Fix race initialising DevtoolsNetworkController

This commit is contained in:
deepak1556 2016-04-14 06:59:14 +05:30
parent 2f107fcbe1
commit de60acbfde
10 changed files with 130 additions and 35 deletions

View file

@ -141,7 +141,7 @@ net::URLRequestContextGetter* BrowserContext::CreateRequestContext(
DCHECK(!url_request_getter_.get()); DCHECK(!url_request_getter_.get());
url_request_getter_ = new URLRequestContextGetter( url_request_getter_ = new URLRequestContextGetter(
this, this,
GetDevToolsNetworkController(), network_controller_handle(),
net_log, net_log,
GetPath(), GetPath(),
in_memory_, in_memory_,
@ -153,12 +153,6 @@ net::URLRequestContextGetter* BrowserContext::CreateRequestContext(
return url_request_getter_.get(); return url_request_getter_.get();
} }
DevToolsNetworkController* BrowserContext::GetDevToolsNetworkController() {
if (!controller_)
controller_.reset(new DevToolsNetworkController);
return controller_.get();
}
net::NetworkDelegate* BrowserContext::CreateNetworkDelegate() { net::NetworkDelegate* BrowserContext::CreateNetworkDelegate() {
return new NetworkDelegate; return new NetworkDelegate;
} }

View file

@ -7,7 +7,7 @@
#include <map> #include <map>
#include "browser/net/devtools_network_controller.h" #include "browser/net/devtools_network_controller_handle.h"
#include "browser/permission_manager.h" #include "browser/permission_manager.h"
#include "browser/url_request_context_getter.h" #include "browser/url_request_context_getter.h"
@ -63,12 +63,15 @@ class BrowserContext : public base::RefCounted<BrowserContext>,
NetLog* net_log, NetLog* net_log,
content::ProtocolHandlerMap* protocol_handlers, content::ProtocolHandlerMap* protocol_handlers,
content::URLRequestInterceptorScopedVector protocol_interceptors); content::URLRequestInterceptorScopedVector protocol_interceptors);
DevToolsNetworkController* GetDevToolsNetworkController();
net::URLRequestContextGetter* url_request_context_getter() const { net::URLRequestContextGetter* url_request_context_getter() const {
return url_request_getter_.get(); return url_request_getter_.get();
} }
DevToolsNetworkControllerHandle* network_controller_handle() {
return &network_controller_handle_;
}
void InitPrefs(); void InitPrefs();
PrefService* prefs() { return prefs_.get(); } PrefService* prefs() { return prefs_.get(); }
@ -114,8 +117,10 @@ class BrowserContext : public base::RefCounted<BrowserContext>,
base::FilePath path_; base::FilePath path_;
bool in_memory_; bool in_memory_;
DevToolsNetworkControllerHandle network_controller_handle_;
scoped_ptr<ResourceContext> resource_context_; scoped_ptr<ResourceContext> resource_context_;
scoped_ptr<DevToolsNetworkController> controller_;
scoped_refptr<URLRequestContextGetter> url_request_getter_; scoped_refptr<URLRequestContextGetter> url_request_getter_;
scoped_refptr<storage::SpecialStoragePolicy> storage_policy_; scoped_refptr<storage::SpecialStoragePolicy> storage_policy_;
scoped_ptr<PrefService> prefs_; scoped_ptr<PrefService> prefs_;

View file

@ -0,0 +1,60 @@
// Copyright (c) 2015 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-CHROMIUM file.
#include "browser/net/devtools_network_controller_handle.h"
#include "base/bind.h"
#include "browser/net/devtools_network_conditions.h"
#include "browser/net/devtools_network_controller.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
namespace brightray {
DevToolsNetworkControllerHandle::DevToolsNetworkControllerHandle() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
}
DevToolsNetworkControllerHandle::~DevToolsNetworkControllerHandle() {
BrowserThread::DeleteSoon(BrowserThread::IO,
FROM_HERE,
controller_.release());
}
void DevToolsNetworkControllerHandle::SetNetworkState(
const std::string& client_id,
scoped_ptr<DevToolsNetworkConditions> conditions) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&DevToolsNetworkControllerHandle::SetNetworkStateOnIO,
base::Unretained(this), client_id, base::Passed(&conditions)));
}
DevToolsNetworkController* DevToolsNetworkControllerHandle::GetController() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
LazyInitialize();
return controller_.get();
}
void DevToolsNetworkControllerHandle::LazyInitialize() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (!controller_)
controller_.reset(new DevToolsNetworkController);
}
void DevToolsNetworkControllerHandle::SetNetworkStateOnIO(
const std::string& client_id,
scoped_ptr<DevToolsNetworkConditions> conditions) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
LazyInitialize();
controller_->SetNetworkState(client_id, std::move(conditions));
}
} // namespace brightray

View file

@ -0,0 +1,44 @@
// Copyright (c) 2015 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-CHROMIUM file.
#ifndef BROWSER_DEVTOOLS_NETWORK_CONTROLLER_HANDLE_H_
#define BROWSER_DEVTOOLS_NETWORK_CONTROLLER_HANDLE_H_
#include <string>
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
namespace brightray {
class DevToolsNetworkConditions;
class DevToolsNetworkController;
// A handle to manage an IO-thread DevToolsNetworkController on the IO thread
// while allowing SetNetworkState to be called from the UI thread.
class DevToolsNetworkControllerHandle {
public:
DevToolsNetworkControllerHandle();
~DevToolsNetworkControllerHandle();
// Called on the UI thread.
void SetNetworkState(const std::string& client_id,
scoped_ptr<DevToolsNetworkConditions> conditions);
// Called on the IO thread.
DevToolsNetworkController* GetController();
private:
void LazyInitialize();
void SetNetworkStateOnIO(const std::string& client_id,
scoped_ptr<DevToolsNetworkConditions> conditions);
scoped_ptr<DevToolsNetworkController> controller_;
DISALLOW_COPY_AND_ASSIGN(DevToolsNetworkControllerHandle);
};
} // namespace brightray
#endif // BROWSER_DEVTOOLS_NETWORK_CONTROLLER_HANDLE_H_

View file

@ -75,7 +75,7 @@ void DevToolsNetworkInterceptor::UpdateConditions(
conditions_ = std::move(conditions); conditions_ = std::move(conditions);
bool offline = conditions_->offline(); bool offline = conditions_->offline();
if (offline || conditions_->IsThrottling()) { if (offline || !conditions_->IsThrottling()) {
timer_.Stop(); timer_.Stop();
FinishRecords(&download_, offline); FinishRecords(&download_, offline);
FinishRecords(&upload_, offline); FinishRecords(&upload_, offline);
@ -98,7 +98,7 @@ void DevToolsNetworkInterceptor::UpdateConditions(
latency_length_ = base::TimeDelta(); latency_length_ = base::TimeDelta();
double latency = conditions_->latency(); double latency = conditions_->latency();
if (latency > 0) if (latency > 0)
latency_length_ = base::TimeDelta::FromMilliseconds(latency); latency_length_ = base::TimeDelta::FromMillisecondsD(latency);
ArmTimer(now); ArmTimer(now);
} }
@ -124,7 +124,7 @@ uint64_t DevToolsNetworkInterceptor::UpdateThrottledRecords(
(*records)[i].bytes -= (*records)[i].bytes -=
(ticks / length) * kPacketSize + (i < shift ? kPacketSize : 0); (ticks / length) * kPacketSize + (i < shift ? kPacketSize : 0);
} }
std::rotate(records->begin(), records->end() + shift, records->end()); std::rotate(records->begin(), records->begin() + shift, records->end());
return new_tick; return new_tick;
} }
@ -138,7 +138,7 @@ void DevToolsNetworkInterceptor::UpdateThrottled(base::TimeTicks now) {
void DevToolsNetworkInterceptor::UpdateSuspended(base::TimeTicks now) { void DevToolsNetworkInterceptor::UpdateSuspended(base::TimeTicks now) {
int64_t activation_baseline = int64_t activation_baseline =
(now - latency_length_ - base::TimeTicks::Now()).InMicroseconds(); (now - latency_length_ - base::TimeTicks()).InMicroseconds();
ThrottleRecords suspended; ThrottleRecords suspended;
for (const ThrottleRecord& record : suspended_) { for (const ThrottleRecord& record : suspended_) {
if (record.send_end <= activation_baseline) { if (record.send_end <= activation_baseline) {

View file

@ -78,13 +78,6 @@ CreateFailureResponse(int id, const std::string& param) {
return response; return response;
} }
void UpdateNetworkStateInIO(brightray::DevToolsNetworkController* controller,
const std::string& client_id,
scoped_ptr<brightray::DevToolsNetworkConditions> conditions) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
controller->SetNetworkState(client_id, std::move(conditions));
}
} // namespace } // namespace
DevToolsNetworkProtocolHandler::DevToolsNetworkProtocolHandler() { DevToolsNetworkProtocolHandler::DevToolsNetworkProtocolHandler() {
@ -172,11 +165,8 @@ void DevToolsNetworkProtocolHandler::UpdateNetworkState(
scoped_ptr<DevToolsNetworkConditions> conditions) { scoped_ptr<DevToolsNetworkConditions> conditions) {
auto browser_context = auto browser_context =
static_cast<brightray::BrowserContext*>(agent_host->GetBrowserContext()); static_cast<brightray::BrowserContext*>(agent_host->GetBrowserContext());
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, browser_context->network_controller_handle()->SetNetworkState(
base::Bind(&UpdateNetworkStateInIO, agent_host->GetId(), std::move(conditions));
browser_context->GetDevToolsNetworkController(),
agent_host->GetId(),
base::Passed(&conditions)));
} }
} // namespace brightray } // namespace brightray

View file

@ -290,7 +290,7 @@ void DevToolsNetworkTransaction::SetBeforeProxyHeadersSentCallback(
} }
int DevToolsNetworkTransaction::ResumeNetworkStart() { int DevToolsNetworkTransaction::ResumeNetworkStart() {
if (failed_) if (CheckFailed())
return net::ERR_INTERNET_DISCONNECTED; return net::ERR_INTERNET_DISCONNECTED;
return transaction_->ResumeNetworkStart(); return transaction_->ResumeNetworkStart();
} }

View file

@ -6,7 +6,7 @@
#include <algorithm> #include <algorithm>
#include "browser/net/devtools_network_controller.h" #include "browser/net/devtools_network_controller_handle.h"
#include "browser/net/devtools_network_transaction_factory.h" #include "browser/net/devtools_network_transaction_factory.h"
#include "browser/net_log.h" #include "browser/net_log.h"
#include "browser/network_delegate.h" #include "browser/network_delegate.h"
@ -182,7 +182,7 @@ bool URLRequestContextGetter::Delegate::CanDelegateURLSecurity(const GURL& auth_
URLRequestContextGetter::URLRequestContextGetter( URLRequestContextGetter::URLRequestContextGetter(
Delegate* delegate, Delegate* delegate,
DevToolsNetworkController* controller, DevToolsNetworkControllerHandle* handle,
NetLog* net_log, NetLog* net_log,
const base::FilePath& base_path, const base::FilePath& base_path,
bool in_memory, bool in_memory,
@ -191,7 +191,7 @@ URLRequestContextGetter::URLRequestContextGetter(
content::ProtocolHandlerMap* protocol_handlers, content::ProtocolHandlerMap* protocol_handlers,
content::URLRequestInterceptorScopedVector protocol_interceptors) content::URLRequestInterceptorScopedVector protocol_interceptors)
: delegate_(delegate), : delegate_(delegate),
controller_(controller), network_controller_handle_(handle),
net_log_(net_log), net_log_(net_log),
base_path_(base_path), base_path_(base_path),
in_memory_(in_memory), in_memory_(in_memory),
@ -370,11 +370,11 @@ net::URLRequestContext* URLRequestContextGetter::GetURLRequestContext() {
backend.reset(delegate_->CreateHttpCacheBackendFactory(base_path_)); backend.reset(delegate_->CreateHttpCacheBackendFactory(base_path_));
} }
if (controller_) { if (network_controller_handle_) {
storage_->set_http_transaction_factory(make_scoped_ptr( storage_->set_http_transaction_factory(make_scoped_ptr(
new net::HttpCache( new net::HttpCache(
make_scoped_ptr(new DevToolsNetworkTransactionFactory( make_scoped_ptr(new DevToolsNetworkTransactionFactory(
controller_, http_network_session_.get())), network_controller_handle_->GetController(), http_network_session_.get())),
std::move(backend), std::move(backend),
false))); false)));
} else { } else {

View file

@ -28,7 +28,7 @@ class URLRequestJobFactory;
namespace brightray { namespace brightray {
class DevToolsNetworkController; class DevToolsNetworkControllerHandle;
class NetLog; class NetLog;
class URLRequestContextGetter : public net::URLRequestContextGetter { class URLRequestContextGetter : public net::URLRequestContextGetter {
@ -73,7 +73,7 @@ class URLRequestContextGetter : public net::URLRequestContextGetter {
URLRequestContextGetter( URLRequestContextGetter(
Delegate* delegate, Delegate* delegate,
DevToolsNetworkController* controller, DevToolsNetworkControllerHandle* handle,
NetLog* net_log, NetLog* net_log,
const base::FilePath& base_path, const base::FilePath& base_path,
bool in_memory, bool in_memory,
@ -92,7 +92,7 @@ class URLRequestContextGetter : public net::URLRequestContextGetter {
private: private:
Delegate* delegate_; Delegate* delegate_;
DevToolsNetworkController* controller_; DevToolsNetworkControllerHandle* network_controller_handle_;
NetLog* net_log_; NetLog* net_log_;
base::FilePath base_path_; base::FilePath base_path_;
bool in_memory_; bool in_memory_;

View file

@ -45,6 +45,8 @@
'browser/net/devtools_network_conditions.h', 'browser/net/devtools_network_conditions.h',
'browser/net/devtools_network_controller.cc', 'browser/net/devtools_network_controller.cc',
'browser/net/devtools_network_controller.h', 'browser/net/devtools_network_controller.h',
'browser/net/devtools_network_controller_handle.cc',
'browser/net/devtools_network_controller_handle.h',
'browser/net/devtools_network_interceptor.cc', 'browser/net/devtools_network_interceptor.cc',
'browser/net/devtools_network_interceptor.h', 'browser/net/devtools_network_interceptor.h',
'browser/net/devtools_network_protocol_handler.cc', 'browser/net/devtools_network_protocol_handler.cc',