diff options
author | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-25 01:00:54 +0000 |
---|---|---|
committer | rsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-25 01:00:54 +0000 |
commit | e5e2de42502bdb68b9a4eb61c3d3d28bbcb1b5cb (patch) | |
tree | b66c403cd80c5754f07be256791511d24231b76c | |
parent | 78caa9e65724fa68ad6d54e8f9ecef7078bc2c0f (diff) | |
download | chromium_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
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( |