Index: components/net_log/net_log_file_writer.cc |
diff --git a/components/net_log/net_log_file_writer.cc b/components/net_log/net_log_file_writer.cc |
index 8b2774910b9dba328e72c2e598f9516905dcf37c..3fb3833419b979f6e867cc7cead8e9a654bcb648 100644 |
--- a/components/net_log/net_log_file_writer.cc |
+++ b/components/net_log/net_log_file_writer.cc |
@@ -4,6 +4,7 @@ |
#include "components/net_log/net_log_file_writer.h" |
+#include <set> |
#include <utility> |
#include "base/bind.h" |
@@ -22,6 +23,10 @@ |
#include "net/log/net_log_util.h" |
#include "net/url_request/url_request_context_getter.h" |
+namespace net { |
+class URLRequestContext; |
+} |
+ |
namespace net_log { |
namespace { |
@@ -62,6 +67,19 @@ NetLogFileWriter::DefaultLogPathResults SetUpDefaultLogPath( |
return results; |
} |
+// Generates net log entries for ongoing events from |context_getters| and |
+// adds them to |observer|. |
+void CreateNetLogEntriesForActiveObjects( |
+ const NetLogFileWriter::URLRequestContextGetterList& context_getters, |
+ net::NetLog::ThreadSafeObserver* observer) { |
+ std::set<net::URLRequestContext*> contexts; |
+ for (const auto& getter : context_getters) { |
+ DCHECK(getter->GetNetworkTaskRunner()->BelongsToCurrentThread()); |
+ contexts.insert(getter->GetURLRequestContext()); |
+ } |
+ net::CreateNetLogEntriesForActiveObjects(contexts, observer); |
+} |
+ |
// Adds net info from net::GetNetInfo() to |polled_data|. |
std::unique_ptr<base::DictionaryValue> AddNetInfo( |
scoped_refptr<net::URLRequestContextGetter> context_getter, |
@@ -128,10 +146,10 @@ void NetLogFileWriter::Initialize( |
DCHECK(net_task_runner); |
if (file_task_runner_) |
- DCHECK_EQ(file_task_runner, file_task_runner_); |
+ DCHECK_EQ(file_task_runner_, file_task_runner); |
file_task_runner_ = file_task_runner; |
if (net_task_runner_) |
- DCHECK_EQ(net_task_runner, net_task_runner_); |
+ DCHECK_EQ(net_task_runner_, net_task_runner); |
net_task_runner_ = net_task_runner; |
if (state_ != STATE_UNINITIALIZED) |
@@ -148,8 +166,10 @@ void NetLogFileWriter::Initialize( |
weak_ptr_factory_.GetWeakPtr())); |
} |
-void NetLogFileWriter::StartNetLog(const base::FilePath& log_path, |
- net::NetLogCaptureMode capture_mode) { |
+void NetLogFileWriter::StartNetLog( |
+ const base::FilePath& log_path, |
+ net::NetLogCaptureMode capture_mode, |
+ const URLRequestContextGetterList& context_getters) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(file_task_runner_); |
@@ -161,19 +181,38 @@ void NetLogFileWriter::StartNetLog(const base::FilePath& log_path, |
DCHECK(!log_path_.empty()); |
+ state_ = STATE_STARTING_LOG; |
+ |
+ NotifyStateObserversAsync(); |
+ |
+ std::unique_ptr<base::Value> constants( |
+ ChromeNetLog::GetConstants(command_line_string_, channel_string_)); |
+ // Instantiate a FileNetLogObserver in unbounded mode. |
+ file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded( |
+ file_task_runner_, log_path_, std::move(constants)); |
+ |
+ net_task_runner_->PostTaskAndReply( |
+ FROM_HERE, |
+ base::Bind(&CreateNetLogEntriesForActiveObjects, context_getters, |
+ base::Unretained(file_net_log_observer_.get())), |
+ base::Bind( |
+ &NetLogFileWriter::StartNetLogAfterCreateEntriesForActiveObjects, |
+ weak_ptr_factory_.GetWeakPtr(), capture_mode)); |
+} |
+ |
+void NetLogFileWriter::StartNetLogAfterCreateEntriesForActiveObjects( |
+ net::NetLogCaptureMode capture_mode) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ DCHECK_EQ(STATE_STARTING_LOG, state_); |
+ |
state_ = STATE_LOGGING; |
log_exists_ = true; |
log_capture_mode_known_ = true; |
log_capture_mode_ = capture_mode; |
- NotifyStateObserversAsync(); |
+ NotifyStateObservers(); |
- std::unique_ptr<base::Value> constants( |
- ChromeNetLog::GetConstants(command_line_string_, channel_string_)); |
- file_net_log_observer_ = |
- base::MakeUnique<net::FileNetLogObserver>(file_task_runner_); |
- file_net_log_observer_->StartObservingUnbounded( |
- chrome_net_log_, capture_mode, log_path_, std::move(constants), nullptr); |
+ file_net_log_observer_->StartObserving(chrome_net_log_, capture_mode); |
} |
void NetLogFileWriter::StopNetLog( |
@@ -220,6 +259,9 @@ std::unique_ptr<base::DictionaryValue> NetLogFileWriter::GetState() const { |
case STATE_NOT_LOGGING: |
state_string = "NOT_LOGGING"; |
break; |
+ case STATE_STARTING_LOG: |
+ state_string = "STARTING_LOG"; |
+ break; |
case STATE_LOGGING: |
state_string = "LOGGING"; |
break; |
@@ -305,7 +347,7 @@ void NetLogFileWriter::NotifyStateObserversAsync() { |
void NetLogFileWriter::SetStateAfterSetUpDefaultLogPath( |
const DefaultLogPathResults& set_up_default_log_path_results) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK_EQ(state_, STATE_INITIALIZING); |
+ DCHECK_EQ(STATE_INITIALIZING, state_); |
if (set_up_default_log_path_results.default_log_path_success) { |
state_ = STATE_NOT_LOGGING; |
@@ -321,7 +363,7 @@ void NetLogFileWriter::SetStateAfterSetUpDefaultLogPath( |
void NetLogFileWriter::StopNetLogAfterAddNetInfo( |
std::unique_ptr<base::DictionaryValue> polled_data) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK_EQ(state_, STATE_STOPPING_LOG); |
+ DCHECK_EQ(STATE_STOPPING_LOG, state_); |
file_net_log_observer_->StopObserving( |
std::move(polled_data), |