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

Unified Diff: content/browser/media/webrtc_internals.cc

Issue 1676043002: Deliver webrtc-internals updates in bulk, every 500ms at most. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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: content/browser/media/webrtc_internals.cc
diff --git a/content/browser/media/webrtc_internals.cc b/content/browser/media/webrtc_internals.cc
index 40aa91baaec23615a1cccddf46369c8e1dc25a35..9269012500bedaa2e9a131dd95a2467c0f790a33 100644
--- a/content/browser/media/webrtc_internals.cc
+++ b/content/browser/media/webrtc_internals.cc
@@ -39,10 +39,22 @@ static base::ListValue* EnsureLogList(base::DictionaryValue* dict) {
} // namespace
+WebRTCInternals::PendingUpdate::PendingUpdate(
+ const std::string& command, scoped_ptr<base::Value> value)
+ : command_(command), value_(std::move(value)) {}
+
+WebRTCInternals::PendingUpdate::PendingUpdate(PendingUpdate&& other)
+ : command_(std::move(other.command_)),
+ value_(std::move(other.value_)) {}
+
+WebRTCInternals::PendingUpdate::~PendingUpdate() {}
+
WebRTCInternals::WebRTCInternals()
: audio_debug_recordings_(false),
event_log_recordings_(false),
- selecting_event_log_(false) {
+ selecting_event_log_(false),
+ pending_updates_queued_(false),
+ weak_factory_(this) {
// TODO(grunell): Shouldn't all the webrtc_internals* files be excluded from the
// build if WebRTC is disabled?
#if defined(ENABLE_WEBRTC)
@@ -82,9 +94,6 @@ void WebRTCInternals::OnAddPeerConnection(int render_process_id,
DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::DictionaryValue* dict = new base::DictionaryValue();
- if (!dict)
- return;
-
dict->SetInteger("rid", render_process_id);
dict->SetInteger("pid", static_cast<int>(pid));
dict->SetInteger("lid", lid);
@@ -95,7 +104,7 @@ void WebRTCInternals::OnAddPeerConnection(int render_process_id,
CreateOrReleasePowerSaveBlocker();
if (observers_.might_have_observers())
- SendUpdate("addPeerConnection", dict);
+ SendUpdate("addPeerConnection", dict->CreateDeepCopy());
Henrik Grunell 2016/02/08 09:52:08 Why do you need to create a deep copy? Could the o
tommi (sloooow) - chröme 2016/02/08 13:50:23 ownership of dict lies with peer_connection_data_
Henrik Grunell 2016/02/09 08:18:11 Acknowledged.
if (render_process_id_set_.insert(render_process_id).second) {
RenderProcessHost* host = RenderProcessHost::FromID(render_process_id);
@@ -122,10 +131,10 @@ void WebRTCInternals::OnRemovePeerConnection(ProcessId pid, int lid) {
CreateOrReleasePowerSaveBlocker();
if (observers_.might_have_observers()) {
- base::DictionaryValue id;
- id.SetInteger("pid", static_cast<int>(pid));
- id.SetInteger("lid", lid);
- SendUpdate("removePeerConnection", &id);
+ scoped_ptr<base::DictionaryValue> id(new base::DictionaryValue());
+ id->SetInteger("pid", static_cast<int>(pid));
+ id->SetInteger("lid", lid);
+ SendUpdate("removePeerConnection", std::move(id));
}
break;
}
@@ -163,12 +172,12 @@ void WebRTCInternals::OnUpdatePeerConnection(
log->Append(log_entry);
if (observers_.might_have_observers()) {
- base::DictionaryValue update;
- update.SetInteger("pid", static_cast<int>(pid));
- update.SetInteger("lid", lid);
- update.MergeDictionary(log_entry);
+ scoped_ptr<base::DictionaryValue> update(new base::DictionaryValue());
+ update->SetInteger("pid", static_cast<int>(pid));
+ update->SetInteger("lid", lid);
+ update->MergeDictionary(log_entry);
- SendUpdate("updatePeerConnection", &update);
+ SendUpdate("updatePeerConnection", std::move(update));
}
return;
}
@@ -179,17 +188,13 @@ void WebRTCInternals::OnAddStats(base::ProcessId pid, int lid,
if (!observers_.might_have_observers())
return;
- base::DictionaryValue dict;
- dict.SetInteger("pid", static_cast<int>(pid));
- dict.SetInteger("lid", lid);
-
- base::ListValue* list = value.DeepCopy();
- if (!list)
- return;
+ scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
+ dict->SetInteger("pid", static_cast<int>(pid));
+ dict->SetInteger("lid", lid);
- dict.Set("reports", list);
+ dict->Set("reports", value.CreateDeepCopy());
- SendUpdate("addStats", &dict);
+ SendUpdate("addStats", std::move(dict));
}
void WebRTCInternals::OnGetUserMedia(int rid,
@@ -213,7 +218,7 @@ void WebRTCInternals::OnGetUserMedia(int rid,
get_user_media_requests_.Append(dict);
if (observers_.might_have_observers())
- SendUpdate("addGetUserMedia", dict);
+ SendUpdate("addGetUserMedia", dict->CreateDeepCopy());
if (render_process_id_set_.insert(rid).second) {
RenderProcessHost* host = RenderProcessHost::FromID(rid);
@@ -222,12 +227,12 @@ void WebRTCInternals::OnGetUserMedia(int rid,
}
}
-void WebRTCInternals::AddObserver(WebRTCInternalsUIObserver *observer) {
+void WebRTCInternals::AddObserver(WebRTCInternalsUIObserver* observer) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
observers_.AddObserver(observer);
}
-void WebRTCInternals::RemoveObserver(WebRTCInternalsUIObserver *observer) {
+void WebRTCInternals::RemoveObserver(WebRTCInternalsUIObserver* observer) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
observers_.RemoveObserver(observer);
@@ -251,8 +256,8 @@ void WebRTCInternals::UpdateObserver(WebRTCInternalsUIObserver* observer) {
void WebRTCInternals::EnableAudioDebugRecordings(
content::WebContents* web_contents) {
-#if defined(ENABLE_WEBRTC)
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+#if defined(ENABLE_WEBRTC)
#if defined(OS_ANDROID)
EnableAudioDebugRecordingsOnAllRenderProcessHosts();
#else
@@ -273,8 +278,8 @@ void WebRTCInternals::EnableAudioDebugRecordings(
}
void WebRTCInternals::DisableAudioDebugRecordings() {
-#if defined(ENABLE_WEBRTC)
DCHECK_CURRENTLY_ON(BrowserThread::UI);
+#if defined(ENABLE_WEBRTC)
audio_debug_recordings_ = false;
// Tear down the dialog since the user has unchecked the audio debug
@@ -352,12 +357,20 @@ void WebRTCInternals::ResetForTesting() {
audio_debug_recordings_ = false;
}
-void WebRTCInternals::SendUpdate(const string& command, base::Value* value) {
+void WebRTCInternals::SendUpdate(const string& command,
+ scoped_ptr<base::Value> value) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(observers_.might_have_observers());
- FOR_EACH_OBSERVER(WebRTCInternalsUIObserver,
- observers_,
- OnUpdate(command, value));
+ pending_updates_.push(PendingUpdate(command, std::move(value)));
+
+ if (!pending_updates_queued_) {
Henrik Grunell 2016/02/08 09:52:08 Could you just check is queue is empty? (Before pu
tommi (sloooow) - chröme 2016/02/08 13:50:23 We won't be empty on entry in many cases. E.g. in
Henrik Grunell 2016/02/09 08:18:11 I don't really understand how this works I guess.
tommi (sloooow) - chröme 2016/02/09 09:34:16 Ah yes of course you're right, sorry I didn't get
Henrik Grunell 2016/02/09 11:47:47 Acknowledged.
+ BrowserThread::PostDelayedTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&WebRTCInternals::ProcessPendingUpdates,
+ weak_factory_.GetWeakPtr()),
+ base::TimeDelta::FromMilliseconds(500));
+ pending_updates_queued_ = true;
+ }
}
void WebRTCInternals::RenderProcessHostDestroyed(RenderProcessHost* host) {
@@ -412,10 +425,10 @@ void WebRTCInternals::OnRendererExit(int render_process_id) {
record->GetInteger("lid", &lid);
record->GetInteger("pid", &pid);
- base::DictionaryValue update;
- update.SetInteger("lid", lid);
- update.SetInteger("pid", pid);
- SendUpdate("removePeerConnection", &update);
+ scoped_ptr<base::DictionaryValue> update(new base::DictionaryValue());
+ update->SetInteger("lid", lid);
+ update->SetInteger("pid", pid);
+ SendUpdate("removePeerConnection", std::move(update));
}
peer_connection_data_.Remove(i, NULL);
}
@@ -439,9 +452,9 @@ void WebRTCInternals::OnRendererExit(int render_process_id) {
}
if (found_any && observers_.might_have_observers()) {
- base::DictionaryValue update;
- update.SetInteger("rid", render_process_id);
- SendUpdate("removeGetUserMediaForRenderer", &update);
+ scoped_ptr<base::DictionaryValue> update(new base::DictionaryValue());
+ update->SetInteger("rid", render_process_id);
+ SendUpdate("removeGetUserMediaForRenderer", std::move(update));
}
}
@@ -487,4 +500,16 @@ void WebRTCInternals::CreateOrReleasePowerSaveBlocker() {
}
}
+void WebRTCInternals::ProcessPendingUpdates() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ while (!pending_updates_.empty()) {
+ const auto& update = pending_updates_.front();
+ FOR_EACH_OBSERVER(WebRTCInternalsUIObserver,
+ observers_,
+ OnUpdate(update.command(), update.value()));
+ pending_updates_.pop();
+ }
+ pending_updates_queued_ = false;
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698