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 3c4438ac200d47286018dfffa0339445a085003a..337902b8a9a64df29afbaf3f0df2dcf421d56537 100644 |
| --- a/content/browser/media/cdm/browser_cdm_manager.cc |
| +++ b/content/browser/media/cdm/browser_cdm_manager.cc |
| @@ -17,7 +17,7 @@ |
| #include "content/public/browser/permission_type.h" |
| #include "content/public/browser/render_frame_host.h" |
| #include "content/public/browser/render_process_host.h" |
| -#include "content/public/browser/render_view_host.h" |
| +#include "content/public/browser/render_process_host_observer.h" |
| #include "content/public/browser/web_contents.h" |
| #include "media/base/browser_cdm.h" |
| #include "media/base/browser_cdm_factory.h" |
| @@ -105,20 +105,52 @@ void CdmPromiseInternal<std::string>::resolve(const std::string& session_id) { |
| typedef CdmPromiseInternal<> SimplePromise; |
| typedef CdmPromiseInternal<std::string> NewSessionPromise; |
| -} // namespace |
| - |
| // Render process ID to BrowserCdmManager map. |
| typedef std::map<int, BrowserCdmManager*> BrowserCdmManagerMap; |
| base::LazyInstance<BrowserCdmManagerMap>::Leaky g_browser_cdm_manager_map = |
| LAZY_INSTANCE_INITIALIZER; |
|
ncarter (slow)
2015/07/08 20:56:31
We should probably add a comment here along the li
xhwang
2015/07/08 22:15:30
Done.
|
| -BrowserCdmManager* BrowserCdmManager::FromProcess(int render_process_id) { |
| - DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| +class BrowserCdmManagerProcessWatcher : public RenderProcessHostObserver { |
| + public: |
| + BrowserCdmManagerProcessWatcher( |
| + int render_process_id, |
| + const scoped_refptr<BrowserCdmManager>& manager) |
| + : browser_cdm_manager_(manager) { |
| + RenderProcessHost::FromID(render_process_id)->AddObserver(this); |
| + CHECK(g_browser_cdm_manager_map.Get() |
| + .insert(std::make_pair(render_process_id, manager.get())) |
| + .second); |
| + } |
| - if (!g_browser_cdm_manager_map.Get().count(render_process_id)) |
| - return NULL; |
| + // RenderProcessHostObserver: |
| + virtual void RenderProcessExited(RenderProcessHost* host, |
| + base::TerminationStatus /* status */, |
| + int /* exit_code */) { |
| + Destroy(host); |
| + } |
| + |
| + virtual void RenderProcessHostDestroyed(RenderProcessHost* host) { |
| + Destroy(host); |
| + } |
| - return g_browser_cdm_manager_map.Get()[render_process_id]; |
| + private: |
| + void Destroy(RenderProcessHost* host) { |
| + CHECK(g_browser_cdm_manager_map.Get().erase(host->GetID())); |
| + host->RemoveObserver(this); |
| + delete this; |
| + } |
| + |
| + const scoped_refptr<BrowserCdmManager> browser_cdm_manager_; |
| +}; |
| + |
| +} // namespace |
| + |
| +// static |
| +BrowserCdmManager* BrowserCdmManager::FromProcess(int render_process_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + auto& map = g_browser_cdm_manager_map.Get(); |
| + auto iterator = map.find(render_process_id); |
| + return (iterator == map.end()) ? nullptr : iterator->second; |
| } |
| BrowserCdmManager::BrowserCdmManager( |
| @@ -131,23 +163,18 @@ BrowserCdmManager::BrowserCdmManager( |
| DVLOG(1) << __FUNCTION__ << ": " << render_process_id_; |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + new BrowserCdmManagerProcessWatcher(render_process_id, this); |
| + |
| if (!task_runner_.get()) { |
| task_runner_ = |
| BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI); |
| } |
| - |
| - DCHECK(!g_browser_cdm_manager_map.Get().count(render_process_id_)) |
| - << render_process_id_; |
| - g_browser_cdm_manager_map.Get()[render_process_id] = this; |
| } |
| BrowserCdmManager::~BrowserCdmManager() { |
| DVLOG(1) << __FUNCTION__ << ": " << render_process_id_; |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - DCHECK(g_browser_cdm_manager_map.Get().count(render_process_id_)); |
| - DCHECK_EQ(this, g_browser_cdm_manager_map.Get()[render_process_id_]); |
| - |
| - g_browser_cdm_manager_map.Get().erase(render_process_id_); |
| + DCHECK(g_browser_cdm_manager_map.Get().count(render_process_id_) == 0); |
| } |
| // Makes sure BrowserCdmManager is always deleted on the Browser UI thread. |