Index: content/browser/media/webrtc/webrtc_internals.cc |
diff --git a/content/browser/media/webrtc/webrtc_internals.cc b/content/browser/media/webrtc/webrtc_internals.cc |
index aa10c5e40bb406c3fb2d3e26453e8148eb85b094..f9652352dd0e3f06b685e8fb2089d94358103482 100644 |
--- a/content/browser/media/webrtc/webrtc_internals.cc |
+++ b/content/browser/media/webrtc/webrtc_internals.cc |
@@ -10,11 +10,19 @@ |
#include "build/build_config.h" |
#include "content/browser/media/webrtc/webrtc_internals_ui_observer.h" |
#include "content/browser/web_contents/web_contents_view.h" |
+#include "content/common/media/peer_connection_tracker_messages.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/power_save_blocker.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/web_contents.h" |
+#include "ipc/ipc_platform_file.h" |
+ |
+#if defined(OS_WIN) |
+#define IntToStringType base::IntToString16 |
+#else |
+#define IntToStringType base::IntToString |
+#endif |
using base::ProcessId; |
using std::string; |
@@ -37,6 +45,40 @@ static base::ListValue* EnsureLogList(base::DictionaryValue* dict) { |
return log; |
} |
+#if defined(ENABLE_WEBRTC) |
+// Creates a file used for handing over to the renderer. |
Henrik Grunell
2016/04/07 09:22:33
Webrtc internals is not the right place to handle
Ivo-OOO until feb 6
2016/04/07 12:10:50
Thanks for pointing that out, I was not aware of t
|
+IPC::PlatformFileForTransit CreateFileForProcess( |
+ const base::FilePath& file_path, |
+ base::ProcessHandle process) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ base::File event_log_file( |
+ file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND); |
+ if (!event_log_file.IsValid()) { |
+ VLOG(1) << "Could not open event log file, error=" |
+ << event_log_file.error_details(); |
+ return IPC::InvalidPlatformFileForTransit(); |
+ } |
+ return IPC::TakeFileHandleForProcess(std::move(event_log_file), process); |
+} |
+ |
+void SendEventLogFileToRenderer(int render_process_id, |
+ int local_id, |
+ IPC::PlatformFileForTransit file_for_transit) { |
+#if defined(OS_ANDROID) |
+ const int64_t max_file_size = 10000000; |
+#else |
+ const int64_t max_file_size = 30000000; |
+#endif |
+ if (file_for_transit == IPC::InvalidPlatformFileForTransit()) { |
+ return; |
+ } |
+ RenderProcessHost* rph = RenderProcessHost::FromID(render_process_id); |
+ if (rph) { |
+ rph->Send(new PeerConnectionTracker_StartEventLog( |
+ local_id, file_for_transit, max_file_size)); |
+ } |
+} |
+#endif |
} // namespace |
WebRTCInternals::PendingUpdate::PendingUpdate( |
@@ -67,6 +109,7 @@ WebRTCInternals::WebRTCInternals(int aggregate_updates_ms) |
: audio_debug_recordings_(false), |
event_log_recordings_(false), |
selecting_event_log_(false), |
+ number_event_log_files_(0), |
aggregate_updates_ms_(aggregate_updates_ms), |
weak_factory_(this) { |
// TODO(grunell): Shouldn't all the webrtc_internals* files be excluded from the |
@@ -117,6 +160,19 @@ void WebRTCInternals::OnAddPeerConnection(int render_process_id, |
peer_connection_data_.Append(dict); |
CreateOrReleasePowerSaveBlocker(); |
+ if (event_log_recordings_ && number_event_log_files_ > 0) { |
+ number_event_log_files_--; |
+ base::FilePath file_path = event_log_recordings_file_path_; |
+ file_path = file_path.AddExtension(IntToStringType(render_process_id)); |
+ file_path = file_path.AddExtension(IntToStringType(lid)); |
+ |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&CreateFileForProcess, file_path, |
+ base::GetCurrentProcessHandle()), |
+ base::Bind(&SendEventLogFileToRenderer, render_process_id, lid)); |
+ } |
+ |
if (observers_.might_have_observers()) |
SendUpdate("addPeerConnection", dict->CreateDeepCopy()); |
@@ -338,15 +394,23 @@ void WebRTCInternals::SetEventLogRecordings( |
#endif |
} else { |
event_log_recordings_ = false; |
+ number_event_log_files_ = 0; |
// Tear down the dialog since the user has unchecked the audio debug |
// recordings box. |
- select_file_dialog_ = nullptr; |
DCHECK(select_file_dialog_->HasOneRef()); |
+ select_file_dialog_ = nullptr; |
+ |
+ for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { |
+ base::DictionaryValue* record = NULL; |
+ peer_connection_data_.GetDictionary(i, &record); |
- for (RenderProcessHost::iterator i( |
- content::RenderProcessHost::AllHostsIterator()); |
- !i.IsAtEnd(); i.Advance()) { |
- i.GetCurrentValue()->DisableEventLogRecordings(); |
+ int rid, lid; |
+ record->GetInteger("rid", &rid); |
+ record->GetInteger("lid", &lid); |
+ auto rph = RenderProcessHost::FromID(rid); |
+ if (rph) { |
+ rph->Send(new PeerConnectionTracker_StopEventLog(lid)); |
+ } |
} |
} |
#endif |
@@ -467,6 +531,11 @@ void WebRTCInternals::OnRendererExit(int render_process_id) { |
void WebRTCInternals::EnableAudioDebugRecordingsOnAllRenderProcessHosts() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+#if defined(OS_ANDROID) |
+ number_event_log_files_ = 3; |
+#else |
+ number_event_log_files_ = 10; |
+#endif |
audio_debug_recordings_ = true; |
for (RenderProcessHost::iterator i( |
content::RenderProcessHost::AllHostsIterator()); |
@@ -480,11 +549,27 @@ void WebRTCInternals::EnableEventLogRecordingsOnAllRenderProcessHosts() { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
event_log_recordings_ = true; |
- for (RenderProcessHost::iterator i( |
- content::RenderProcessHost::AllHostsIterator()); |
- !i.IsAtEnd(); i.Advance()) { |
- i.GetCurrentValue()->EnableEventLogRecordings( |
- event_log_recordings_file_path_); |
+ for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { |
+ if (number_event_log_files_ <= 0) { |
+ VLOG(1) << "Maximum number of WebRTC event log files reached."; |
+ break; |
+ } |
+ number_event_log_files_--; |
+ base::DictionaryValue* record = NULL; |
+ peer_connection_data_.GetDictionary(i, &record); |
+ |
+ int rid, lid; |
+ record->GetInteger("rid", &rid); |
+ record->GetInteger("lid", &lid); |
+ base::FilePath file_path = event_log_recordings_file_path_; |
+ file_path = file_path.AddExtension(IntToStringType(rid)); |
+ file_path = file_path.AddExtension(IntToStringType(lid)); |
+ |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::FILE, FROM_HERE, |
+ base::Bind(&CreateFileForProcess, file_path, |
+ base::GetCurrentProcessHandle()), |
+ base::Bind(&SendEventLogFileToRenderer, rid, lid)); |
} |
} |
#endif |