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), |