| OLD | NEW | 
|    1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |    1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "content/browser/media/webrtc_internals.h" |    5 #include "content/browser/media/webrtc_internals.h" | 
|    6  |    6  | 
|    7 #include "base/strings/string_number_conversions.h" |    7 #include "base/strings/string_number_conversions.h" | 
|    8 #include "content/browser/media/webrtc_internals_ui_observer.h" |    8 #include "content/browser/media/webrtc_internals_ui_observer.h" | 
|    9 #include "content/browser/web_contents/web_contents_view.h" |    9 #include "content/browser/web_contents/web_contents_view.h" | 
|   10 #include "content/public/browser/browser_thread.h" |   10 #include "content/public/browser/browser_thread.h" | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   66 WebRTCInternals* WebRTCInternals::GetInstance() { |   66 WebRTCInternals* WebRTCInternals::GetInstance() { | 
|   67   return g_webrtc_internals.Pointer(); |   67   return g_webrtc_internals.Pointer(); | 
|   68 } |   68 } | 
|   69  |   69  | 
|   70 void WebRTCInternals::OnAddPeerConnection(int render_process_id, |   70 void WebRTCInternals::OnAddPeerConnection(int render_process_id, | 
|   71                                           ProcessId pid, |   71                                           ProcessId pid, | 
|   72                                           int lid, |   72                                           int lid, | 
|   73                                           const string& url, |   73                                           const string& url, | 
|   74                                           const string& rtc_configuration, |   74                                           const string& rtc_configuration, | 
|   75                                           const string& constraints) { |   75                                           const string& constraints) { | 
|   76   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |   76   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|   77  |   77  | 
|   78   base::DictionaryValue* dict = new base::DictionaryValue(); |   78   base::DictionaryValue* dict = new base::DictionaryValue(); | 
|   79   if (!dict) |   79   if (!dict) | 
|   80     return; |   80     return; | 
|   81  |   81  | 
|   82   dict->SetInteger("rid", render_process_id); |   82   dict->SetInteger("rid", render_process_id); | 
|   83   dict->SetInteger("pid", static_cast<int>(pid)); |   83   dict->SetInteger("pid", static_cast<int>(pid)); | 
|   84   dict->SetInteger("lid", lid); |   84   dict->SetInteger("lid", lid); | 
|   85   dict->SetString("rtcConfiguration", rtc_configuration); |   85   dict->SetString("rtcConfiguration", rtc_configuration); | 
|   86   dict->SetString("constraints", constraints); |   86   dict->SetString("constraints", constraints); | 
|   87   dict->SetString("url", url); |   87   dict->SetString("url", url); | 
|   88   peer_connection_data_.Append(dict); |   88   peer_connection_data_.Append(dict); | 
|   89   CreateOrReleasePowerSaveBlocker(); |   89   CreateOrReleasePowerSaveBlocker(); | 
|   90  |   90  | 
|   91   if (observers_.might_have_observers()) |   91   if (observers_.might_have_observers()) | 
|   92     SendUpdate("addPeerConnection", dict); |   92     SendUpdate("addPeerConnection", dict); | 
|   93 } |   93 } | 
|   94  |   94  | 
|   95 void WebRTCInternals::OnRemovePeerConnection(ProcessId pid, int lid) { |   95 void WebRTCInternals::OnRemovePeerConnection(ProcessId pid, int lid) { | 
|   96   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |   96   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|   97   for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { |   97   for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { | 
|   98     base::DictionaryValue* dict = NULL; |   98     base::DictionaryValue* dict = NULL; | 
|   99     peer_connection_data_.GetDictionary(i, &dict); |   99     peer_connection_data_.GetDictionary(i, &dict); | 
|  100  |  100  | 
|  101     int this_pid = 0; |  101     int this_pid = 0; | 
|  102     int this_lid = 0; |  102     int this_lid = 0; | 
|  103     dict->GetInteger("pid", &this_pid); |  103     dict->GetInteger("pid", &this_pid); | 
|  104     dict->GetInteger("lid", &this_lid); |  104     dict->GetInteger("lid", &this_lid); | 
|  105  |  105  | 
|  106     if (this_pid != static_cast<int>(pid) || this_lid != lid) |  106     if (this_pid != static_cast<int>(pid) || this_lid != lid) | 
|  107       continue; |  107       continue; | 
|  108  |  108  | 
|  109     peer_connection_data_.Remove(i, NULL); |  109     peer_connection_data_.Remove(i, NULL); | 
|  110     CreateOrReleasePowerSaveBlocker(); |  110     CreateOrReleasePowerSaveBlocker(); | 
|  111  |  111  | 
|  112     if (observers_.might_have_observers()) { |  112     if (observers_.might_have_observers()) { | 
|  113       base::DictionaryValue id; |  113       base::DictionaryValue id; | 
|  114       id.SetInteger("pid", static_cast<int>(pid)); |  114       id.SetInteger("pid", static_cast<int>(pid)); | 
|  115       id.SetInteger("lid", lid); |  115       id.SetInteger("lid", lid); | 
|  116       SendUpdate("removePeerConnection", &id); |  116       SendUpdate("removePeerConnection", &id); | 
|  117     } |  117     } | 
|  118     break; |  118     break; | 
|  119   } |  119   } | 
|  120 } |  120 } | 
|  121  |  121  | 
|  122 void WebRTCInternals::OnUpdatePeerConnection( |  122 void WebRTCInternals::OnUpdatePeerConnection( | 
|  123     ProcessId pid, int lid, const string& type, const string& value) { |  123     ProcessId pid, int lid, const string& type, const string& value) { | 
|  124   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  124   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  125  |  125  | 
|  126   for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { |  126   for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { | 
|  127     base::DictionaryValue* record = NULL; |  127     base::DictionaryValue* record = NULL; | 
|  128     peer_connection_data_.GetDictionary(i, &record); |  128     peer_connection_data_.GetDictionary(i, &record); | 
|  129  |  129  | 
|  130     int this_pid = 0, this_lid = 0; |  130     int this_pid = 0, this_lid = 0; | 
|  131     record->GetInteger("pid", &this_pid); |  131     record->GetInteger("pid", &this_pid); | 
|  132     record->GetInteger("lid", &this_lid); |  132     record->GetInteger("lid", &this_lid); | 
|  133  |  133  | 
|  134     if (this_pid != static_cast<int>(pid) || this_lid != lid) |  134     if (this_pid != static_cast<int>(pid) || this_lid != lid) | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  180   SendUpdate("addStats", &dict); |  180   SendUpdate("addStats", &dict); | 
|  181 } |  181 } | 
|  182  |  182  | 
|  183 void WebRTCInternals::OnGetUserMedia(int rid, |  183 void WebRTCInternals::OnGetUserMedia(int rid, | 
|  184                                      base::ProcessId pid, |  184                                      base::ProcessId pid, | 
|  185                                      const std::string& origin, |  185                                      const std::string& origin, | 
|  186                                      bool audio, |  186                                      bool audio, | 
|  187                                      bool video, |  187                                      bool video, | 
|  188                                      const std::string& audio_constraints, |  188                                      const std::string& audio_constraints, | 
|  189                                      const std::string& video_constraints) { |  189                                      const std::string& video_constraints) { | 
|  190   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  190   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  191  |  191  | 
|  192   base::DictionaryValue* dict = new base::DictionaryValue(); |  192   base::DictionaryValue* dict = new base::DictionaryValue(); | 
|  193   dict->SetInteger("rid", rid); |  193   dict->SetInteger("rid", rid); | 
|  194   dict->SetInteger("pid", static_cast<int>(pid)); |  194   dict->SetInteger("pid", static_cast<int>(pid)); | 
|  195   dict->SetString("origin", origin); |  195   dict->SetString("origin", origin); | 
|  196   if (audio) |  196   if (audio) | 
|  197     dict->SetString("audio", audio_constraints); |  197     dict->SetString("audio", audio_constraints); | 
|  198   if (video) |  198   if (video) | 
|  199     dict->SetString("video", video_constraints); |  199     dict->SetString("video", video_constraints); | 
|  200  |  200  | 
|  201   get_user_media_requests_.Append(dict); |  201   get_user_media_requests_.Append(dict); | 
|  202  |  202  | 
|  203   if (observers_.might_have_observers()) |  203   if (observers_.might_have_observers()) | 
|  204     SendUpdate("addGetUserMedia", dict); |  204     SendUpdate("addGetUserMedia", dict); | 
|  205 } |  205 } | 
|  206  |  206  | 
|  207 void WebRTCInternals::AddObserver(WebRTCInternalsUIObserver *observer) { |  207 void WebRTCInternals::AddObserver(WebRTCInternalsUIObserver *observer) { | 
|  208   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  208   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  209   observers_.AddObserver(observer); |  209   observers_.AddObserver(observer); | 
|  210 } |  210 } | 
|  211  |  211  | 
|  212 void WebRTCInternals::RemoveObserver(WebRTCInternalsUIObserver *observer) { |  212 void WebRTCInternals::RemoveObserver(WebRTCInternalsUIObserver *observer) { | 
|  213   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  213   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  214   observers_.RemoveObserver(observer); |  214   observers_.RemoveObserver(observer); | 
|  215  |  215  | 
|  216   // Disables the AEC recording if it is enabled and the last webrtc-internals |  216   // Disables the AEC recording if it is enabled and the last webrtc-internals | 
|  217   // page is going away. |  217   // page is going away. | 
|  218   if (aec_dump_enabled_ && !observers_.might_have_observers()) |  218   if (aec_dump_enabled_ && !observers_.might_have_observers()) | 
|  219     DisableAecDump(); |  219     DisableAecDump(); | 
|  220 } |  220 } | 
|  221  |  221  | 
|  222 void WebRTCInternals::UpdateObserver(WebRTCInternalsUIObserver* observer) { |  222 void WebRTCInternals::UpdateObserver(WebRTCInternalsUIObserver* observer) { | 
|  223   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  223   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  224   if (peer_connection_data_.GetSize() > 0) |  224   if (peer_connection_data_.GetSize() > 0) | 
|  225     observer->OnUpdate("updateAllPeerConnections", &peer_connection_data_); |  225     observer->OnUpdate("updateAllPeerConnections", &peer_connection_data_); | 
|  226  |  226  | 
|  227   for (base::ListValue::iterator it = get_user_media_requests_.begin(); |  227   for (base::ListValue::iterator it = get_user_media_requests_.begin(); | 
|  228        it != get_user_media_requests_.end(); |  228        it != get_user_media_requests_.end(); | 
|  229        ++it) { |  229        ++it) { | 
|  230     observer->OnUpdate("addGetUserMedia", *it); |  230     observer->OnUpdate("addGetUserMedia", *it); | 
|  231   } |  231   } | 
|  232 } |  232 } | 
|  233  |  233  | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  259  |  259  | 
|  260   for (RenderProcessHost::iterator i( |  260   for (RenderProcessHost::iterator i( | 
|  261            content::RenderProcessHost::AllHostsIterator()); |  261            content::RenderProcessHost::AllHostsIterator()); | 
|  262        !i.IsAtEnd(); i.Advance()) { |  262        !i.IsAtEnd(); i.Advance()) { | 
|  263     i.GetCurrentValue()->DisableAecDump(); |  263     i.GetCurrentValue()->DisableAecDump(); | 
|  264   } |  264   } | 
|  265 #endif |  265 #endif | 
|  266 } |  266 } | 
|  267  |  267  | 
|  268 void WebRTCInternals::ResetForTesting() { |  268 void WebRTCInternals::ResetForTesting() { | 
|  269   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  269   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  270   observers_.Clear(); |  270   observers_.Clear(); | 
|  271   peer_connection_data_.Clear(); |  271   peer_connection_data_.Clear(); | 
|  272   CreateOrReleasePowerSaveBlocker(); |  272   CreateOrReleasePowerSaveBlocker(); | 
|  273   get_user_media_requests_.Clear(); |  273   get_user_media_requests_.Clear(); | 
|  274   aec_dump_enabled_ = false; |  274   aec_dump_enabled_ = false; | 
|  275 } |  275 } | 
|  276  |  276  | 
|  277 void WebRTCInternals::SendUpdate(const string& command, base::Value* value) { |  277 void WebRTCInternals::SendUpdate(const string& command, base::Value* value) { | 
|  278   DCHECK(observers_.might_have_observers()); |  278   DCHECK(observers_.might_have_observers()); | 
|  279  |  279  | 
|  280   FOR_EACH_OBSERVER(WebRTCInternalsUIObserver, |  280   FOR_EACH_OBSERVER(WebRTCInternalsUIObserver, | 
|  281                     observers_, |  281                     observers_, | 
|  282                     OnUpdate(command, value)); |  282                     OnUpdate(command, value)); | 
|  283 } |  283 } | 
|  284  |  284  | 
|  285 void WebRTCInternals::Observe(int type, |  285 void WebRTCInternals::Observe(int type, | 
|  286                               const NotificationSource& source, |  286                               const NotificationSource& source, | 
|  287                               const NotificationDetails& details) { |  287                               const NotificationDetails& details) { | 
|  288   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  288   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  289   DCHECK_EQ(type, NOTIFICATION_RENDERER_PROCESS_TERMINATED); |  289   DCHECK_EQ(type, NOTIFICATION_RENDERER_PROCESS_TERMINATED); | 
|  290   OnRendererExit(Source<RenderProcessHost>(source)->GetID()); |  290   OnRendererExit(Source<RenderProcessHost>(source)->GetID()); | 
|  291 } |  291 } | 
|  292  |  292  | 
|  293 void WebRTCInternals::FileSelected(const base::FilePath& path, |  293 void WebRTCInternals::FileSelected(const base::FilePath& path, | 
|  294                                    int /* unused_index */, |  294                                    int /* unused_index */, | 
|  295                                    void* /*unused_params */) { |  295                                    void* /*unused_params */) { | 
|  296 #if defined(ENABLE_WEBRTC) |  296 #if defined(ENABLE_WEBRTC) | 
|  297   aec_dump_file_path_ = path; |  297   aec_dump_file_path_ = path; | 
|  298   EnableAecDumpOnAllRenderProcessHosts(); |  298   EnableAecDumpOnAllRenderProcessHosts(); | 
|  299 #endif |  299 #endif | 
|  300 } |  300 } | 
|  301  |  301  | 
|  302 void WebRTCInternals::FileSelectionCanceled(void* params) { |  302 void WebRTCInternals::FileSelectionCanceled(void* params) { | 
|  303 #if defined(ENABLE_WEBRTC) |  303 #if defined(ENABLE_WEBRTC) | 
|  304   SendUpdate("aecRecordingFileSelectionCancelled", NULL); |  304   SendUpdate("aecRecordingFileSelectionCancelled", NULL); | 
|  305 #endif |  305 #endif | 
|  306 } |  306 } | 
|  307  |  307  | 
|  308 void WebRTCInternals::OnRendererExit(int render_process_id) { |  308 void WebRTCInternals::OnRendererExit(int render_process_id) { | 
|  309   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  309   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  310  |  310  | 
|  311   // Iterates from the end of the list to remove the PeerConnections created |  311   // Iterates from the end of the list to remove the PeerConnections created | 
|  312   // by the exitting renderer. |  312   // by the exitting renderer. | 
|  313   for (int i = peer_connection_data_.GetSize() - 1; i >= 0; --i) { |  313   for (int i = peer_connection_data_.GetSize() - 1; i >= 0; --i) { | 
|  314     base::DictionaryValue* record = NULL; |  314     base::DictionaryValue* record = NULL; | 
|  315     peer_connection_data_.GetDictionary(i, &record); |  315     peer_connection_data_.GetDictionary(i, &record); | 
|  316  |  316  | 
|  317     int this_rid = 0; |  317     int this_rid = 0; | 
|  318     record->GetInteger("rid", &this_rid); |  318     record->GetInteger("rid", &this_rid); | 
|  319  |  319  | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  361   aec_dump_enabled_ = true; |  361   aec_dump_enabled_ = true; | 
|  362   for (RenderProcessHost::iterator i( |  362   for (RenderProcessHost::iterator i( | 
|  363            content::RenderProcessHost::AllHostsIterator()); |  363            content::RenderProcessHost::AllHostsIterator()); | 
|  364        !i.IsAtEnd(); i.Advance()) { |  364        !i.IsAtEnd(); i.Advance()) { | 
|  365     i.GetCurrentValue()->EnableAecDump(aec_dump_file_path_); |  365     i.GetCurrentValue()->EnableAecDump(aec_dump_file_path_); | 
|  366   } |  366   } | 
|  367 } |  367 } | 
|  368 #endif |  368 #endif | 
|  369  |  369  | 
|  370 void WebRTCInternals::CreateOrReleasePowerSaveBlocker() { |  370 void WebRTCInternals::CreateOrReleasePowerSaveBlocker() { | 
|  371   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  371   DCHECK_CURRENTLY_ON(BrowserThread::UI); | 
|  372  |  372  | 
|  373   if (peer_connection_data_.empty() && power_save_blocker_) { |  373   if (peer_connection_data_.empty() && power_save_blocker_) { | 
|  374     DVLOG(1) << ("Releasing the block on application suspension since no " |  374     DVLOG(1) << ("Releasing the block on application suspension since no " | 
|  375                  "PeerConnections are active anymore."); |  375                  "PeerConnections are active anymore."); | 
|  376     power_save_blocker_.reset(); |  376     power_save_blocker_.reset(); | 
|  377   } else if (!peer_connection_data_.empty() && !power_save_blocker_) { |  377   } else if (!peer_connection_data_.empty() && !power_save_blocker_) { | 
|  378     DVLOG(1) << ("Preventing the application from being suspended while one or " |  378     DVLOG(1) << ("Preventing the application from being suspended while one or " | 
|  379                  "more PeerConnections are active."); |  379                  "more PeerConnections are active."); | 
|  380     power_save_blocker_ = |  380     power_save_blocker_ = | 
|  381         content::PowerSaveBlocker::Create( |  381         content::PowerSaveBlocker::Create( | 
|  382             PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, |  382             PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, | 
|  383             PowerSaveBlocker::kReasonOther, |  383             PowerSaveBlocker::kReasonOther, | 
|  384             "WebRTC has active PeerConnections").Pass(); |  384             "WebRTC has active PeerConnections").Pass(); | 
|  385   } |  385   } | 
|  386 } |  386 } | 
|  387  |  387  | 
|  388 }  // namespace content |  388 }  // namespace content | 
| OLD | NEW |