summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxhwang <xhwang@chromium.org>2015-07-09 14:11:44 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-09 21:12:36 +0000
commitff9a7da8b4c0696dc9471c6b85a2ffbf6a1a46d0 (patch)
treef9cfacec937d8084481e715767e0953255ca34ac
parent3403bc5413575b3b05842d79b8547d58308d0b7d (diff)
downloadchromium_src-ff9a7da8b4c0696dc9471c6b85a2ffbf6a1a46d0.zip
chromium_src-ff9a7da8b4c0696dc9471c6b85a2ffbf6a1a46d0.tar.gz
chromium_src-ff9a7da8b4c0696dc9471c6b85a2ffbf6a1a46d0.tar.bz2
media: Add BrowserCdmManagerProcessWatcher.
Based on nick@chromium.org's CL: http://crrev.com/1214073015#ps1 Instead of having RenderProcessHostImpl hosts BrowserCdmManager, add BrowserCdmManagerProcessWatcher, a RenderProcessHostObserver, to keep a reference to BrowserCdmManager, and manage the entries in g_browser_cdm_manager_map. BUG=506188 TEST=Test reenabled. Review URL: https://codereview.chromium.org/1225083002 Cr-Commit-Position: refs/heads/master@{#338146}
-rw-r--r--content/browser/loader/resource_dispatcher_host_browsertest.cc3
-rw-r--r--content/browser/media/cdm/browser_cdm_manager.cc62
-rw-r--r--content/browser/renderer_host/render_process_host_impl.cc14
-rw-r--r--content/browser/renderer_host/render_process_host_impl.h10
4 files changed, 52 insertions, 37 deletions
diff --git a/content/browser/loader/resource_dispatcher_host_browsertest.cc b/content/browser/loader/resource_dispatcher_host_browsertest.cc
index fdd4b73..b612d30 100644
--- a/content/browser/loader/resource_dispatcher_host_browsertest.cc
+++ b/content/browser/loader/resource_dispatcher_host_browsertest.cc
@@ -308,8 +308,7 @@ IN_PROC_BROWSER_TEST_F(ResourceDispatcherHostBrowserTest,
// app isn't stripped of debug symbols, this takes about five minutes to
// complete and isn't conducive to quick turnarounds. As we don't currently
// strip the app on the build bots, this is bad times.
-// Also disabled on Android (http://crbug.com/506188).
-#if defined(OS_MACOSX) || defined(OS_ANDROID)
+#if defined(OS_MACOSX)
#define MAYBE_CrossSiteAfterCrash DISABLED_CrossSiteAfterCrash
#else
#define MAYBE_CrossSiteAfterCrash CrossSiteAfterCrash
diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc
index 3c4438a..6702e31 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,55 @@ 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;
-BrowserCdmManager* BrowserCdmManager::FromProcess(int render_process_id) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
+// Keeps the BrowserCdmManager alive, and in the global map, for as long as the
+// RenderProcessHost is connected to the child process. This class is a
+// self-owned observer.
+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:
+ void RenderProcessExited(RenderProcessHost* host,
+ base::TerminationStatus /* status */,
+ int /* exit_code */) override {
+ RemoveHostObserverAndDestroy(host);
+ }
+
+ void RenderProcessHostDestroyed(RenderProcessHost* host) override {
+ RemoveHostObserverAndDestroy(host);
+ }
- return g_browser_cdm_manager_map.Get()[render_process_id];
+ private:
+ void RemoveHostObserverAndDestroy(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 +166,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.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 248ed1d..1134556 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -848,8 +848,7 @@ void RenderProcessHostImpl::CreateMessageFilters() {
AddFilter(browser_demuxer_android_.get());
#endif
#if defined(ENABLE_BROWSER_CDMS)
- browser_cdm_manager_ = new BrowserCdmManager(GetID(), NULL);
- AddFilter(browser_cdm_manager_.get());
+ AddFilter(new BrowserCdmManager(GetID(), NULL));
#endif
WebSocketDispatcherHost::GetRequestContextCallback
@@ -1024,7 +1023,10 @@ void RenderProcessHostImpl::SendUpdateValueState(unsigned int target,
media::BrowserCdm* RenderProcessHostImpl::GetBrowserCdm(int render_frame_id,
int cdm_id) const {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- return browser_cdm_manager_->GetCdm(render_frame_id, cdm_id);
+ BrowserCdmManager* manager = BrowserCdmManager::FromProcess(GetID());
+ if (!manager)
+ return nullptr;
+ return manager->GetCdm(render_frame_id, cdm_id);
}
#endif
@@ -1686,9 +1688,6 @@ void RenderProcessHostImpl::Cleanup() {
// The following members should be cleared in ProcessDied() as well!
gpu_message_filter_ = NULL;
message_port_message_filter_ = NULL;
-#if defined(ENABLE_BROWSER_CDMS)
- browser_cdm_manager_ = NULL;
-#endif
RemoveUserData(kSessionStorageHolderKey);
@@ -2129,9 +2128,6 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead,
gpu_message_filter_ = NULL;
message_port_message_filter_ = NULL;
-#if defined(ENABLE_BROWSER_CDMS)
- browser_cdm_manager_ = NULL;
-#endif
RemoveUserData(kSessionStorageHolderKey);
IDMap<IPC::Listener>::iterator iter(&listeners_);
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 8937fd1..e6c2f82 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -248,12 +248,6 @@ class CONTENT_EXPORT RenderProcessHostImpl
}
#endif
-#if defined(ENABLE_BROWSER_CDMS)
- const scoped_refptr<BrowserCdmManager>& browser_cdm_manager() {
- return browser_cdm_manager_;
- }
-#endif
-
MessagePortMessageFilter* message_port_message_filter() const {
return message_port_message_filter_.get();
}
@@ -460,10 +454,6 @@ class CONTENT_EXPORT RenderProcessHostImpl
scoped_refptr<BrowserDemuxerAndroid> browser_demuxer_android_;
#endif
-#if defined(ENABLE_BROWSER_CDMS)
- scoped_refptr<BrowserCdmManager> browser_cdm_manager_;
-#endif
-
#if defined(ENABLE_WEBRTC)
base::Callback<void(const std::string&)> webrtc_log_message_callback_;