summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-25 01:00:54 +0000
committerrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-25 01:00:54 +0000
commite5e2de42502bdb68b9a4eb61c3d3d28bbcb1b5cb (patch)
treeb66c403cd80c5754f07be256791511d24231b76c
parent78caa9e65724fa68ad6d54e8f9ecef7078bc2c0f (diff)
downloadchromium_src-e5e2de42502bdb68b9a4eb61c3d3d28bbcb1b5cb.zip
chromium_src-e5e2de42502bdb68b9a4eb61c3d3d28bbcb1b5cb.tar.gz
chromium_src-e5e2de42502bdb68b9a4eb61c3d3d28bbcb1b5cb.tar.bz2
Revert 128789 - Media failures on Win/Mac/Linux starting with this CL.
Move the MediaObserver getter from ResourceContext to ContentBrowserClient, since we only need to support one. BUG=98716 Review URL: https://chromiumcodereview.appspot.com/9845033 TBR=jam@chromium.org Review URL: https://chromiumcodereview.appspot.com/9808107 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128797 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/io_thread.cc7
-rw-r--r--chrome/browser/io_thread.h8
-rw-r--r--chrome/browser/media/media_internals.cc4
-rw-r--r--chrome/browser/media/media_internals.h8
-rw-r--r--chrome/browser/profiles/profile_io_data.cc9
-rw-r--r--chrome/browser/profiles/profile_io_data.h3
-rw-r--r--chrome/browser/ui/webui/media/media_internals_proxy.cc6
-rw-r--r--content/browser/mock_content_browser_client.cc4
-rw-r--r--content/browser/mock_content_browser_client.h1
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host.cc51
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host.h9
-rw-r--r--content/browser/renderer_host/media/audio_renderer_host_unittest.cc11
-rw-r--r--content/browser/renderer_host/render_message_filter.cc12
-rw-r--r--content/browser/renderer_host/render_message_filter.h6
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc7
-rw-r--r--content/public/browser/content_browser_client.h9
-rw-r--r--content/public/browser/media_observer.h4
-rw-r--r--content/public/browser/resource_context.h3
-rw-r--r--content/shell/shell_content_browser_client.cc4
-rw-r--r--content/shell/shell_content_browser_client.h1
-rw-r--r--content/shell/shell_resource_context.cc4
-rw-r--r--content/shell/shell_resource_context.h1
-rw-r--r--content/test/mock_resource_context.cc10
-rw-r--r--content/test/mock_resource_context.h6
-rw-r--r--content/test/webrtc_audio_device_test.cc3
27 files changed, 113 insertions, 84 deletions
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 4d91175d..1915f6b 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -36,7 +36,6 @@
#include "chrome/browser/geolocation/chrome_access_token_store.h"
#include "chrome/browser/google/google_util.h"
#include "chrome/browser/infobars/infobar_tab_helper.h"
-#include "chrome/browser/media/media_internals.h"
#include "chrome/browser/net/chrome_net_log.h"
#include "chrome/browser/notifications/desktop_notification_service.h"
#include "chrome/browser/notifications/desktop_notification_service_factory.h"
@@ -1163,10 +1162,6 @@ void ChromeContentBrowserClient::RequestMediaAccessPermission(
#endif // TOOLKIT_VIEWS || OS_LINUX
}
-content::MediaObserver* ChromeContentBrowserClient::GetMediaObserver() {
- return MediaInternals::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 f0ff699..79278fc 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -121,7 +121,6 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
virtual void RequestMediaAccessPermission(
const content::MediaStreamRequest* request,
const content::MediaResponseCallback& callback) OVERRIDE;
- virtual content::MediaObserver* GetMediaObserver() OVERRIDE;
virtual void RequestDesktopNotificationPermission(
const GURL& source_origin,
int callback_context,
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 3229f7c..c539860 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -20,6 +20,7 @@
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_event_router_forwarder.h"
+#include "chrome/browser/media/media_internals.h"
#include "chrome/browser/net/chrome_net_log.h"
#include "chrome/browser/net/chrome_network_delegate.h"
#include "chrome/browser/net/chrome_url_request_context.h"
@@ -286,6 +287,10 @@ IOThread::Globals::Globals() {}
IOThread::Globals::~Globals() {}
+IOThread::Globals::MediaGlobals::MediaGlobals() {}
+
+IOThread::Globals::MediaGlobals::~MediaGlobals() {}
+
// |local_state| is passed in explicitly in order to (1) reduce implicit
// dependencies and (2) make IOThread more flexible for testing.
IOThread::IOThread(
@@ -369,6 +374,8 @@ void IOThread::Init() {
DCHECK(!globals_);
globals_ = new Globals;
+ globals_->media.media_internals.reset(new MediaInternals());
+
// Add an observer that will emit network change events to the ChromeNetLog.
// Assuming NetworkChangeNotifier dispatches in FIFO order, we should be
// logging the network change before other IO thread consumers respond to it.
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index 2cffacf..d651faa 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -21,6 +21,7 @@
class ChromeNetLog;
class ExtensionEventRouterForwarder;
+class MediaInternals;
class PrefProxyConfigTrackerImpl;
class PrefService;
class SystemURLRequestContextGetter;
@@ -57,6 +58,13 @@ class IOThread : public content::BrowserThreadDelegate {
Globals();
~Globals();
+ struct MediaGlobals {
+ MediaGlobals();
+ ~MediaGlobals();
+ // MediaInternals singleton used to aggregate media information.
+ scoped_ptr<MediaInternals> media_internals;
+ } media;
+
// The "system" NetworkDelegate, used for Profile-agnostic network events.
scoped_ptr<net::NetworkDelegate> system_network_delegate;
scoped_ptr<net::HostResolver> host_resolver;
diff --git a/chrome/browser/media/media_internals.cc b/chrome/browser/media/media_internals.cc
index b2a494d..b85369b 100644
--- a/chrome/browser/media/media_internals.cc
+++ b/chrome/browser/media/media_internals.cc
@@ -13,10 +13,6 @@
#include "media/base/media_log.h"
#include "media/base/media_log_event.h"
-MediaInternals* MediaInternals::GetInstance() {
- return Singleton<MediaInternals>::get();
-}
-
MediaInternals::~MediaInternals() {}
void MediaInternals::OnDeleteAudioStream(void* host, int stream_id) {
diff --git a/chrome/browser/media/media_internals.h b/chrome/browser/media/media_internals.h
index e6818d6..825925b 100644
--- a/chrome/browser/media/media_internals.h
+++ b/chrome/browser/media/media_internals.h
@@ -7,7 +7,6 @@
#pragma once
#include "base/memory/ref_counted.h"
-#include "base/memory/singleton.h"
#include "base/observer_list.h"
#include "base/threading/non_thread_safe.h"
#include "base/values.h"
@@ -20,15 +19,12 @@ struct MediaLogEvent;
}
// This class stores information about currently active media.
-// It's constructed on the UI thread but all of its methods are called on the IO
-// thread.
+// All of its methods are called on the IO thread.
class MediaInternals : public content::MediaObserver,
public base::NonThreadSafe {
public:
virtual ~MediaInternals();
- static MediaInternals* GetInstance();
-
// Overridden from content::MediaObserver:
virtual void OnDeleteAudioStream(void* host, int stream_id) OVERRIDE;
virtual void OnSetAudioStreamPlaying(void* host,
@@ -51,8 +47,8 @@ class MediaInternals : public content::MediaObserver,
void SendEverything();
private:
+ friend class IOThread;
friend class MediaInternalsTest;
- friend struct DefaultSingletonTraits<MediaInternals>;
MediaInternals();
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index a029925..1556ad8 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -25,6 +25,7 @@
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/browser/extensions/extension_protocols.h"
#include "chrome/browser/io_thread.h"
+#include "chrome/browser/media/media_internals.h"
#include "chrome/browser/net/chrome_cookie_notification_details.h"
#include "chrome/browser/net/chrome_fraudulent_certificate_reporter.h"
#include "chrome/browser/net/chrome_net_log.h"
@@ -390,6 +391,12 @@ net::URLRequestContext* ProfileIOData::ResourceContext::GetRequestContext() {
return request_context_;
}
+content::MediaObserver* ProfileIOData::ResourceContext::GetMediaObserver() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ EnsureInitialized();
+ return media_observer_;
+}
+
// static
std::string ProfileIOData::GetSSLSessionCacheShard() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
@@ -488,6 +495,8 @@ void ProfileIOData::LazyInitialize() const {
resource_context_.host_resolver_ = io_thread_globals->host_resolver.get();
resource_context_.request_context_ = main_request_context_;
+ resource_context_.media_observer_ =
+ io_thread_globals->media.media_internals.get();
LazyInitializeInternal(profile_params_.get());
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h
index 4cafe09..b6ff4c8 100644
--- a/chrome/browser/profiles/profile_io_data.h
+++ b/chrome/browser/profiles/profile_io_data.h
@@ -219,12 +219,15 @@ class ProfileIOData {
// ResourceContext implementation:
virtual net::HostResolver* GetHostResolver() OVERRIDE;
virtual net::URLRequestContext* GetRequestContext() OVERRIDE;
+ virtual content::MediaObserver* GetMediaObserver() OVERRIDE;
+
void EnsureInitialized();
ProfileIOData* const io_data_;
net::HostResolver* host_resolver_;
net::URLRequestContext* request_context_;
+ content::MediaObserver* media_observer_;
};
typedef base::hash_map<std::string, scoped_refptr<ChromeURLRequestContext> >
diff --git a/chrome/browser/ui/webui/media/media_internals_proxy.cc b/chrome/browser/ui/webui/media/media_internals_proxy.cc
index 792c0ac..6b1bc17 100644
--- a/chrome/browser/ui/webui/media/media_internals_proxy.cc
+++ b/chrome/browser/ui/webui/media/media_internals_proxy.cc
@@ -126,20 +126,20 @@ Value* MediaInternalsProxy::GetConstants() {
void MediaInternalsProxy::ObserveMediaInternalsOnIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- MediaInternals::GetInstance()->AddObserver(this);
+ io_thread_->globals()->media.media_internals->AddObserver(this);
io_thread_->net_log()->AddThreadSafeObserver(this,
net::NetLog::LOG_ALL_BUT_BYTES);
}
void MediaInternalsProxy::StopObservingMediaInternalsOnIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- MediaInternals::GetInstance()->RemoveObserver(this);
+ io_thread_->globals()->media.media_internals->RemoveObserver(this);
io_thread_->net_log()->RemoveThreadSafeObserver(this);
}
void MediaInternalsProxy::GetEverythingOnIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- MediaInternals::GetInstance()->SendEverything();
+ io_thread_->globals()->media.media_internals->SendEverything();
}
void MediaInternalsProxy::UpdateUIOnUIThread(const string16& update) {
diff --git a/content/browser/mock_content_browser_client.cc b/content/browser/mock_content_browser_client.cc
index 8456785..0eb60d7 100644
--- a/content/browser/mock_content_browser_client.cc
+++ b/content/browser/mock_content_browser_client.cc
@@ -211,10 +211,6 @@ void MockContentBrowserClient::RequestMediaAccessPermission(
const MediaResponseCallback& callback) {
}
-MediaObserver* MockContentBrowserClient::GetMediaObserver() {
- return NULL;
-}
-
void MockContentBrowserClient::RequestDesktopNotificationPermission(
const GURL& source_origin,
int callback_context,
diff --git a/content/browser/mock_content_browser_client.h b/content/browser/mock_content_browser_client.h
index 5d68787..e143f3d 100644
--- a/content/browser/mock_content_browser_client.h
+++ b/content/browser/mock_content_browser_client.h
@@ -113,7 +113,6 @@ class MockContentBrowserClient : public ContentBrowserClient {
virtual void RequestMediaAccessPermission(
const MediaStreamRequest* request,
const MediaResponseCallback& callback) OVERRIDE;
- virtual MediaObserver* GetMediaObserver() OVERRIDE;
virtual void RequestDesktopNotificationPermission(
const GURL& source_origin,
int callback_context,
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc
index 76691e1..041ba30 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host.cc
@@ -12,6 +12,7 @@
#include "content/browser/renderer_host/media/audio_sync_reader.h"
#include "content/common/media/audio_messages.h"
#include "content/public/browser/media_observer.h"
+#include "content/public/browser/resource_context.h"
#include "media/audio/audio_util.h"
using content::BrowserMessageFilter;
@@ -27,10 +28,10 @@ AudioRendererHost::AudioEntry::~AudioEntry() {}
///////////////////////////////////////////////////////////////////////////////
// AudioRendererHost implementations.
AudioRendererHost::AudioRendererHost(
- AudioManager* audio_manager,
- content::MediaObserver* media_observer)
- : audio_manager_(audio_manager),
- media_observer_(media_observer) {
+ content::ResourceContext* resource_context,
+ AudioManager* audio_manager)
+ : resource_context_(resource_context),
+ audio_manager_(audio_manager) {
}
AudioRendererHost::~AudioRendererHost() {
@@ -40,6 +41,9 @@ AudioRendererHost::~AudioRendererHost() {
void AudioRendererHost::OnChannelClosing() {
BrowserMessageFilter::OnChannelClosing();
+ // Channel is closing, so |resource_context_| is about to become invalid.
+ resource_context_ = NULL;
+
// Since the IPC channel is gone, close all requested audio streams.
DeleteEntries();
}
@@ -236,8 +240,8 @@ void AudioRendererHost::OnCreateStream(
// to the map.
entry->stream_id = stream_id;
audio_entries_.insert(std::make_pair(stream_id, entry.release()));
- if (media_observer_)
- media_observer_->OnSetAudioStreamStatus(this, stream_id, "created");
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamStatus(this, stream_id, "created");
}
void AudioRendererHost::OnPlayStream(int stream_id) {
@@ -250,8 +254,8 @@ void AudioRendererHost::OnPlayStream(int stream_id) {
}
entry->controller->Play();
- if (media_observer_)
- media_observer_->OnSetAudioStreamPlaying(this, stream_id, true);
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamPlaying(this, stream_id, true);
}
void AudioRendererHost::OnPauseStream(int stream_id) {
@@ -264,8 +268,8 @@ void AudioRendererHost::OnPauseStream(int stream_id) {
}
entry->controller->Pause();
- if (media_observer_)
- media_observer_->OnSetAudioStreamPlaying(this, stream_id, false);
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamPlaying(this, stream_id, false);
}
void AudioRendererHost::OnFlushStream(int stream_id) {
@@ -278,15 +282,15 @@ void AudioRendererHost::OnFlushStream(int stream_id) {
}
entry->controller->Flush();
- if (media_observer_)
- media_observer_->OnSetAudioStreamStatus(this, stream_id, "flushed");
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamStatus(this, stream_id, "flushed");
}
void AudioRendererHost::OnCloseStream(int stream_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (media_observer_)
- media_observer_->OnSetAudioStreamStatus(this, stream_id, "closed");
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamStatus(this, stream_id, "closed");
AudioEntry* entry = LookupById(stream_id);
@@ -307,8 +311,8 @@ void AudioRendererHost::OnSetVolume(int stream_id, double volume) {
if (volume < 0 || volume > 1.0)
return;
entry->controller->SetVolume(volume);
- if (media_observer_)
- media_observer_->OnSetAudioStreamVolume(this, stream_id, volume);
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamVolume(this, stream_id, volume);
}
void AudioRendererHost::SendErrorMessage(int32 stream_id) {
@@ -352,8 +356,8 @@ void AudioRendererHost::DeleteEntry(AudioEntry* entry) {
audio_entries_.erase(entry->stream_id);
// Notify the media observer.
- if (media_observer_)
- media_observer_->OnDeleteAudioStream(this, entry->stream_id);
+ if (GetMediaObserver())
+ GetMediaObserver()->OnDeleteAudioStream(this, entry->stream_id);
}
void AudioRendererHost::DeleteEntryOnError(AudioEntry* entry) {
@@ -363,8 +367,8 @@ void AudioRendererHost::DeleteEntryOnError(AudioEntry* entry) {
// |entry| is destroyed in DeleteEntry().
SendErrorMessage(entry->stream_id);
- if (media_observer_)
- media_observer_->OnSetAudioStreamStatus(this, entry->stream_id, "error");
+ if (GetMediaObserver())
+ GetMediaObserver()->OnSetAudioStreamStatus(this, entry->stream_id, "error");
CloseAndDeleteStream(entry);
}
@@ -390,3 +394,10 @@ AudioRendererHost::AudioEntry* AudioRendererHost::LookupByController(
}
return NULL;
}
+
+content::MediaObserver* AudioRendererHost::GetMediaObserver() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (resource_context_)
+ return resource_context_->GetMediaObserver();
+ return NULL;
+}
diff --git a/content/browser/renderer_host/media/audio_renderer_host.h b/content/browser/renderer_host/media/audio_renderer_host.h
index a9ca80f..0880e3b 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.h
+++ b/content/browser/renderer_host/media/audio_renderer_host.h
@@ -89,8 +89,8 @@ class CONTENT_EXPORT AudioRendererHost
typedef std::map<int, AudioEntry*> AudioEntryMap;
// Called from UI thread from the owner of this object.
- AudioRendererHost(AudioManager* audio_manager,
- content::MediaObserver* media_observer);
+ AudioRendererHost(content::ResourceContext* resource_context,
+ AudioManager* audio_manager);
// content::BrowserMessageFilter implementation.
virtual void OnChannelClosing() OVERRIDE;
@@ -178,11 +178,14 @@ class CONTENT_EXPORT AudioRendererHost
// event is received.
AudioEntry* LookupByController(media::AudioOutputController* controller);
+ // Returns the MediaObserver from |resource_context_| or NULL if none exists.
+ content::MediaObserver* GetMediaObserver();
+
// A map of stream IDs to audio sources.
AudioEntryMap audio_entries_;
+ content::ResourceContext* resource_context_;
AudioManager* audio_manager_;
- content::MediaObserver* media_observer_;
DISALLOW_COPY_AND_ASSIGN(AudioRendererHost);
};
diff --git a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
index 71a5063..46a841f 100644
--- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
@@ -12,6 +12,7 @@
#include "content/browser/renderer_host/media/audio_renderer_host.h"
#include "content/browser/renderer_host/media/mock_media_observer.h"
#include "content/common/media/audio_messages.h"
+#include "content/test/mock_resource_context.h"
#include "ipc/ipc_message_utils.h"
#include "media/audio/audio_manager.h"
#include "media/audio/fake_audio_output_stream.h"
@@ -43,9 +44,9 @@ static bool IsRunningHeadless() {
class MockAudioRendererHost : public AudioRendererHost {
public:
explicit MockAudioRendererHost(
- AudioManager* audio_manager,
- content::MediaObserver* media_observer)
- : AudioRendererHost(audio_manager, media_observer),
+ content::ResourceContext* resource_context,
+ AudioManager* audio_manager)
+ : AudioRendererHost(resource_context, audio_manager),
shared_memory_length_(0) {
}
@@ -163,7 +164,8 @@ class AudioRendererHostTest : public testing::Test {
message_loop_.get()));
audio_manager_.reset(AudioManager::Create());
observer_.reset(new MockMediaObserver());
- host_ = new MockAudioRendererHost(audio_manager_.get(), observer_.get());
+ resource_context_.set_media_observer(observer_.get());
+ host_ = new MockAudioRendererHost(&resource_context_, audio_manager_.get());
// Simulate IPC channel connected.
host_->OnChannelConnected(base::GetCurrentProcId());
@@ -311,6 +313,7 @@ class AudioRendererHostTest : public testing::Test {
scoped_ptr<BrowserThreadImpl> io_thread_;
scoped_ptr<BrowserThreadImpl> ui_thread_;
scoped_ptr<AudioManager> audio_manager_;
+ content::MockResourceContext resource_context_;
DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest);
};
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc
index fbbff99..b4b10d2 100644
--- a/content/browser/renderer_host/render_message_filter.cc
+++ b/content/browser/renderer_host/render_message_filter.cc
@@ -269,8 +269,7 @@ RenderMessageFilter::RenderMessageFilter(
PluginServiceImpl* plugin_service,
content::BrowserContext* browser_context,
net::URLRequestContextGetter* request_context,
- RenderWidgetHelper* render_widget_helper,
- content::MediaObserver* media_observer)
+ RenderWidgetHelper* render_widget_helper)
: resource_dispatcher_host_(ResourceDispatcherHostImpl::Get()),
plugin_service_(plugin_service),
browser_context_(browser_context),
@@ -281,8 +280,7 @@ RenderMessageFilter::RenderMessageFilter(
dom_storage_context_(static_cast<DOMStorageContextImpl*>(
BrowserContext::GetDOMStorageContext(browser_context))),
render_process_id_(render_process_id),
- cpu_usage_(0),
- media_observer_(media_observer) {
+ cpu_usage_(0) {
DCHECK(request_context_);
render_widget_helper_->Init(render_process_id_, resource_dispatcher_host_);
@@ -883,8 +881,10 @@ void RenderMessageFilter::AsyncOpenFileOnFileThread(const FilePath& path,
}
void RenderMessageFilter::OnMediaLogEvent(const media::MediaLogEvent& event) {
- if (media_observer_)
- media_observer_->OnMediaEvent(render_process_id_, event);
+ if (!resource_context_->GetMediaObserver())
+ return;
+ resource_context_->GetMediaObserver()->OnMediaEvent(
+ render_process_id_, event);
}
void RenderMessageFilter::CheckPolicyForCookies(
diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h
index 710db73..fff1963 100644
--- a/content/browser/renderer_host/render_message_filter.h
+++ b/content/browser/renderer_host/render_message_filter.h
@@ -38,7 +38,6 @@ struct WebScreenInfo;
namespace content {
class BrowserContext;
-class MediaObserver;
class ResourceContext;
class ResourceDispatcherHostImpl;
}
@@ -74,8 +73,7 @@ class RenderMessageFilter : public content::BrowserMessageFilter {
PluginServiceImpl * plugin_service,
content::BrowserContext* browser_context,
net::URLRequestContextGetter* request_context,
- RenderWidgetHelper* render_widget_helper,
- content::MediaObserver* media_observer);
+ RenderWidgetHelper* render_widget_helper);
// IPC::ChannelProxy::MessageFilter methods:
virtual void OnChannelClosing() OVERRIDE;
@@ -268,8 +266,6 @@ class RenderMessageFilter : public content::BrowserMessageFilter {
// Used for sampling CPU usage of the renderer process.
scoped_ptr<base::ProcessMetrics> process_metrics_;
- content::MediaObserver* media_observer_;
-
DISALLOW_COPY_AND_ASSIGN(RenderMessageFilter);
};
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index ce8115c..f88fd08 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -448,16 +448,13 @@ bool RenderProcessHostImpl::Init(bool is_accessibility_enabled) {
}
void RenderProcessHostImpl::CreateMessageFilters() {
- content::MediaObserver* media_observer =
- content::GetContentClient()->browser()->GetMediaObserver();
scoped_refptr<RenderMessageFilter> render_message_filter(
new RenderMessageFilter(
GetID(),
PluginServiceImpl::GetInstance(),
GetBrowserContext(),
GetBrowserContext()->GetRequestContextForRenderProcess(GetID()),
- widget_helper_,
- media_observer));
+ widget_helper_));
channel_->AddFilter(render_message_filter);
content::BrowserContext* browser_context = GetBrowserContext();
content::ResourceContext* resource_context =
@@ -474,7 +471,7 @@ void RenderProcessHostImpl::CreateMessageFilters() {
AudioManager* audio_manager = content::BrowserMainLoop::GetAudioManager();
channel_->AddFilter(new AudioInputRendererHost(
resource_context, audio_manager));
- channel_->AddFilter(new AudioRendererHost(audio_manager, media_observer));
+ channel_->AddFilter(new AudioRendererHost(resource_context, audio_manager));
channel_->AddFilter(new VideoCaptureHost(resource_context, audio_manager));
#endif
channel_->AddFilter(new AppCacheDispatcherHost(
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 9a3c5a5..c9303d9 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -63,11 +63,10 @@ class AccessTokenStore;
class BrowserChildProcessHost;
class BrowserContext;
class BrowserMainParts;
-class MediaObserver;
-class QuotaPermissionContext;
class RenderProcessHost;
-class RenderViewHost;
+class QuotaPermissionContext;
class ResourceContext;
+class RenderViewHost;
class SiteInstance;
class SpeechInputManagerDelegate;
class WebContents;
@@ -293,10 +292,6 @@ class ContentBrowserClient {
int render_process_id,
int render_view_id) = 0;
- // Returns a a class to get notifications about media event. The embedder can
- // return NULL if they're not interested.
- virtual MediaObserver* GetMediaObserver() = 0;
-
// Asks permission to use the camera and/or microphone. If permission is
// granted, a call should be made to |callback| with the devices. If the
// request is denied, a call should be made to |callback| with an empty list
diff --git a/content/public/browser/media_observer.h b/content/public/browser/media_observer.h
index c938b1c..0b0a6b7 100644
--- a/content/public/browser/media_observer.h
+++ b/content/public/browser/media_observer.h
@@ -12,8 +12,8 @@ struct MediaLogEvent;
namespace content {
-// An embedder may implement MediaObserver and return it from
-// ContentBrowserClient to receive callbacks as media events occur.
+// A class may implement MediaObserver and register itself with ResourceContext
+// to receive callbacks as media events occur.
class MediaObserver {
public:
// Called when an audio stream is deleted.
diff --git a/content/public/browser/resource_context.h b/content/public/browser/resource_context.h
index e52cdeb..817578f 100644
--- a/content/public/browser/resource_context.h
+++ b/content/public/browser/resource_context.h
@@ -19,6 +19,8 @@ class URLRequestContext;
namespace content {
+class MediaObserver;
+
// ResourceContext contains the relevant context information required for
// resource loading. It lives on the IO thread, although it is constructed on
// the UI thread.
@@ -30,6 +32,7 @@ class CONTENT_EXPORT ResourceContext : public base::SupportsUserData {
virtual ~ResourceContext() {}
virtual net::HostResolver* GetHostResolver() = 0;
virtual net::URLRequestContext* GetRequestContext() = 0;
+ virtual MediaObserver* GetMediaObserver() = 0;
};
} // namespace content
diff --git a/content/shell/shell_content_browser_client.cc b/content/shell/shell_content_browser_client.cc
index 901c572..cdc5d3e 100644
--- a/content/shell/shell_content_browser_client.cc
+++ b/content/shell/shell_content_browser_client.cc
@@ -230,10 +230,6 @@ void ShellContentBrowserClient::RequestMediaAccessPermission(
const content::MediaResponseCallback& callback) {
}
-MediaObserver* ShellContentBrowserClient::GetMediaObserver() {
- return NULL;
-}
-
void ShellContentBrowserClient::RequestDesktopNotificationPermission(
const GURL& source_origin,
int callback_context,
diff --git a/content/shell/shell_content_browser_client.h b/content/shell/shell_content_browser_client.h
index 8b25e16..03b389d 100644
--- a/content/shell/shell_content_browser_client.h
+++ b/content/shell/shell_content_browser_client.h
@@ -121,7 +121,6 @@ class ShellContentBrowserClient : public ContentBrowserClient {
virtual void RequestMediaAccessPermission(
const content::MediaStreamRequest* request,
const content::MediaResponseCallback& callback) OVERRIDE;
- virtual MediaObserver* GetMediaObserver() OVERRIDE;
virtual void RequestDesktopNotificationPermission(
const GURL& source_origin,
int callback_context,
diff --git a/content/shell/shell_resource_context.cc b/content/shell/shell_resource_context.cc
index 4d247e4..dbe20e8 100644
--- a/content/shell/shell_resource_context.cc
+++ b/content/shell/shell_resource_context.cc
@@ -23,4 +23,8 @@ net::URLRequestContext* ShellResourceContext::GetRequestContext() {
return getter_->GetURLRequestContext();
}
+MediaObserver* ShellResourceContext::GetMediaObserver() {
+ return NULL;
+}
+
} // namespace content
diff --git a/content/shell/shell_resource_context.h b/content/shell/shell_resource_context.h
index a084e61..2f3aa1c 100644
--- a/content/shell/shell_resource_context.h
+++ b/content/shell/shell_resource_context.h
@@ -23,6 +23,7 @@ class ShellResourceContext : public content::ResourceContext {
// ResourceContext implementation:
virtual net::HostResolver* GetHostResolver() OVERRIDE;
virtual net::URLRequestContext* GetRequestContext() OVERRIDE;
+ virtual MediaObserver* GetMediaObserver() OVERRIDE;
scoped_refptr<ShellURLRequestContextGetter> getter_;
diff --git a/content/test/mock_resource_context.cc b/content/test/mock_resource_context.cc
index ee9a6f1..ec64c69 100644
--- a/content/test/mock_resource_context.cc
+++ b/content/test/mock_resource_context.cc
@@ -10,11 +10,13 @@
namespace content {
MockResourceContext::MockResourceContext()
- : test_request_context_(new TestURLRequestContext) {
+ : test_request_context_(new TestURLRequestContext),
+ media_observer_(NULL) {
}
MockResourceContext::MockResourceContext(net::URLRequestContext* context)
- : test_request_context_(context) {
+ : test_request_context_(context),
+ media_observer_(NULL) {
}
MockResourceContext::~MockResourceContext() {}
@@ -27,4 +29,8 @@ net::URLRequestContext* MockResourceContext::GetRequestContext() {
return test_request_context_;
}
+MediaObserver* MockResourceContext::GetMediaObserver() {
+ return media_observer_;
+}
+
} // namespace content
diff --git a/content/test/mock_resource_context.h b/content/test/mock_resource_context.h
index d25bcd6..5e6d213 100644
--- a/content/test/mock_resource_context.h
+++ b/content/test/mock_resource_context.h
@@ -23,12 +23,18 @@ class MockResourceContext : public ResourceContext {
test_request_context_ = context;
}
+ void set_media_observer(MediaObserver* observer) {
+ media_observer_ = observer;
+ }
+
// ResourceContext implementation:
virtual net::HostResolver* GetHostResolver() OVERRIDE;
virtual net::URLRequestContext* GetRequestContext() OVERRIDE;
+ virtual MediaObserver* GetMediaObserver() OVERRIDE;
private:
scoped_refptr<net::URLRequestContext> test_request_context_;
+ MediaObserver* media_observer_;
DISALLOW_COPY_AND_ASSIGN(MockResourceContext);
};
diff --git a/content/test/webrtc_audio_device_test.cc b/content/test/webrtc_audio_device_test.cc
index cb37584..d13f79ca 100644
--- a/content/test/webrtc_audio_device_test.cc
+++ b/content/test/webrtc_audio_device_test.cc
@@ -170,6 +170,7 @@ void WebRTCAudioDeviceTest::InitializeIOThread(const char* thread_name) {
test_request_context_ = new TestURLRequestContext();
resource_context_->set_request_context(test_request_context_.get());
media_observer_.reset(new MockMediaObserver());
+ resource_context_->set_media_observer(media_observer_.get());
// Create an IPC channel that handles incoming messages on the IO thread.
CreateChannel(thread_name);
@@ -186,7 +187,7 @@ void WebRTCAudioDeviceTest::UninitializeIOThread() {
void WebRTCAudioDeviceTest::CreateChannel(const char* name) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
audio_render_host_ = new AudioRendererHost(
- audio_manager_.get(), media_observer_.get());
+ resource_context_.get(), audio_manager_.get());
audio_render_host_->OnChannelConnected(base::GetCurrentProcId());
audio_input_renderer_host_ = new AudioInputRendererHost(