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 /content | |
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
Diffstat (limited to 'content')
18 files changed, 81 insertions, 65 deletions
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( |