diff options
author | jiayl@chromium.org <jiayl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-23 09:00:47 +0000 |
---|---|---|
committer | jiayl@chromium.org <jiayl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-23 09:00:47 +0000 |
commit | 94fb51044f14d5a2c97bbdebd9d8f4f6a1c05ff9 (patch) | |
tree | 780131636e430ae965b21f95caefe402e4de27ee | |
parent | 9b51b54bc515ea456ad38e6ed263f0fcbe970860 (diff) | |
download | chromium_src-94fb51044f14d5a2c97bbdebd9d8f4f6a1c05ff9.zip chromium_src-94fb51044f14d5a2c97bbdebd9d8f4f6a1c05ff9.tar.gz chromium_src-94fb51044f14d5a2c97bbdebd9d8f4f6a1c05ff9.tar.bz2 |
Connecting webrtc-internals WebUI frontend with the backend
BUG=168232
Review URL: https://chromiumcodereview.appspot.com/11876007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@178272 0039d316-1c4b-4281-b951-d872f2087c98
25 files changed, 355 insertions, 187 deletions
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 4e6c2cb..1b6b4d7 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -39,6 +39,7 @@ #include "chrome/browser/extensions/suggest_permission_util.h" #include "chrome/browser/geolocation/chrome_access_token_store.h" #include "chrome/browser/google/google_util.h" +#include "chrome/browser/media/chrome_webrtc_internals.h" #include "chrome/browser/media/media_internals.h" #include "chrome/browser/nacl_host/nacl_process_host.h" #include "chrome/browser/net/chrome_net_log.h" @@ -1307,6 +1308,10 @@ content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() { return MediaInternals::GetInstance(); } +content::WebRTCInternals* ChromeContentBrowserClient::GetWebRTCInternals() { + return ChromeWebRTCInternals::GetInstance(); +} + void ChromeContentBrowserClient::RequestDesktopNotificationPermission( const GURL& source_origin, int callback_context, diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index 129a5d6..7f83ed9 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h @@ -150,6 +150,7 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { int render_process_id, int render_view_id) OVERRIDE; virtual content::MediaObserver* GetMediaObserver() OVERRIDE; + virtual content::WebRTCInternals* GetWebRTCInternals() OVERRIDE; virtual void RequestDesktopNotificationPermission( const GURL& source_origin, int callback_context, diff --git a/chrome/browser/media/chrome_webrtc_internals.cc b/chrome/browser/media/chrome_webrtc_internals.cc new file mode 100644 index 0000000..ad4ca9c --- /dev/null +++ b/chrome/browser/media/chrome_webrtc_internals.cc @@ -0,0 +1,91 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/media/chrome_webrtc_internals.h" + +#include "chrome/browser/media/webrtc_internals_ui_observer.h" +#include "content/public/browser/browser_thread.h" + +using base::DictionaryValue; +using base::ProcessId; +using content::BrowserThread; +using std::string; + +ChromeWebRTCInternals::ChromeWebRTCInternals() { +} + +ChromeWebRTCInternals::~ChromeWebRTCInternals() { +} + +ChromeWebRTCInternals* ChromeWebRTCInternals::GetInstance() { + return Singleton<ChromeWebRTCInternals>::get(); +} + +void ChromeWebRTCInternals::AddPeerConnection(ProcessId pid, + int lid, + const string& url, + const string& servers, + const string& constraints) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + + DictionaryValue* dict = new DictionaryValue(); + if (!dict) + return; + + dict->SetInteger("pid", static_cast<int>(pid)); + dict->SetInteger("lid", lid); + dict->SetString("servers", servers); + dict->SetString("constraints", constraints); + dict->SetString("url", url); + peer_connection_data_.Append(dict); + + if (observers_.size() > 0) + SendUpdate("addPeerConnection", dict); +} + +void ChromeWebRTCInternals::RemovePeerConnection(ProcessId pid, int lid) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { + DictionaryValue* dict = NULL; + peer_connection_data_.GetDictionary(i, &dict); + + int this_pid = 0; + int this_lid = 0; + dict->GetInteger("pid", &this_pid); + dict->GetInteger("lid", &this_lid); + + if (this_pid != static_cast<int>(pid) || this_lid != lid) + continue; + + peer_connection_data_.Remove(i, NULL); + + if (observers_.size() > 0) { + DictionaryValue id; + id.SetInteger("pid", static_cast<int>(pid)); + id.SetInteger("lid", lid); + SendUpdate("removePeerConnection", &id); + } + return; + } +} + +void ChromeWebRTCInternals::AddObserver( + WebRTCInternalsUIObserver *observer) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + observers_.AddObserver(observer); +} + +void ChromeWebRTCInternals::RemoveObserver( + WebRTCInternalsUIObserver *observer) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + observers_.RemoveObserver(observer); +} + +void ChromeWebRTCInternals::SendUpdate(const string& command, Value* value) { + DCHECK(observers_.size() > 0); + + FOR_EACH_OBSERVER(WebRTCInternalsUIObserver, + observers_, + OnUpdate(command, value)); +} diff --git a/chrome/browser/media/chrome_webrtc_internals.h b/chrome/browser/media/chrome_webrtc_internals.h new file mode 100644 index 0000000..ce7cd0f --- /dev/null +++ b/chrome/browser/media/chrome_webrtc_internals.h @@ -0,0 +1,47 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_MEDIA_CHROME_WEBRTC_INTERNALS_H_ +#define CHROME_BROWSER_MEDIA_CHROME_WEBRTC_INTERNALS_H_ + +#include "base/memory/singleton.h" +#include "base/observer_list.h" +#include "base/process.h" +#include "base/values.h" +#include "content/public/browser/webrtc_internals.h" + +class WebRTCInternalsUIObserver; + +// This is a singleton class running in the browser UI thread. +// It collects peer connection infomation from the renderers, +// forwards the data to WebRTCInternalsUIObserver and +// sends data collecting commands to the renderers. +class ChromeWebRTCInternals : public content::WebRTCInternals { + public: + static ChromeWebRTCInternals* GetInstance(); + + virtual void AddPeerConnection(base::ProcessId pid, + int lid, + const std::string& url, + const std::string& servers, + const std::string& constraints) OVERRIDE; + virtual void RemovePeerConnection(base::ProcessId pid, int lid) OVERRIDE; + + // Methods for adding or removing WebRTCInternalsUIObserver. + void AddObserver(WebRTCInternalsUIObserver *observer); + void RemoveObserver(WebRTCInternalsUIObserver *observer); + + private: + friend struct DefaultSingletonTraits<ChromeWebRTCInternals>; + + ChromeWebRTCInternals(); + virtual ~ChromeWebRTCInternals(); + + void SendUpdate(const std::string& command, base::Value* value); + + ObserverList<WebRTCInternalsUIObserver> observers_; + base::ListValue peer_connection_data_; +}; + +#endif // CHROME_BROWSER_MEDIA_CHROME_WEBRTC_INTERNALS_H_ diff --git a/content/browser/media/webrtc_internals_unittest.cc b/chrome/browser/media/chrome_webrtc_internals_unittest.cc index 5206443..464e25c 100644 --- a/content/browser/media/webrtc_internals_unittest.cc +++ b/chrome/browser/media/chrome_webrtc_internals_unittest.cc @@ -5,14 +5,16 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" #include "base/values.h" -#include "content/browser/media/webrtc_internals.h" -#include "content/browser/media/webrtc_internals_ui_observer.h" -#include "content/common/media/peer_connection_tracker_messages.h" +#include "chrome/browser/media/chrome_webrtc_internals.h" +#include "chrome/browser/media/webrtc_internals_ui_observer.h" #include "content/public/test/test_browser_thread.h" #include "testing/gtest/include/gtest/gtest.h" -namespace content { -class MockWebRTCInternalsProxy : public content::WebRTCInternalsUIObserver { +static const std::string kContraints = "c"; +static const std::string kServers = "s"; +static const std::string kUrl = "u"; + +class MockWebRTCInternalsProxy : public WebRTCInternalsUIObserver { public: void OnUpdate(const std::string& command, const Value* value) OVERRIDE { data_ = command; @@ -29,21 +31,13 @@ class MockWebRTCInternalsProxy : public content::WebRTCInternalsUIObserver { class WebRTCInternalsTest : public testing::Test { public: WebRTCInternalsTest() - : io_thread_(content::BrowserThread::IO, &io_loop_) {} + : io_thread_(content::BrowserThread::UI, &io_loop_) {} protected: virtual void SetUp() { - webrtc_internals_ = WebRTCInternals::GetInstance(); + webrtc_internals_ = ChromeWebRTCInternals::GetInstance(); } - PeerConnectionInfo GetPeerConnectionInfo(uintptr_t lid) { - PeerConnectionInfo info; - info.lid = lid; - info.servers = "s"; - info.constraints = "c"; - info.url = "u"; - return info; - } std::string ExpectedInfo(std::string prefix, std::string id, std::string suffix) { @@ -56,7 +50,7 @@ class WebRTCInternalsTest : public testing::Test { MessageLoop io_loop_; content::TestBrowserThread io_thread_; - WebRTCInternals *webrtc_internals_; + ChromeWebRTCInternals *webrtc_internals_; }; TEST_F(WebRTCInternalsTest, GetInstance) { @@ -68,7 +62,7 @@ TEST_F(WebRTCInternalsTest, AddRemoveObserver) { new MockWebRTCInternalsProxy()); webrtc_internals_->AddObserver(observer.get()); webrtc_internals_->RemoveObserver(observer.get()); - webrtc_internals_->AddPeerConnection(3, GetPeerConnectionInfo(4)); + webrtc_internals_->AddPeerConnection(3, 4, kUrl, kServers, kContraints); EXPECT_EQ("", observer->data()); webrtc_internals_->RemovePeerConnection(3, 4); @@ -78,8 +72,8 @@ TEST_F(WebRTCInternalsTest, SendAddPeerConnectionUpdate) { scoped_ptr<MockWebRTCInternalsProxy> observer( new MockWebRTCInternalsProxy()); webrtc_internals_->AddObserver(observer.get()); - webrtc_internals_->AddPeerConnection(1, GetPeerConnectionInfo(2)); - EXPECT_EQ("updatePeerConnectionAdded", observer->data()); + webrtc_internals_->AddPeerConnection(1, 2, kUrl, kServers, kContraints); + EXPECT_EQ("addPeerConnection", observer->data()); webrtc_internals_->RemoveObserver(observer.get()); webrtc_internals_->RemovePeerConnection(1, 2); @@ -89,11 +83,9 @@ TEST_F(WebRTCInternalsTest, SendRemovePeerConnectionUpdate) { scoped_ptr<MockWebRTCInternalsProxy> observer( new MockWebRTCInternalsProxy()); webrtc_internals_->AddObserver(observer.get()); - webrtc_internals_->AddPeerConnection(1, GetPeerConnectionInfo(2)); + webrtc_internals_->AddPeerConnection(1, 2, kUrl, kServers, kContraints); webrtc_internals_->RemovePeerConnection(1, 2); - EXPECT_EQ("updatePeerConnectionRemoved", observer->data()); + EXPECT_EQ("removePeerConnection", observer->data()); webrtc_internals_->RemoveObserver(observer.get()); } - -} // namespace content diff --git a/content/browser/media/webrtc_internals_ui_observer.h b/chrome/browser/media/webrtc_internals_ui_observer.h index 44839df..e804183 100644 --- a/content/browser/media/webrtc_internals_ui_observer.h +++ b/chrome/browser/media/webrtc_internals_ui_observer.h @@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_UI_OBSERVER_H_ -#define CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_UI_OBSERVER_H_ +#ifndef CHROME_BROWSER_MEDIA_WEBRTC_INTERNALS_UI_OBSERVER_H_ +#define CHROME_BROWSER_MEDIA_WEBRTC_INTERNALS_UI_OBSERVER_H_ + +#include <string> namespace base { class Value; } // namespace base -namespace content { - // Implement this interface to receive WebRTCInternals updates. class WebRTCInternalsUIObserver { public: @@ -21,6 +21,4 @@ class WebRTCInternalsUIObserver { const base::Value* args) = 0; }; -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_UI_OBSERVER_H_ +#endif // CHROME_BROWSER_MEDIA_WEBRTC_INTERNALS_UI_OBSERVER_H_ diff --git a/chrome/browser/resources/webrtc_internals/webrtc_internals.html b/chrome/browser/resources/webrtc_internals/webrtc_internals.html index 5d085c8..af2a380 100644 --- a/chrome/browser/resources/webrtc_internals/webrtc_internals.html +++ b/chrome/browser/resources/webrtc_internals/webrtc_internals.html @@ -3,13 +3,11 @@ <head> <meta charset="utf-8"> <title>WebRTC Internals</title> + <script src="chrome://resources/js/util.js"></script> <script src="chrome://webrtc-internals/webrtc_internals.js"></script> </head> <body> - <p> - <span id="peer-connections-count">0</span> - <span> PeerConnection(s) in total</span> - </p> + <h2>WebRTC Internals</h2> <p> <ul id="peer-connections-list"> </ul> diff --git a/chrome/browser/resources/webrtc_internals/webrtc_internals.js b/chrome/browser/resources/webrtc_internals/webrtc_internals.js index 38ddb66..f9595a4 100644 --- a/chrome/browser/resources/webrtc_internals/webrtc_internals.js +++ b/chrome/browser/resources/webrtc_internals/webrtc_internals.js @@ -2,7 +2,46 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +var peerConnectionsListElem = null; + function initialize() { + peerConnectionsListElem = $('peer-connections-list'); +} + +function getPeerConnectionId(data) { + return data.pid + ':' + data.lid; +} + +// Makes sure a LI element representing a PeerConnection is created +// and appended to peerConnectionListElem. +function ensurePeerConnectionElement(id) { + var element = $(id); + if (!element) { + element = document.createElement('li'); + peerConnectionsListElem.appendChild(element); + element.id = id; + } + return element; +} + +// +// Browser message handlers +// + +function removePeerConnection(data) { + var element = $(getPeerConnectionId(data)); + if (element) + peerConnectionsListElem.removeChild(element); +} + +function addPeerConnection(data) { + var peerConnectionElement = ensurePeerConnectionElement( + getPeerConnectionId(data)); + peerConnectionElement.innerHTML = 'PeerConnection ' + + peerConnectionElement.id + '<br>' + + data.url + ', ' + + data.servers + ', ' + + data.constraints + '<br>'; } document.addEventListener('DOMContentLoaded', initialize); diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 3cbd2b6..3044241 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc @@ -35,6 +35,7 @@ #include "chrome/browser/ui/webui/instant_ui.h" #include "chrome/browser/ui/webui/local_omnibox_popup/local_omnibox_popup_ui.h" #include "chrome/browser/ui/webui/media/media_internals_ui.h" +#include "chrome/browser/ui/webui/media/webrtc_internals_ui.h" #if !defined(DISABLE_NACL) #include "chrome/browser/ui/webui/nacl_ui.h" #endif @@ -55,7 +56,6 @@ #include "chrome/browser/ui/webui/tracing_ui.h" #include "chrome/browser/ui/webui/user_actions/user_actions_ui.h" #include "chrome/browser/ui/webui/version_ui.h" -#include "chrome/browser/ui/webui/webrtc_internals_ui.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/extensions/feature_switch.h" diff --git a/chrome/browser/ui/webui/media/webrtc_internals_message_handler.cc b/chrome/browser/ui/webui/media/webrtc_internals_message_handler.cc new file mode 100644 index 0000000..15f8530 --- /dev/null +++ b/chrome/browser/ui/webui/media/webrtc_internals_message_handler.cc @@ -0,0 +1,37 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/media/webrtc_internals_message_handler.h" + +#include "chrome/browser/media/chrome_webrtc_internals.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui.h" + +using content::BrowserThread; + +WebRTCInternalsMessageHandler::WebRTCInternalsMessageHandler() { + ChromeWebRTCInternals::GetInstance()->AddObserver(this); +} + +WebRTCInternalsMessageHandler::~WebRTCInternalsMessageHandler() { + ChromeWebRTCInternals::GetInstance()->RemoveObserver(this); +} + +void WebRTCInternalsMessageHandler::RegisterMessages() { +} + +void WebRTCInternalsMessageHandler::OnUpdate(const std::string& command, + const base::Value* args) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + std::vector<const Value*> args_vector; + args_vector.push_back(args); + string16 update = content::WebUI::GetJavascriptCall(command, args_vector); + + content::RenderViewHost* host = + web_ui()->GetWebContents()->GetRenderViewHost(); + if (host) + host->ExecuteJavascriptInWebFrame(string16(), update); +} diff --git a/chrome/browser/ui/webui/media/webrtc_internals_message_handler.h b/chrome/browser/ui/webui/media/webrtc_internals_message_handler.h new file mode 100644 index 0000000..4eac33f --- /dev/null +++ b/chrome/browser/ui/webui/media/webrtc_internals_message_handler.h @@ -0,0 +1,31 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_WEBRTC_INTERNALS_MESSAGE_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_MEDIA_WEBRTC_INTERNALS_MESSAGE_HANDLER_H_ + +#include "base/memory/ref_counted.h" +#include "chrome/browser/media/webrtc_internals_ui_observer.h" +#include "content/public/browser/web_ui_message_handler.h" + +// This class handles messages to and from WebRTCInternalsUI. +// It delegates all its work to WebRTCInternalsProxy on the IO thread. +class WebRTCInternalsMessageHandler : public content::WebUIMessageHandler, + public WebRTCInternalsUIObserver{ + public: + WebRTCInternalsMessageHandler(); + virtual ~WebRTCInternalsMessageHandler(); + + // WebUIMessageHandler implementation. + virtual void RegisterMessages() OVERRIDE; + + // WebRTCInternalsUIObserver override. + virtual void OnUpdate(const std::string& command, + const base::Value* args) OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(WebRTCInternalsMessageHandler); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_MEDIA_WEBRTC_INTERNALS_MESSAGE_HANDLER_H_ diff --git a/chrome/browser/ui/webui/webrtc_internals_ui.cc b/chrome/browser/ui/webui/media/webrtc_internals_ui.cc index 9a61072..b5e7719 100644 --- a/chrome/browser/ui/webui/webrtc_internals_ui.cc +++ b/chrome/browser/ui/webui/media/webrtc_internals_ui.cc @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/webrtc_internals_ui.h" +#include "chrome/browser/ui/webui/media/webrtc_internals_ui.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/chrome_url_data_manager.h" #include "chrome/browser/ui/webui/chrome_web_ui_data_source.h" +#include "chrome/browser/ui/webui/media/webrtc_internals_message_handler.h" #include "chrome/common/url_constants.h" #include "content/public/browser/web_ui.h" #include "grit/browser_resources.h" @@ -35,6 +36,8 @@ content::WebUIDataSource* CreateWebRTCInternalsHTMLSource() { WebRTCInternalsUI::WebRTCInternalsUI(content::WebUI* web_ui) : WebUIController(web_ui) { + web_ui->AddMessageHandler(new WebRTCInternalsMessageHandler()); + Profile* profile = Profile::FromWebUI(web_ui); ChromeURLDataManager::AddWebUIDataSource(profile, CreateWebRTCInternalsHTMLSource()); diff --git a/chrome/browser/ui/webui/webrtc_internals_ui.h b/chrome/browser/ui/webui/media/webrtc_internals_ui.h index 2b7692c..2f5c582 100644 --- a/chrome/browser/ui/webui/webrtc_internals_ui.h +++ b/chrome/browser/ui/webui/media/webrtc_internals_ui.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_WEBRTC_INTERNALS_UI_H_ -#define CHROME_BROWSER_UI_WEBUI_WEBRTC_INTERNALS_UI_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_MEDIA_WEBRTC_INTERNALS_UI_H_ +#define CHROME_BROWSER_UI_WEBUI_MEDIA_WEBRTC_INTERNALS_UI_H_ #include "content/public/browser/web_ui_controller.h" @@ -16,4 +16,4 @@ class WebRTCInternalsUI : public content::WebUIController { DISALLOW_COPY_AND_ASSIGN(WebRTCInternalsUI); }; -#endif // CHROME_BROWSER_UI_WEBUI_WEBRTC_INTERNALS_UI_H_ +#endif // CHROME_BROWSER_UI_WEBUI_MEDIA_WEBRTC_INTERNALS_UI_H_ diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 2e3ec6d..a1bb05e 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1065,6 +1065,8 @@ 'browser/media_gallery/win/mtp_device_operations_util.h', 'browser/media_gallery/win/recursive_mtp_device_object_enumerator.cc', 'browser/media_gallery/win/recursive_mtp_device_object_enumerator.h', + 'browser/media/chrome_webrtc_internals.cc', + 'browser/media/chrome_webrtc_internals.h', 'browser/memory_details.cc', 'browser/memory_details.h', 'browser/memory_details_android.cc', diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 3631eec..e712f2c 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi @@ -1928,6 +1928,10 @@ 'browser/ui/webui/media/media_internals_proxy.h', 'browser/ui/webui/media/media_internals_ui.cc', 'browser/ui/webui/media/media_internals_ui.h', + 'browser/ui/webui/media/webrtc_internals_message_handler.cc', + 'browser/ui/webui/media/webrtc_internals_message_handler.h', + 'browser/ui/webui/media/webrtc_internals_ui.cc', + 'browser/ui/webui/media/webrtc_internals_ui.h', 'browser/ui/webui/metrics_handler.cc', 'browser/ui/webui/metrics_handler.h', 'browser/ui/webui/nacl_ui.cc', @@ -2155,8 +2159,6 @@ 'browser/ui/webui/version_handler_chromeos.h', 'browser/ui/webui/version_ui.cc', 'browser/ui/webui/version_ui.h', - 'browser/ui/webui/webrtc_internals_ui.cc', - 'browser/ui/webui/webrtc_internals_ui.h', 'browser/ui/webui/welcome_ui_android.cc', 'browser/ui/webui/welcome_ui_android.h', 'browser/ui/window_sizer/window_sizer.cc', diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 1b27269..d0efeed 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi @@ -849,6 +849,7 @@ 'browser/media_gallery/media_galleries_dialog_controller_mock.h', 'browser/media_gallery/media_galleries_preferences_unittest.cc', 'browser/media_gallery/media_gallery_database_unittest.cc', + 'browser/media/chrome_webrtc_internals_unittest.cc', 'browser/metrics/metrics_log_unittest.cc', 'browser/metrics/metrics_log_serializer_unittest.cc', 'browser/metrics/metrics_service_unittest.cc', diff --git a/content/browser/media/webrtc_internals.cc b/content/browser/media/webrtc_internals.cc deleted file mode 100644 index afd9d12..0000000 --- a/content/browser/media/webrtc_internals.cc +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/webrtc_internals.h" - -#include "content/browser/media/webrtc_internals_ui_observer.h" -#include "content/common/media/peer_connection_tracker_messages.h" -#include "content/public/browser/browser_thread.h" - -using base::DictionaryValue; -using base::ProcessId; - -namespace content{ - -WebRTCInternals::WebRTCInternals() { -} - -WebRTCInternals::~WebRTCInternals() { -} - -WebRTCInternals* WebRTCInternals::GetInstance() { - return Singleton<WebRTCInternals>::get(); -} - -void WebRTCInternals::AddPeerConnection(ProcessId pid, - const PeerConnectionInfo& info) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - if (observers_.size()) { - DictionaryValue* dict = new DictionaryValue(); - if (dict != NULL) { - dict->SetInteger("pid", static_cast<int>(pid)); - dict->SetInteger("lid", info.lid); - dict->SetString("servers", info.servers); - dict->SetString("constraints", info.constraints); - dict->SetString("url", info.url); - - SendUpdate("updatePeerConnectionAdded", dict); - peer_connection_data_.Append(dict); - } - } -} - -void WebRTCInternals::RemovePeerConnection(ProcessId pid, int lid) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - if (observers_.size()) { - DictionaryValue dict; - dict.SetInteger("pid", static_cast<int>(pid)); - dict.SetInteger("lid", lid); - SendUpdate("updatePeerConnectionRemoved", &dict); - - for (size_t i = 0; i < peer_connection_data_.GetSize(); ++i) { - DictionaryValue* dict = NULL; - peer_connection_data_.GetDictionary(i, &dict); - - int this_pid = 0; - int this_lid = 0; - dict->GetInteger("pid", &this_pid); - dict->GetInteger("lid", &this_lid); - if (this_pid == static_cast<int>(pid) && this_lid == lid) - peer_connection_data_.Remove(i, NULL); - } - } -} - -void WebRTCInternals::AddObserver(WebRTCInternalsUIObserver *observer) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - observers_.AddObserver(observer); -} - -void WebRTCInternals::RemoveObserver(WebRTCInternalsUIObserver *observer) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - observers_.RemoveObserver(observer); -} - -void WebRTCInternals::SendUpdate(const std::string& command, Value* value) { - DCHECK(observers_.size()); - - FOR_EACH_OBSERVER(WebRTCInternalsUIObserver, - observers_, - OnUpdate(command, value)); -} - -} // namespace content diff --git a/content/browser/media/webrtc_internals.h b/content/browser/media/webrtc_internals.h deleted file mode 100644 index 50db3da..0000000 --- a/content/browser/media/webrtc_internals.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_H_ -#define CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_H_ - -#include "base/memory/singleton.h" -#include "base/observer_list.h" -#include "base/process.h" -#include "base/values.h" -#include "content/common/content_export.h" - -struct PeerConnectionInfo; - -namespace content { - -class WebRTCInternalsUIObserver; - -// This is a singleton class running in the browser process. -// It collects peer connection infomation from the renderers, -// forwards the data to WebRTCInternalsUIObserver and -// sends data collecting commands to the renderers. -class CONTENT_EXPORT WebRTCInternals { - public: - static WebRTCInternals* GetInstance(); - - // Methods called when peer connection status changes. - void AddPeerConnection(base::ProcessId pid, const PeerConnectionInfo& info); - void RemovePeerConnection(base::ProcessId pid, int lid); - - // Methods for adding or removing WebRTCInternalsUIObserver. - void AddObserver(WebRTCInternalsUIObserver *observer); - void RemoveObserver(WebRTCInternalsUIObserver *observer); - - private: - friend struct DefaultSingletonTraits<WebRTCInternals>; - - WebRTCInternals(); - virtual ~WebRTCInternals(); - - // Send updates to observers on UI thread. - void SendUpdate(const std::string& command, base::Value* value); - - // Only the IO thread should access these fields. - ObserverList<WebRTCInternalsUIObserver> observers_; - base::ListValue peer_connection_data_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_H_ diff --git a/content/browser/renderer_host/media/peer_connection_tracker_host.cc b/content/browser/renderer_host/media/peer_connection_tracker_host.cc index d4a8ac6..ea69271 100644 --- a/content/browser/renderer_host/media/peer_connection_tracker_host.cc +++ b/content/browser/renderer_host/media/peer_connection_tracker_host.cc @@ -4,9 +4,9 @@ #include "content/browser/renderer_host/media/peer_connection_tracker_host.h" #include "base/process_util.h" -#include "content/browser/media/webrtc_internals.h" #include "content/common/media/peer_connection_tracker_messages.h" #include "content/public/browser/content_browser_client.h" +#include "content/public/browser/webrtc_internals.h" namespace content { @@ -16,6 +16,7 @@ PeerConnectionTrackerHost::PeerConnectionTrackerHost() { bool PeerConnectionTrackerHost::OnMessageReceived(const IPC::Message& message, bool* message_was_ok) { bool handled = true; + IPC_BEGIN_MESSAGE_MAP_EX(PeerConnectionTrackerHost, message, *message_was_ok) IPC_MESSAGE_HANDLER(PeerConnectionTrackerHost_AddPeerConnection, OnAddPeerConnection) @@ -26,18 +27,34 @@ bool PeerConnectionTrackerHost::OnMessageReceived(const IPC::Message& message, return handled; } +void PeerConnectionTrackerHost::OverrideThreadForMessage( + const IPC::Message& message, BrowserThread::ID* thread) { + if (IPC_MESSAGE_CLASS(message) == PeerConnectionTrackerMsgStart) + *thread = BrowserThread::UI; +} + PeerConnectionTrackerHost::~PeerConnectionTrackerHost() { } void PeerConnectionTrackerHost::OnAddPeerConnection( const PeerConnectionInfo& info) { - WebRTCInternals::GetInstance()->AddPeerConnection( - base::GetProcId(peer_handle()), info); + if (!GetContentClient()->browser()->GetWebRTCInternals()) + return; + + GetContentClient()->browser()->GetWebRTCInternals()-> + AddPeerConnection(base::GetProcId(peer_handle()), + info.lid, + info.url, + info.servers, + info.constraints); } void PeerConnectionTrackerHost::OnRemovePeerConnection(int lid) { - WebRTCInternals::GetInstance()->RemovePeerConnection( - base::GetProcId(peer_handle()), lid); + if (!GetContentClient()->browser()->GetWebRTCInternals()) + return; + + GetContentClient()->browser()->GetWebRTCInternals()-> + RemovePeerConnection(base::GetProcId(peer_handle()), lid); } } // namespace content diff --git a/content/browser/renderer_host/media/peer_connection_tracker_host.h b/content/browser/renderer_host/media/peer_connection_tracker_host.h index 58a36e0..271fc0d 100644 --- a/content/browser/renderer_host/media/peer_connection_tracker_host.h +++ b/content/browser/renderer_host/media/peer_connection_tracker_host.h @@ -10,7 +10,6 @@ struct PeerConnectionInfo; namespace content { -class WebRTCInternals; // This class is the host for PeerConnectionTracker in the browser process // managed by RenderProcessHostImpl. It passes IPC messages between @@ -22,6 +21,8 @@ class PeerConnectionTrackerHost : public BrowserMessageFilter { // content::BrowserMessageFilter override. virtual bool OnMessageReceived(const IPC::Message& message, bool* message_was_ok) OVERRIDE; + virtual void OverrideThreadForMessage(const IPC::Message& message, + BrowserThread::ID* thread) OVERRIDE; protected: virtual ~PeerConnectionTrackerHost(); diff --git a/content/content_browser.gypi b/content/content_browser.gypi index 205f0cd..eb6a979 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -968,8 +968,6 @@ }], ['enable_webrtc==1', { 'sources': [ - 'browser/media/webrtc_internals.cc', - 'browser/media/webrtc_internals.h', 'browser/renderer_host/media/peer_connection_tracker_host.cc', 'browser/renderer_host/media/peer_connection_tracker_host.h', 'browser/renderer_host/p2p/socket_host.cc', diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 719ff2b..9b286a3 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -537,7 +537,6 @@ }], ['enable_webrtc==1', { 'sources': [ - 'browser/media/webrtc_internals_unittest.cc', 'browser/renderer_host/p2p/socket_host_test_utils.h', 'browser/renderer_host/p2p/socket_host_tcp_unittest.cc', 'browser/renderer_host/p2p/socket_host_tcp_server_unittest.cc', diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index dcc127d..f377bbd 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc @@ -177,6 +177,10 @@ MediaObserver* ContentBrowserClient::GetMediaObserver() { return NULL; } +WebRTCInternals* ContentBrowserClient::GetWebRTCInternals() { + return NULL; +} + WebKit::WebNotificationPresenter::Permission ContentBrowserClient::CheckDesktopNotificationPermission( const GURL& source_origin, diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 2e3b3c7..5c0dd67 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h @@ -70,6 +70,7 @@ class SpeechRecognitionManagerDelegate; class WebContents; class WebContentsView; class WebContentsViewDelegate; +class WebRTCInternals; class WebUIControllerFactory; struct MainFunctionParams; struct ShowDesktopNotificationHostMsgParams; @@ -324,10 +325,14 @@ class CONTENT_EXPORT ContentBrowserClient { int render_process_id, int render_view_id) {} - // Returns a a class to get notifications about media event. The embedder can + // Returns a class to get notifications about media event. The embedder can // return NULL if they're not interested. virtual MediaObserver* GetMediaObserver(); + // Returns a class to get WebRTC updates. The embedder can return NULL if they + // are not interested. + virtual WebRTCInternals* GetWebRTCInternals(); + // Asks permission to show desktop notifications. virtual void RequestDesktopNotificationPermission( const GURL& source_origin, diff --git a/content/public/browser/webrtc_internals.h b/content/public/browser/webrtc_internals.h new file mode 100644 index 0000000..19eb5959 --- /dev/null +++ b/content/public/browser/webrtc_internals.h @@ -0,0 +1,33 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_BROWSER_WEBRTC_INTERNALS_H_ +#define CONTENT_PUBLIC_BROWSER_WEBRTC_INTERNALS_H_ + +#include "base/process.h" + +namespace content { +// This interface is used to receive WebRTC updates. +// An embedder may implement it and return it from ContentBrowserClient. +class WebRTCInternals { + public: + // This method is called when a PeerConnection is created. + // |pid| is the renderer process id, |lid| is the renderer local id used to + // identify a PeerConnection, |url| is the url of the tab owning the + // PeerConnection, |servers| is the servers configuration, |constraints| is + // the media constraints used to initialize the PeerConnection. + virtual void AddPeerConnection(base::ProcessId pid, + int lid, + const std::string& url, + const std::string& servers, + const std::string& constraints) = 0; + + // This method is called when PeerConnection is destroyed. + // |pid| is the renderer process id, |lid| is the renderer local id. + virtual void RemovePeerConnection(base::ProcessId pid, int lid) = 0; +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_WEBRTC_INTERNALSH_ |