Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index f38a15463e7d28856efee73a9d3071403fea1a37..5c709cdbde461bbe406813d5b293c3d691561f17 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -181,6 +181,7 @@ |
#if defined(ENABLE_MOJO_MEDIA) |
#include "media/mojo/services/mojo_cdm_factory.h" |
#include "media/mojo/services/mojo_renderer_factory.h" |
+#include "mojo/application/public/cpp/connect.h" |
#include "mojo/application/public/interfaces/shell.mojom.h" |
#include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" |
#else |
@@ -2031,7 +2032,7 @@ blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( |
#if defined(ENABLE_MOJO_MEDIA) |
scoped_ptr<media::RendererFactory> media_renderer_factory( |
- new media::MojoRendererFactory(GetMediaServiceProvider())); |
+ new media::MojoRendererFactory(GetMediaServiceFactory())); |
#else |
scoped_ptr<media::RendererFactory> media_renderer_factory = |
GetContentClient()->renderer()->CreateMediaRendererFactory( |
@@ -4973,23 +4974,33 @@ media::MediaPermission* RenderFrameImpl::GetMediaPermission() { |
} |
#if defined(ENABLE_MOJO_MEDIA) |
-mojo::ServiceProvider* RenderFrameImpl::GetMediaServiceProvider() { |
- if (!media_service_provider_) { |
+media::interfaces::ServiceFactory* RenderFrameImpl::GetMediaServiceFactory() { |
+ if (!media_service_factory_) { |
mojo::InterfacePtr<mojo::Shell> shell_ptr; |
GetServiceRegistry()->ConnectToRemoteService(mojo::GetProxy(&shell_ptr)); |
+ |
+ mojo::ServiceProviderPtr service_provider; |
mojo::URLRequestPtr request(mojo::URLRequest::New()); |
request->url = mojo::String::From("mojo:media"); |
- shell_ptr->ConnectToApplication( |
- request.Pass(), GetProxy(&media_service_provider_), nullptr); |
- media_service_provider_.set_connection_error_handler( |
- base::Bind(&RenderFrameImpl::OnMediaServiceProviderConnectionError, |
+ shell_ptr->ConnectToApplication(request.Pass(), GetProxy(&service_provider), |
Ken Rockot(use gerrit already)
2015/07/21 17:29:06
Hmm this is going to be a recurring pattern. I thi
xhwang
2015/07/21 22:30:54
Acknowledged.
|
+ nullptr); |
+ |
+ mojo::ConnectToService(service_provider.get(), &media_service_factory_); |
+ |
+ media_service_factory_.set_connection_error_handler( |
+ base::Bind(&RenderFrameImpl::OnMediaServiceFactoryConnectionError, |
base::Unretained(this))); |
} |
- return media_service_provider_.get(); |
+ |
+ return media_service_factory_.get(); |
} |
-void RenderFrameImpl::OnMediaServiceProviderConnectionError() { |
- media_service_provider_.reset(); |
+void RenderFrameImpl::OnMediaServiceFactoryConnectionError() { |
+ // TODO(xhwang): Resetting |media_service_factory_| could cause access |
+ // violation on the old |media_service_factory_| by outstanding |
+ // media::CdmFactory or media::RendererFactory. Find a better way to handle |
+ // this. |
+ // media_service_factory_.reset(); |
} |
#endif |
@@ -5013,7 +5024,7 @@ media::CdmFactory* RenderFrameImpl::GetCdmFactory() { |
DCHECK(frame_); |
#if defined(ENABLE_MOJO_MEDIA) |
- cdm_factory_.reset(new media::MojoCdmFactory(GetMediaServiceProvider())); |
+ cdm_factory_.reset(new media::MojoCdmFactory(GetMediaServiceFactory())); |
#else |
cdm_factory_.reset(new RenderCdmFactory( |
#if defined(ENABLE_PEPPER_CDMS) |