diff options
author | xhwang <xhwang@chromium.org> | 2015-07-09 14:11:44 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-09 21:12:36 +0000 |
commit | ff9a7da8b4c0696dc9471c6b85a2ffbf6a1a46d0 (patch) | |
tree | f9cfacec937d8084481e715767e0953255ca34ac | |
parent | 3403bc5413575b3b05842d79b8547d58308d0b7d (diff) | |
download | chromium_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}
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_; |