Index: content/browser/renderer_host/media/audio_renderer_host_unittest.cc |
=================================================================== |
--- content/browser/renderer_host/media/audio_renderer_host_unittest.cc (revision 114012) |
+++ content/browser/renderer_host/media/audio_renderer_host_unittest.cc (working copy) |
@@ -42,7 +42,8 @@ |
class MockAudioRendererHost : public AudioRendererHost { |
public: |
- MockAudioRendererHost(const content::ResourceContext* resource_context) |
+ explicit MockAudioRendererHost( |
+ const content::ResourceContext* resource_context) |
: AudioRendererHost(resource_context), |
shared_memory_length_(0) { |
} |
@@ -182,11 +183,12 @@ |
message_loop_.get())); |
ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI, |
message_loop_.get())); |
- |
+ audio_manager_ = AudioManager::Create(); |
observer_.reset(new MockMediaObserver()); |
content::MockResourceContext* context = |
content::MockResourceContext::GetInstance(); |
context->set_media_observer(observer_.get()); |
+ context->set_audio_manager(audio_manager_); |
host_ = new MockAudioRendererHost(context); |
// Simulate IPC channel connected. |
@@ -204,6 +206,14 @@ |
// We need to continue running message_loop_ to complete all destructions. |
SyncWithAudioThread(); |
+ // Since the MockResourceContext object is a singleton that lives across |
+ // multiple tests, we must clear pointers to objects that are about to die. |
+ content::MockResourceContext* context = |
+ content::MockResourceContext::GetInstance(); |
+ context->set_audio_manager(NULL); |
+ context->set_media_observer(NULL); |
+ audio_manager_ = NULL; |
+ |
io_thread_.reset(); |
ui_thread_.reset(); |
} |
@@ -338,9 +348,10 @@ |
} |
// Called on the main thread. |
- static void PostQuitOnAudioThread(MessageLoop* message_loop) { |
- AudioManager::GetAudioManager()->GetMessageLoop()->PostTask( |
- FROM_HERE, base::Bind(&PostQuitMessageLoop, message_loop)); |
+ static void PostQuitOnAudioThread(AudioManager* audio_manager, |
+ MessageLoop* message_loop) { |
+ audio_manager->GetMessageLoop()->PostTask(FROM_HERE, |
+ base::Bind(&PostQuitMessageLoop, message_loop)); |
} |
// SyncWithAudioThread() waits until all pending tasks on the audio thread |
@@ -348,8 +359,12 @@ |
// current thread. It is used to synchronize with the audio thread when we are |
// closing an audio stream. |
void SyncWithAudioThread() { |
+ // Don't use scoped_refptr to addref the AudioManager when posting |
+ // to the thread that itself owns. |
message_loop_->PostTask( |
- FROM_HERE, base::Bind(&PostQuitOnAudioThread, message_loop_.get())); |
+ FROM_HERE, base::Bind(&PostQuitOnAudioThread, |
+ base::Unretained(audio_manager_.get()), |
+ message_loop_.get())); |
message_loop_->Run(); |
} |
@@ -364,6 +379,7 @@ |
scoped_ptr<MessageLoop> message_loop_; |
scoped_ptr<BrowserThreadImpl> io_thread_; |
scoped_ptr<BrowserThreadImpl> ui_thread_; |
+ scoped_refptr<AudioManager> audio_manager_; |
DISALLOW_COPY_AND_ASSIGN(AudioRendererHostTest); |
}; |