summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjiayl@chromium.org <jiayl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-23 09:00:47 +0000
committerjiayl@chromium.org <jiayl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-23 09:00:47 +0000
commit94fb51044f14d5a2c97bbdebd9d8f4f6a1c05ff9 (patch)
tree780131636e430ae965b21f95caefe402e4de27ee
parent9b51b54bc515ea456ad38e6ed263f0fcbe970860 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/chrome_content_browser_client.cc5
-rw-r--r--chrome/browser/chrome_content_browser_client.h1
-rw-r--r--chrome/browser/media/chrome_webrtc_internals.cc91
-rw-r--r--chrome/browser/media/chrome_webrtc_internals.h47
-rw-r--r--chrome/browser/media/chrome_webrtc_internals_unittest.cc (renamed from content/browser/media/webrtc_internals_unittest.cc)38
-rw-r--r--chrome/browser/media/webrtc_internals_ui_observer.h (renamed from content/browser/media/webrtc_internals_ui_observer.h)12
-rw-r--r--chrome/browser/resources/webrtc_internals/webrtc_internals.html6
-rw-r--r--chrome/browser/resources/webrtc_internals/webrtc_internals.js39
-rw-r--r--chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc2
-rw-r--r--chrome/browser/ui/webui/media/webrtc_internals_message_handler.cc37
-rw-r--r--chrome/browser/ui/webui/media/webrtc_internals_message_handler.h31
-rw-r--r--chrome/browser/ui/webui/media/webrtc_internals_ui.cc (renamed from chrome/browser/ui/webui/webrtc_internals_ui.cc)5
-rw-r--r--chrome/browser/ui/webui/media/webrtc_internals_ui.h (renamed from chrome/browser/ui/webui/webrtc_internals_ui.h)6
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_browser_ui.gypi6
-rw-r--r--chrome/chrome_tests_unit.gypi1
-rw-r--r--content/browser/media/webrtc_internals.cc84
-rw-r--r--content/browser/media/webrtc_internals.h52
-rw-r--r--content/browser/renderer_host/media/peer_connection_tracker_host.cc27
-rw-r--r--content/browser/renderer_host/media/peer_connection_tracker_host.h3
-rw-r--r--content/content_browser.gypi2
-rw-r--r--content/content_tests.gypi1
-rw-r--r--content/public/browser/content_browser_client.cc4
-rw-r--r--content/public/browser/content_browser_client.h7
-rw-r--r--content/public/browser/webrtc_internals.h33
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_