1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
// 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/gtest_prod_util.h"
#include "base/lazy_instance.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "base/process/process.h"
#include "base/values.h"
#include "content/common/content_export.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "ui/shell_dialogs/select_file_dialog.h"
namespace content {
class PowerSaveBlocker;
class WebContents;
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 CONTENT_EXPORT WebRTCInternals : public NotificationObserver,
public ui::SelectFileDialog::Listener {
public:
static WebRTCInternals* GetInstance();
// This method is called when a PeerConnection is created.
// |render_process_id| is the id of the render process (not OS pid), which is
// needed because we might not be able to get the OS process id when the
// render process terminates and we want to clean up.
// |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, |rtc_configuration| is the serialized RTCConfiguration,
// |constraints| is the media constraints used to initialize the
// PeerConnection.
void OnAddPeerConnection(int render_process_id,
base::ProcessId pid,
int lid,
const std::string& url,
const std::string& rtc_configuration,
const std::string& constraints);
// This method is called when PeerConnection is destroyed.
// |pid| is the renderer process id, |lid| is the renderer local id.
void OnRemovePeerConnection(base::ProcessId pid, int lid);
// This method is called when a PeerConnection is updated.
// |pid| is the renderer process id, |lid| is the renderer local id,
// |type| is the update type, |value| is the detail of the update.
void OnUpdatePeerConnection(base::ProcessId pid,
int lid,
const std::string& type,
const std::string& value);
// This method is called when results from PeerConnectionInterface::GetStats
// are available. |pid| is the renderer process id, |lid| is the renderer
// local id, |value| is the list of stats reports.
void OnAddStats(base::ProcessId pid, int lid, const base::ListValue& value);
// This method is called when getUserMedia is called. |render_process_id| is
// the id of the render process (not OS pid), which is needed because we might
// not be able to get the OS process id when the render process terminates and
// we want to clean up. |pid| is the renderer OS process id, |origin| is the
// security origin of the getUserMedia call, |audio| is true if audio stream
// is requested, |video| is true if the video stream is requested,
// |audio_constraints| is the constraints for the audio, |video_constraints|
// is the constraints for the video.
void OnGetUserMedia(int render_process_id,
base::ProcessId pid,
const std::string& origin,
bool audio,
bool video,
const std::string& audio_constraints,
const std::string& video_constraints);
// Methods for adding or removing WebRTCInternalsUIObserver.
void AddObserver(WebRTCInternalsUIObserver *observer);
void RemoveObserver(WebRTCInternalsUIObserver *observer);
// Sends all update data to |observer|.
void UpdateObserver(WebRTCInternalsUIObserver* observer);
// Enables or disables AEC dump (diagnostic echo canceller recording).
void EnableAecDump(content::WebContents* web_contents);
void DisableAecDump();
bool aec_dump_enabled() {
return aec_dump_enabled_;
}
base::FilePath aec_dump_file_path() {
return aec_dump_file_path_;
}
void ResetForTesting();
private:
friend struct base::DefaultLazyInstanceTraits<WebRTCInternals>;
FRIEND_TEST_ALL_PREFIXES(WebRtcAecDumpBrowserTest, CallWithAecDump);
FRIEND_TEST_ALL_PREFIXES(WebRtcAecDumpBrowserTest,
CallWithAecDumpEnabledThenDisabled);
FRIEND_TEST_ALL_PREFIXES(WebRtcAecDumpBrowserTest, TwoCallsWithAecDump);
FRIEND_TEST_ALL_PREFIXES(WebRTCInternalsTest,
AecRecordingFileSelectionCanceled);
WebRTCInternals();
~WebRTCInternals() override;
void SendUpdate(const std::string& command, base::Value* value);
// NotificationObserver implementation.
void Observe(int type,
const NotificationSource& source,
const NotificationDetails& details) override;
// ui::SelectFileDialog::Listener implementation.
void FileSelected(const base::FilePath& path,
int index,
void* unused_params) override;
void FileSelectionCanceled(void* params) override;
// Called when a renderer exits (including crashes).
void OnRendererExit(int render_process_id);
#if defined(ENABLE_WEBRTC)
// Enables AEC dump on all render process hosts using |aec_dump_file_path_|.
void EnableAecDumpOnAllRenderProcessHosts();
#endif
// Called whenever an element is added to or removed from
// |peer_connection_data_| to impose/release a block on suspending the current
// application for power-saving.
void CreateOrReleasePowerSaveBlocker();
ObserverList<WebRTCInternalsUIObserver> observers_;
// |peer_connection_data_| is a list containing all the PeerConnection
// updates.
// Each item of the list represents the data for one PeerConnection, which
// contains these fields:
// "rid" -- the renderer id.
// "pid" -- OS process id of the renderer that creates the PeerConnection.
// "lid" -- local Id assigned to the PeerConnection.
// "url" -- url of the web page that created the PeerConnection.
// "servers" and "constraints" -- server configuration and media constraints
// used to initialize the PeerConnection respectively.
// "log" -- a ListValue contains all the updates for the PeerConnection. Each
// list item is a DictionaryValue containing "time", which is the number of
// milliseconds since epoch as a string, and "type" and "value", both of which
// are strings representing the event.
base::ListValue peer_connection_data_;
// A list of getUserMedia requests. Each item is a DictionaryValue that
// contains these fields:
// "rid" -- the renderer id.
// "pid" -- proceddId of the renderer.
// "origin" -- the security origin of the request.
// "audio" -- the serialized audio constraints if audio is requested.
// "video" -- the serialized video constraints if video is requested.
base::ListValue get_user_media_requests_;
NotificationRegistrar registrar_;
// For managing select file dialog.
scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
// AEC dump (diagnostic echo canceller recording) state.
bool aec_dump_enabled_;
base::FilePath aec_dump_file_path_;
// While |peer_connection_data_| is non-empty, hold an instance of
// PowerSaveBlocker. This prevents the application from being suspended while
// remoting.
scoped_ptr<PowerSaveBlocker> power_save_blocker_;
};
} // namespace content
#endif // CONTENT_BROWSER_MEDIA_WEBRTC_INTERNALS_H_
|