Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: chrome/browser/media/webrtc_logging_handler_host.cc

Issue 927233005: Adding support for storing webrtc logs locally with an extension supplied unique id, for later uplo… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/media/webrtc_logging_handler_host.cc
diff --git a/chrome/browser/media/webrtc_logging_handler_host.cc b/chrome/browser/media/webrtc_logging_handler_host.cc
index 3696ff7be997318a37dc13e02339037a2b26d9b7..c1180173cd58657a8f409f7444e8892683db0e30 100644
--- a/chrome/browser/media/webrtc_logging_handler_host.cc
+++ b/chrome/browser/media/webrtc_logging_handler_host.cc
@@ -24,7 +24,6 @@
#include "chrome/common/chrome_switches.h"
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/media/webrtc_logging_messages.h"
-#include "chrome/common/partial_circular_buffer.h"
#include "chromeos/settings/cros_settings_names.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
@@ -51,12 +50,6 @@ using content::BrowserThread;
namespace {
-#if defined(OS_ANDROID)
-const size_t kWebRtcLogSize = 1 * 1024 * 1024; // 1 MB
-#else
-const size_t kWebRtcLogSize = 6 * 1024 * 1024; // 6 MB
-#endif
-
const char kLogNotStoppedOrNoLogOpen[] =
"Logging not stopped or no log open.";
@@ -108,8 +101,61 @@ void FormatMetaDataAsLogMessage(
message->resize(message->size() - 1);
}
+void FireGenericDoneCallback(
+ const WebRtcLoggingHandlerHost::GenericDoneCallback& callback,
+ bool success,
+ const std::string& error_message) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(!callback.is_null());
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(callback, success, error_message));
+}
+
+void FireAndResetGenericDoneCallback(
+ WebRtcLoggingHandlerHost::GenericDoneCallback* callback,
+ bool success,
+ const std::string& error_message) {
+ FireGenericDoneCallback(*callback, success, error_message);
+ callback->Reset();
+}
+
} // namespace
+WebRtcLogBuffer::WebRtcLogBuffer()
+ : buffer_(),
+ circular_(&buffer_[0], sizeof(buffer_), sizeof(buffer_) / 2, false),
+ read_only_(false) {
+}
+
+WebRtcLogBuffer::~WebRtcLogBuffer() {
+ DCHECK(read_only_ || thread_checker_.CalledOnValidThread());
+}
+
+void WebRtcLogBuffer::Log(const std::string& message) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(!read_only_);
+ circular_.Write(message.c_str(), message.length());
+ const char eol = '\n';
+ circular_.Write(&eol, 1);
+}
+
+PartialCircularBuffer WebRtcLogBuffer::Read() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(read_only_);
+ return PartialCircularBuffer(&buffer_[0], sizeof(buffer_));
+}
+
+void WebRtcLogBuffer::SetComplete() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(!read_only_) << "Already set? (programmer error)";
+ read_only_ = true;
+ // Detach from the current thread so that we can check reads on a different
+ // thread. This is to make sure that Read()s still happen on one thread only.
+ thread_checker_.DetachFromThread();
+}
+
WebRtcLoggingHandlerHost::WebRtcLoggingHandlerHost(Profile* profile)
: BrowserMessageFilter(WebRtcLoggingMsgStart),
profile_(profile),
@@ -121,26 +167,30 @@ WebRtcLoggingHandlerHost::WebRtcLoggingHandlerHost(Profile* profile)
WebRtcLoggingHandlerHost::~WebRtcLoggingHandlerHost() {}
void WebRtcLoggingHandlerHost::SetMetaData(
- const MetaDataMap& meta_data,
+ scoped_ptr<MetaDataMap> meta_data,
const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(!callback.is_null());
std::string error_message;
if (logging_state_ == CLOSED) {
- meta_data_ = meta_data;
+ if (!meta_data_.get())
+ meta_data_ = meta_data.Pass();
} else if (logging_state_ == STARTED) {
- meta_data_ = meta_data;
std::string meta_data_message;
- FormatMetaDataAsLogMessage(meta_data_, &meta_data_message);
+ FormatMetaDataAsLogMessage(*meta_data.get(), &meta_data_message);
LogToCircularBuffer(meta_data_message);
} else {
error_message = "Meta data must be set before stop or upload.";
}
- bool success = error_message.empty();
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
- base::Bind(callback, success,
- error_message));
+
+ if (error_message.empty() && meta_data.get()) {
+ // Keep the meta data around for uploading separately from the log.
+ for (const auto& it : *meta_data.get())
+ (*meta_data_.get())[it.first] = it.second;
+ }
+
+ FireGenericDoneCallback(callback, error_message.empty(), error_message);
}
void WebRtcLoggingHandlerHost::StartLogging(
@@ -148,14 +198,14 @@ void WebRtcLoggingHandlerHost::StartLogging(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(!callback.is_null());
- start_callback_ = callback;
if (logging_state_ != CLOSED) {
- FireGenericDoneCallback(&start_callback_, false, "A log is already open");
+ FireGenericDoneCallback(callback, false, "A log is already open");
return;
}
+
logging_state_ = STARTING;
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
- &WebRtcLoggingHandlerHost::StartLoggingIfAllowed, this));
+ &WebRtcLoggingHandlerHost::StartLoggingIfAllowed, this, callback));
}
void WebRtcLoggingHandlerHost::StopLogging(
@@ -163,11 +213,12 @@ void WebRtcLoggingHandlerHost::StopLogging(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(!callback.is_null());
- stop_callback_ = callback;
if (logging_state_ != STARTED) {
- FireGenericDoneCallback(&stop_callback_, false, "Logging not started");
+ FireGenericDoneCallback(callback, false, "Logging not started");
return;
}
+
+ stop_callback_ = callback;
logging_state_ = STOPPING;
Send(new WebRtcLoggingMsg_StopLogging());
}
@@ -184,14 +235,38 @@ void WebRtcLoggingHandlerHost::UploadLog(const UploadDoneCallback& callback) {
return;
}
- upload_callback_ = callback;
- logging_state_ = UPLOADING;
content::BrowserThread::PostTaskAndReplyWithResult(
content::BrowserThread::FILE,
FROM_HERE,
base::Bind(&WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists,
this),
- base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this));
+ base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this, callback));
+}
+
+void WebRtcLoggingHandlerHost::UploadStoredLog(
+ const std::string& log_id,
+ const UploadDoneCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(!callback.is_null());
+
+ content::BrowserThread::PostTask(content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&WebRtcLoggingHandlerHost::UploadStoredLogOnFileThread,
+ this, log_id, callback));
+}
+
+void WebRtcLoggingHandlerHost::UploadStoredLogOnFileThread(
+ const std::string& log_id,
+ const UploadDoneCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+
+ WebRtcLogUploadDoneData upload_data;
+ upload_data.log_path = GetLogDirectoryAndEnsureExists();
+ upload_data.callback = callback;
+ upload_data.host = this;
+ upload_data.local_log_id = log_id;
+
+ g_browser_process->webrtc_log_uploader()->UploadStoredLog(upload_data);
}
void WebRtcLoggingHandlerHost::UploadLogDone() {
@@ -203,19 +278,62 @@ void WebRtcLoggingHandlerHost::DiscardLog(const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(!callback.is_null());
- GenericDoneCallback discard_callback = callback;
if (logging_state_ != STOPPED) {
- FireGenericDoneCallback(&discard_callback, false,
- kLogNotStoppedOrNoLogOpen);
+ FireGenericDoneCallback(callback, false, kLogNotStoppedOrNoLogOpen);
return;
}
g_browser_process->webrtc_log_uploader()->LoggingStoppedDontUpload();
- circular_buffer_.reset();
log_buffer_.reset();
+ meta_data_.reset();
logging_state_ = CLOSED;
rtp_dump_handler_.reset();
stop_rtp_dump_callback_.Reset();
- FireGenericDoneCallback(&discard_callback, true, "");
+ FireGenericDoneCallback(callback, true, "");
+}
+
+// Stores the log locally using a hash of log_id + security origin.
+void WebRtcLoggingHandlerHost::StoreLog(
+ const std::string& log_id,
+ const GenericDoneCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(!callback.is_null());
+
+ if (logging_state_ != STOPPED) {
+ FireGenericDoneCallback(callback, false, kLogNotStoppedOrNoLogOpen);
+ return;
+ }
+
+ if (rtp_dump_handler_) {
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(stop_rtp_dump_callback_, true, true));
+
+ rtp_dump_handler_->StopOngoingDumps(
+ base::Bind(&WebRtcLoggingHandlerHost::StoreLogContinue,
+ this, log_id, callback));
+ return;
+ }
+
+ StoreLogContinue(log_id, callback);
+}
+
+void WebRtcLoggingHandlerHost::StoreLogContinue(
+ const std::string& log_id,
+ const GenericDoneCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(!callback.is_null());
+
+ scoped_ptr<WebRtcLogPaths> log_paths(new WebRtcLogPaths());
+ ReleaseRtpDumps(log_paths.get());
+
+ content::BrowserThread::PostTaskAndReplyWithResult(
+ content::BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists,
+ this),
+ base::Bind(&WebRtcLoggingHandlerHost::StoreLogInDirectory, this, log_id,
+ Passed(&log_paths), callback));
}
void WebRtcLoggingHandlerHost::LogMessage(const std::string& message) {
@@ -252,8 +370,7 @@ void WebRtcLoggingHandlerHost::StartRtpDump(
return;
}
- GenericDoneCallback start_callback = callback;
- DoStartRtpDump(type, &start_callback);
+ DoStartRtpDump(type, callback);
}
void WebRtcLoggingHandlerHost::StopRtpDump(
@@ -263,9 +380,7 @@ void WebRtcLoggingHandlerHost::StopRtpDump(
DCHECK(!callback.is_null());
if (!rtp_dump_handler_) {
- GenericDoneCallback stop_callback = callback;
- FireGenericDoneCallback(
- &stop_callback, false, "RTP dump has not been started.");
+ FireGenericDoneCallback(callback, false, "RTP dump has not been started.");
return;
}
@@ -317,7 +432,6 @@ void WebRtcLoggingHandlerHost::OnChannelClosing() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (logging_state_ == STARTED || logging_state_ == STOPPED) {
if (upload_log_on_render_close_) {
- logging_state_ = UPLOADING;
logging_started_time_ = base::Time();
content::BrowserThread::PostTaskAndReplyWithResult(
@@ -325,7 +439,8 @@ void WebRtcLoggingHandlerHost::OnChannelClosing() {
FROM_HERE,
base::Bind(&WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists,
this),
- base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this));
+ base::Bind(&WebRtcLoggingHandlerHost::TriggerUpload, this,
+ UploadDoneCallback()));
} else {
g_browser_process->webrtc_log_uploader()->LoggingStoppedDontUpload();
}
@@ -379,37 +494,46 @@ void WebRtcLoggingHandlerHost::OnLoggingStoppedInRenderer() {
}
logging_started_time_ = base::Time();
logging_state_ = STOPPED;
- FireGenericDoneCallback(&stop_callback_, true, "");
+ FireAndResetGenericDoneCallback(&stop_callback_, true, "");
}
-void WebRtcLoggingHandlerHost::StartLoggingIfAllowed() {
+void WebRtcLoggingHandlerHost::StartLoggingIfAllowed(
+ const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (!g_browser_process->webrtc_log_uploader()->ApplyForStartLogging()) {
- logging_state_ = CLOSED;
- FireGenericDoneCallback(
- &start_callback_, false, "Cannot start, maybe the maximum number of "
- "simultaneuos logs has been reached.");
- return;
- }
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
- &WebRtcLoggingHandlerHost::DoStartLogging, this));
+ &WebRtcLoggingHandlerHost::DoStartLogging, this,
+ g_browser_process->webrtc_log_uploader()->ApplyForStartLogging(),
+ callback));
}
-void WebRtcLoggingHandlerHost::DoStartLogging() {
+void WebRtcLoggingHandlerHost::DoStartLogging(
+ bool permissions_granted,
+ const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (logging_state_ != STARTING) {
+ FireGenericDoneCallback(callback, false, "Logging cancelled.");
+ return;
+ }
+
+ if (!permissions_granted) {
+ logging_state_ = CLOSED;
+ FireGenericDoneCallback(callback, false,
+ "Cannot start, maybe the maximum number of "
+ "simultaneuos logs has been reached.");
+ return;
+ }
- log_buffer_.reset(new unsigned char[kWebRtcLogSize]);
- circular_buffer_.reset(
- new PartialCircularBuffer(log_buffer_.get(),
- kWebRtcLogSize,
- kWebRtcLogSize / 2,
- false));
+ DCHECK(!log_buffer_.get());
+ log_buffer_.reset(new WebRtcLogBuffer());
+ if (!meta_data_.get())
+ meta_data_.reset(new MetaDataMap());
BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind(
- &WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread, this));
+ &WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread, this, callback));
}
-void WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread() {
+void WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread(
+ const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
net::NetworkInterfaceList network_list;
@@ -417,12 +541,18 @@ void WebRtcLoggingHandlerHost::LogInitialInfoOnFileThread() {
net::EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES);
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
- &WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread, this, network_list));
+ &WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread, this, network_list,
+ callback));
}
void WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread(
- const net::NetworkInterfaceList& network_list) {
+ const net::NetworkInterfaceList& network_list,
+ const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (logging_state_ != STARTING) {
+ FireGenericDoneCallback(callback, false, "Logging cancelled.");
+ return;
+ }
// Log start time (current time). We don't use base/i18n/time_formatting.h
// here because we don't want the format of the current locale.
@@ -433,9 +563,9 @@ void WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread(
now.day_of_month, now.hour, now.minute, now.second));
// Write metadata if received before logging started.
- if (!meta_data_.empty()) {
+ if (meta_data_.get() && !meta_data_->empty()) {
std::string info;
- FormatMetaDataAsLogMessage(meta_data_, &info);
+ FormatMetaDataAsLogMessage(*meta_data_.get(), &info);
LogToCircularBuffer(info);
}
@@ -502,23 +632,23 @@ void WebRtcLoggingHandlerHost::LogInitialInfoOnIOThread(
net::NetworkChangeNotifier::ConnectionTypeToString(it->type));
}
- NotifyLoggingStarted();
+ NotifyLoggingStarted(callback);
}
-void WebRtcLoggingHandlerHost::NotifyLoggingStarted() {
+void WebRtcLoggingHandlerHost::NotifyLoggingStarted(
+ const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK_EQ(logging_state_, STARTING);
Send(new WebRtcLoggingMsg_StartLogging());
logging_started_time_ = base::Time::Now();
logging_state_ = STARTED;
- FireGenericDoneCallback(&start_callback_, true, "");
+ FireGenericDoneCallback(callback, true, "");
}
void WebRtcLoggingHandlerHost::LogToCircularBuffer(const std::string& message) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(circular_buffer_.get());
- circular_buffer_->Write(message.c_str(), message.length());
- const char eol = '\n';
- circular_buffer_->Write(&eol, 1);
+ DCHECK_NE(logging_state_, CLOSED);
+ log_buffer_->Log(message);
}
base::FilePath WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists() {
@@ -534,9 +664,9 @@ base::FilePath WebRtcLoggingHandlerHost::GetLogDirectoryAndEnsureExists() {
}
void WebRtcLoggingHandlerHost::TriggerUpload(
+ const UploadDoneCallback& callback,
const base::FilePath& log_directory) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK_EQ(logging_state_, UPLOADING);
if (rtp_dump_handler_) {
BrowserThread::PostTask(
@@ -547,60 +677,57 @@ void WebRtcLoggingHandlerHost::TriggerUpload(
rtp_dump_handler_->StopOngoingDumps(
base::Bind(&WebRtcLoggingHandlerHost::DoUploadLogAndRtpDumps,
this,
- log_directory));
+ log_directory,
+ callback));
return;
}
- DoUploadLogAndRtpDumps(log_directory);
+ DoUploadLogAndRtpDumps(log_directory, callback);
}
-void WebRtcLoggingHandlerHost::DoUploadLogAndRtpDumps(
- const base::FilePath& log_directory) {
- WebRtcLogUploadDoneData upload_done_data;
- upload_done_data.log_path = log_directory;
+void WebRtcLoggingHandlerHost::StoreLogInDirectory(
+ const std::string& log_id,
+ scoped_ptr<WebRtcLogPaths> log_paths,
+ const GenericDoneCallback& done_callback,
+ const base::FilePath& directory) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ log_paths->log_path = directory;
- if (rtp_dump_handler_) {
- WebRtcRtpDumpHandler::ReleasedDumps rtp_dumps(
- rtp_dump_handler_->ReleaseDumps());
- upload_done_data.incoming_rtp_dump = rtp_dumps.incoming_dump_path;
- upload_done_data.outgoing_rtp_dump = rtp_dumps.outgoing_dump_path;
+ log_buffer_->SetComplete();
+ BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
+ base::Bind(&WebRtcLogUploader::LoggingStoppedDoStore,
+ base::Unretained(g_browser_process->webrtc_log_uploader()),
+ *log_paths.get(), log_id, Passed(&log_buffer_), Passed(&meta_data_),
+ done_callback));
- rtp_dump_handler_.reset();
- stop_rtp_dump_callback_.Reset();
- }
+ logging_state_ = CLOSED;
+}
+
+void WebRtcLoggingHandlerHost::DoUploadLogAndRtpDumps(
+ const base::FilePath& log_directory,
+ const UploadDoneCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- upload_done_data.callback = upload_callback_;
+ WebRtcLogUploadDoneData upload_done_data;
+ upload_done_data.log_path = log_directory;
+ upload_done_data.callback = callback;
upload_done_data.host = this;
- upload_callback_.Reset();
+ ReleaseRtpDumps(&upload_done_data);
+ log_buffer_->SetComplete();
BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind(
&WebRtcLogUploader::LoggingStoppedDoUpload,
base::Unretained(g_browser_process->webrtc_log_uploader()),
Passed(&log_buffer_),
- kWebRtcLogSize,
- meta_data_,
+ Passed(&meta_data_),
upload_done_data));
- meta_data_.clear();
- circular_buffer_.reset();
-}
-
-void WebRtcLoggingHandlerHost::FireGenericDoneCallback(
- GenericDoneCallback* callback,
- bool success,
- const std::string& error_message) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(!(*callback).is_null());
- content::BrowserThread::PostTask(
- content::BrowserThread::UI,
- FROM_HERE,
- base::Bind(*callback, success, error_message));
- (*callback).Reset();
+ logging_state_ = CLOSED;
}
void WebRtcLoggingHandlerHost::CreateRtpDumpHandlerAndStart(
RtpDumpType type,
- GenericDoneCallback callback,
+ const GenericDoneCallback& callback,
const base::FilePath& dump_dir) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -610,16 +737,33 @@ void WebRtcLoggingHandlerHost::CreateRtpDumpHandlerAndStart(
if (!rtp_dump_handler_)
rtp_dump_handler_.reset(new WebRtcRtpDumpHandler(dump_dir));
- DoStartRtpDump(type, &callback);
+ DoStartRtpDump(type, callback);
}
-void WebRtcLoggingHandlerHost::DoStartRtpDump(RtpDumpType type,
- GenericDoneCallback* callback) {
+void WebRtcLoggingHandlerHost::DoStartRtpDump(
+ RtpDumpType type, const GenericDoneCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(rtp_dump_handler_);
std::string error;
-
bool result = rtp_dump_handler_->StartDump(type, &error);
FireGenericDoneCallback(callback, result, error);
}
+
+bool WebRtcLoggingHandlerHost::ReleaseRtpDumps(WebRtcLogPaths* log_paths) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ DCHECK(log_paths);
+
+ if (!rtp_dump_handler_)
+ return false;
+
+ WebRtcRtpDumpHandler::ReleasedDumps rtp_dumps(
+ rtp_dump_handler_->ReleaseDumps());
+ log_paths->incoming_rtp_dump = rtp_dumps.incoming_dump_path;
+ log_paths->outgoing_rtp_dump = rtp_dumps.outgoing_dump_path;
+
+ rtp_dump_handler_.reset();
+ stop_rtp_dump_callback_.Reset();
+
+ return true;
+}
« no previous file with comments | « chrome/browser/media/webrtc_logging_handler_host.h ('k') | chrome/common/extensions/api/webrtc_logging_private.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698