Chromium Code Reviews| Index: content/browser/media/cdm/browser_cdm_manager.cc |
| diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc |
| index eefceba28b97d1a73cd31834fb3b34d231a554ae..feeb33c4686bc3cbc0e2563cacd0bbd6cfbc7503 100644 |
| --- a/content/browser/media/cdm/browser_cdm_manager.cc |
| +++ b/content/browser/media/cdm/browser_cdm_manager.cc |
| @@ -26,11 +26,24 @@ |
| #if defined(OS_ANDROID) |
| #include "content/public/common/renderer_preferences.h" |
| + |
| +#define RUN_ON_UI_THREAD(method, ...) \ |
| + do { \ |
| + if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { \ |
| + if (manager_) \ |
| + manager_->method(__VA_ARGS__); \ |
|
ddorwin
2015/09/16 20:42:21
I think we should avoid using members in a macro,
|
| + } else { \ |
| + BrowserThread::PostTask( \ |
| + BrowserThread::UI, FROM_HERE, \ |
| + base::Bind(&BrowserCdmManager::method, manager_, ##__VA_ARGS__)); \ |
| + } \ |
| + } while (0) |
| #endif |
| namespace content { |
| using media::BrowserCdm; |
| +using media::BrowserCdmPtr; |
| using media::MediaKeys; |
| namespace { |
| @@ -76,10 +89,15 @@ class CdmPromiseInternal : public media::CdmPromiseTemplate<T...> { |
| uint32_t system_code, |
| const std::string& error_message) final { |
| MarkPromiseSettled(); |
| +#if defined(OS_ANDROID) |
|
ddorwin
2015/09/16 20:42:21
Why does this only apply to Android? This is a lot
|
| + RUN_ON_UI_THREAD(RejectPromise, render_frame_id_, cdm_id_, promise_id_, |
|
ddorwin
2015/09/16 20:42:21
Why must this be put on the UI thread here?
The an
|
| + exception, system_code, error_message); |
| +#else |
| if (manager_) { |
| manager_->RejectPromise(render_frame_id_, cdm_id_, promise_id_, exception, |
| system_code, error_message); |
| } |
| +#endif |
| } |
| private: |
| @@ -94,17 +112,26 @@ class CdmPromiseInternal : public media::CdmPromiseTemplate<T...> { |
| template <> |
| void CdmPromiseInternal<>::resolve() { |
| MarkPromiseSettled(); |
| +#if defined(OS_ANDROID) |
| + RUN_ON_UI_THREAD(ResolvePromise, render_frame_id_, cdm_id_, promise_id_); |
| +#else |
| if (manager_) |
| manager_->ResolvePromise(render_frame_id_, cdm_id_, promise_id_); |
| +#endif |
| } |
| template <> |
| void CdmPromiseInternal<std::string>::resolve(const std::string& session_id) { |
| MarkPromiseSettled(); |
| +#if defined(OS_ANDROID) |
| + RUN_ON_UI_THREAD(ResolvePromiseWithSession, render_frame_id_, cdm_id_, |
| + promise_id_, session_id); |
| +#else |
| if (manager_) { |
| manager_->ResolvePromiseWithSession(render_frame_id_, cdm_id_, promise_id_, |
| session_id); |
| } |
| +#endif |
| } |
| typedef CdmPromiseInternal<> SimplePromise; |
| @@ -541,7 +568,7 @@ void BrowserCdmManager::AddCdm(int render_frame_id, |
| scoped_ptr<SimplePromise> promise(new SimplePromise( |
| weak_ptr_factory_.GetWeakPtr(), render_frame_id, cdm_id, promise_id)); |
| - scoped_ptr<BrowserCdm> cdm(media::CreateBrowserCdm( |
| + BrowserCdmPtr cdm(media::CreateBrowserCdm( |
| key_system, use_hw_secure_codecs, |
| BROWSER_CDM_MANAGER_CB(OnSessionMessage), |
| BROWSER_CDM_MANAGER_CB(OnSessionClosed), |