Chromium Code Reviews| Index: content/renderer/media/rtc_dtmf_sender_handler.cc |
| diff --git a/content/renderer/media/rtc_dtmf_sender_handler.cc b/content/renderer/media/rtc_dtmf_sender_handler.cc |
| index 23c5cc18f88b3e30d351243cd4aaf60329eba8ba..315d1d727fddfe2175ca507ad1ec61b480ced453 100644 |
| --- a/content/renderer/media/rtc_dtmf_sender_handler.cc |
| +++ b/content/renderer/media/rtc_dtmf_sender_handler.cc |
| @@ -6,18 +6,53 @@ |
| #include <string> |
| +#include "base/bind.h" |
| +#include "base/location.h" |
| #include "base/logging.h" |
| +#include "base/message_loop/message_loop_proxy.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "base/threading/thread_checker.h" |
| using webrtc::DtmfSenderInterface; |
| namespace content { |
| +class RtcDtmfSenderHandler::Observer : |
| + public base::RefCountedThreadSafe<Observer>, |
| + public webrtc::DtmfSenderObserverInterface { |
| + public: |
| + explicit Observer(const base::WeakPtr<RtcDtmfSenderHandler>& handler) |
| + : main_thread_(base::MessageLoopProxy::current()), handler_(handler) {} |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<Observer>; |
| + |
| + ~Observer() override {} |
| + |
| + void OnToneChange(const std::string& tone) override { |
| + main_thread_->PostTask(FROM_HERE, |
| + base::Bind(&RtcDtmfSenderHandler::Observer::OnToneChangeOnMainThread, |
| + this, tone)); |
| + } |
| + |
| + void OnToneChangeOnMainThread(const std::string& tone) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + if (handler_) |
| + handler_->OnToneChange(tone); |
| + } |
| + |
| + base::ThreadChecker thread_checker_; |
| + const scoped_refptr<base::MessageLoopProxy> main_thread_; |
|
tommi (sloooow) - chröme
2014/11/03 13:49:56
const scoped_refptr<base::SingleThreadTaskRunner>
perkj_chrome
2014/11/03 14:53:33
Done.
|
| + base::WeakPtr<RtcDtmfSenderHandler> handler_; |
| +}; |
| + |
| RtcDtmfSenderHandler::RtcDtmfSenderHandler(DtmfSenderInterface* dtmf_sender) |
| : dtmf_sender_(dtmf_sender), |
| - webkit_client_(NULL) { |
| + webkit_client_(NULL), |
| + weak_factory_(this) { |
| DVLOG(1) << "::ctor"; |
| - dtmf_sender_->RegisterObserver(this); |
| + observer_ = new Observer(weak_factory_.GetWeakPtr()); |
|
tommi (sloooow) - chröme
2014/11/03 13:49:56
nit: initializer list? (should be ok as long as it
perkj_chrome
2014/11/03 14:53:33
Done.
dmichael (off chromium)
2014/12/04 19:28:46
WeakPtrFactory should always be the last member...
|
| + dtmf_sender_->RegisterObserver(observer_.get()); |
| } |
| RtcDtmfSenderHandler::~RtcDtmfSenderHandler() { |