| Index: content/browser/renderer_host/media/web_contents_audio_input_stream.cc
 | 
| diff --git a/content/browser/renderer_host/media/web_contents_audio_input_stream.cc b/content/browser/renderer_host/media/web_contents_audio_input_stream.cc
 | 
| index d1554a2cec239e7dacf517912f00a5f10c3dbb6b..ac9a903c60e00a6686ea04551cfba2db62b194cf 100644
 | 
| --- a/content/browser/renderer_host/media/web_contents_audio_input_stream.cc
 | 
| +++ b/content/browser/renderer_host/media/web_contents_audio_input_stream.cc
 | 
| @@ -10,7 +10,7 @@
 | 
|  #include "base/bind_helpers.h"
 | 
|  #include "base/logging.h"
 | 
|  #include "base/memory/scoped_ptr.h"
 | 
| -#include "base/message_loop/message_loop_proxy.h"
 | 
| +#include "base/threading/thread_checker.h"
 | 
|  #include "content/browser/browser_main_loop.h"
 | 
|  #include "content/browser/renderer_host/media/audio_mirroring_manager.h"
 | 
|  #include "content/browser/renderer_host/media/web_contents_capture_util.h"
 | 
| @@ -27,7 +27,6 @@ class WebContentsAudioInputStream::Impl
 | 
|   public:
 | 
|    // Takes ownership of |mixer_stream|.  The rest outlive this instance.
 | 
|    Impl(int render_process_id, int render_view_id,
 | 
| -       const scoped_refptr<base::MessageLoopProxy>& message_loop,
 | 
|         AudioMirroringManager* mirroring_manager,
 | 
|         const scoped_refptr<WebContentsTracker>& tracker,
 | 
|         media::VirtualAudioInputStream* mixer_stream);
 | 
| @@ -86,7 +85,6 @@ class WebContentsAudioInputStream::Impl
 | 
|    void OnTargetChanged(int render_process_id, int render_view_id);
 | 
|  
 | 
|    // Injected dependencies.
 | 
| -  const scoped_refptr<base::MessageLoopProxy> message_loop_;
 | 
|    AudioMirroringManager* const mirroring_manager_;
 | 
|    const scoped_refptr<WebContentsTracker> tracker_;
 | 
|    // The AudioInputStream implementation that handles the audio conversion and
 | 
| @@ -102,24 +100,28 @@ class WebContentsAudioInputStream::Impl
 | 
|    // Current callback used to consume the resulting mixed audio data.
 | 
|    AudioInputCallback* callback_;
 | 
|  
 | 
| +  base::ThreadChecker thread_checker_;
 | 
| +
 | 
|    DISALLOW_COPY_AND_ASSIGN(Impl);
 | 
|  };
 | 
|  
 | 
|  WebContentsAudioInputStream::Impl::Impl(
 | 
|      int render_process_id, int render_view_id,
 | 
| -    const scoped_refptr<base::MessageLoopProxy>& message_loop,
 | 
|      AudioMirroringManager* mirroring_manager,
 | 
|      const scoped_refptr<WebContentsTracker>& tracker,
 | 
|      media::VirtualAudioInputStream* mixer_stream)
 | 
| -    : message_loop_(message_loop), mirroring_manager_(mirroring_manager),
 | 
| +    : mirroring_manager_(mirroring_manager),
 | 
|        tracker_(tracker), mixer_stream_(mixer_stream), state_(CONSTRUCTED),
 | 
|        target_render_process_id_(render_process_id),
 | 
|        target_render_view_id_(render_view_id),
 | 
|        callback_(NULL) {
 | 
| -  DCHECK(message_loop_.get());
 | 
|    DCHECK(mirroring_manager_);
 | 
|    DCHECK(tracker_.get());
 | 
|    DCHECK(mixer_stream_.get());
 | 
| +
 | 
| +  // WAIS::Impl can be constructed on any thread, but will DCHECK that all
 | 
| +  // its methods from here on are called from the same thread.
 | 
| +  thread_checker_.DetachFromThread();
 | 
|  }
 | 
|  
 | 
|  WebContentsAudioInputStream::Impl::~Impl() {
 | 
| @@ -127,7 +129,7 @@ WebContentsAudioInputStream::Impl::~Impl() {
 | 
|  }
 | 
|  
 | 
|  bool WebContentsAudioInputStream::Impl::Open() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    DCHECK_EQ(CONSTRUCTED, state_) << "Illegal to Open more than once.";
 | 
|  
 | 
| @@ -144,7 +146,7 @@ bool WebContentsAudioInputStream::Impl::Open() {
 | 
|  }
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::Start(AudioInputCallback* callback) {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|    DCHECK(callback);
 | 
|  
 | 
|    if (state_ != OPENED)
 | 
| @@ -164,7 +166,7 @@ void WebContentsAudioInputStream::Impl::Start(AudioInputCallback* callback) {
 | 
|  }
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::Stop() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    if (state_ != MIRRORING)
 | 
|      return;
 | 
| @@ -179,7 +181,7 @@ void WebContentsAudioInputStream::Impl::Stop() {
 | 
|  }
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::Close() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    Stop();
 | 
|  
 | 
| @@ -194,13 +196,13 @@ void WebContentsAudioInputStream::Impl::Close() {
 | 
|  }
 | 
|  
 | 
|  bool WebContentsAudioInputStream::Impl::IsTargetLost() const {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    return target_render_process_id_ <= 0 || target_render_view_id_ <= 0;
 | 
|  }
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::ReportError() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    // TODO(miu): Need clean-up of AudioInputCallback interface in a future
 | 
|    // change, since its only implementation ignores the first argument entirely
 | 
| @@ -208,7 +210,7 @@ void WebContentsAudioInputStream::Impl::ReportError() {
 | 
|  }
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::StartMirroring() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    BrowserThread::PostTask(
 | 
|        BrowserThread::IO,
 | 
| @@ -220,7 +222,7 @@ void WebContentsAudioInputStream::Impl::StartMirroring() {
 | 
|  }
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::StopMirroring() {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    BrowserThread::PostTask(
 | 
|        BrowserThread::IO,
 | 
| @@ -238,7 +240,6 @@ media::AudioOutputStream* WebContentsAudioInputStream::Impl::AddInput(
 | 
|    // VirtualAudioOutputStream.
 | 
|    return new media::VirtualAudioOutputStream(
 | 
|        params,
 | 
| -      message_loop_.get(),
 | 
|        mixer_stream_.get(),
 | 
|        base::Bind(&Impl::ReleaseInput, this));
 | 
|  }
 | 
| @@ -250,7 +251,7 @@ void WebContentsAudioInputStream::Impl::ReleaseInput(
 | 
|  
 | 
|  void WebContentsAudioInputStream::Impl::OnTargetChanged(int render_process_id,
 | 
|                                                          int render_view_id) {
 | 
| -  DCHECK(message_loop_->BelongsToCurrentThread());
 | 
| +  DCHECK(thread_checker_.CalledOnValidThread());
 | 
|  
 | 
|    if (target_render_process_id_ == render_process_id &&
 | 
|        target_render_view_id_ == render_view_id) {
 | 
| @@ -281,7 +282,7 @@ void WebContentsAudioInputStream::Impl::OnTargetChanged(int render_process_id,
 | 
|  WebContentsAudioInputStream* WebContentsAudioInputStream::Create(
 | 
|      const std::string& device_id,
 | 
|      const media::AudioParameters& params,
 | 
| -    const scoped_refptr<base::MessageLoopProxy>& message_loop) {
 | 
| +    const scoped_refptr<base::MessageLoopProxy>& worker_loop) {
 | 
|    int render_process_id;
 | 
|    int render_view_id;
 | 
|    if (!WebContentsCaptureUtil::ExtractTabCaptureTarget(
 | 
| @@ -290,21 +291,20 @@ WebContentsAudioInputStream* WebContentsAudioInputStream::Create(
 | 
|    }
 | 
|  
 | 
|    return new WebContentsAudioInputStream(
 | 
| -      render_process_id, render_view_id, message_loop,
 | 
| +      render_process_id, render_view_id,
 | 
|        BrowserMainLoop::GetAudioMirroringManager(),
 | 
|        new WebContentsTracker(),
 | 
|        new media::VirtualAudioInputStream(
 | 
| -          params, message_loop,
 | 
| +          params, worker_loop,
 | 
|            media::VirtualAudioInputStream::AfterCloseCallback()));
 | 
|  }
 | 
|  
 | 
|  WebContentsAudioInputStream::WebContentsAudioInputStream(
 | 
|      int render_process_id, int render_view_id,
 | 
| -    const scoped_refptr<base::MessageLoopProxy>& message_loop,
 | 
|      AudioMirroringManager* mirroring_manager,
 | 
|      const scoped_refptr<WebContentsTracker>& tracker,
 | 
|      media::VirtualAudioInputStream* mixer_stream)
 | 
| -    : impl_(new Impl(render_process_id, render_view_id, message_loop,
 | 
| +    : impl_(new Impl(render_process_id, render_view_id,
 | 
|                       mirroring_manager, tracker, mixer_stream)) {}
 | 
|  
 | 
|  WebContentsAudioInputStream::~WebContentsAudioInputStream() {}
 | 
| 
 |