Chromium Code Reviews| 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) |