Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(849)

Unified Diff: content/browser/media/cdm/browser_cdm_manager.cc

Issue 1225083002: media: Add BrowserCdmManagerProcessWatcher. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698