Commit d0060d7e authored by Mario Sanchez Prada's avatar Mario Sanchez Prada Committed by Commit Bot

Migrate references of content::mojom::RendererAudioOutputStreamFactory

Convert both the implementation and clients in the browser and renderer
processes for the content.mojom.RendererAudioOutputStreamFactory
interface, and adapt unit tests.

Bug: 955171
Change-Id: I1732245f699c7c05e1d771d1210fed60076322fb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1801151Reviewed-by: default avatarOksana Zhuravlova <oksamyt@chromium.org>
Reviewed-by: default avatarTommi <tommi@chromium.org>
Reviewed-by: default avatarArthur Sonzogni <arthursonzogni@chromium.org>
Commit-Queue: Mario Sanchez Prada <mario@igalia.com>
Cr-Commit-Position: refs/heads/master@{#697130}
parent 953a8150
...@@ -6244,21 +6244,21 @@ void RenderFrameHostImpl::CreateAudioInputStreamFactory( ...@@ -6244,21 +6244,21 @@ void RenderFrameHostImpl::CreateAudioInputStreamFactory(
} }
void RenderFrameHostImpl::CreateAudioOutputStreamFactory( void RenderFrameHostImpl::CreateAudioOutputStreamFactory(
mojom::RendererAudioOutputStreamFactoryRequest request) { mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) {
if (base::FeatureList::IsEnabled(features::kAudioServiceAudioStreams)) { if (base::FeatureList::IsEnabled(features::kAudioServiceAudioStreams)) {
media::AudioSystem* audio_system = media::AudioSystem* audio_system =
BrowserMainLoop::GetInstance()->audio_system(); BrowserMainLoop::GetInstance()->audio_system();
MediaStreamManager* media_stream_manager = MediaStreamManager* media_stream_manager =
BrowserMainLoop::GetInstance()->media_stream_manager(); BrowserMainLoop::GetInstance()->media_stream_manager();
audio_service_audio_output_stream_factory_.emplace( audio_service_audio_output_stream_factory_.emplace(
this, audio_system, media_stream_manager, std::move(request)); this, audio_system, media_stream_manager, std::move(receiver));
} else { } else {
RendererAudioOutputStreamFactoryContext* factory_context = RendererAudioOutputStreamFactoryContext* factory_context =
GetProcess()->GetRendererAudioOutputStreamFactoryContext(); GetProcess()->GetRendererAudioOutputStreamFactoryContext();
DCHECK(factory_context); DCHECK(factory_context);
in_content_audio_output_stream_factory_ = in_content_audio_output_stream_factory_ =
RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( RenderFrameAudioOutputStreamFactoryHandle::CreateFactory(
factory_context, GetRoutingID(), std::move(request)); factory_context, GetRoutingID(), std::move(receiver));
} }
} }
......
...@@ -1523,7 +1523,7 @@ class CONTENT_EXPORT RenderFrameHostImpl ...@@ -1523,7 +1523,7 @@ class CONTENT_EXPORT RenderFrameHostImpl
void CreateAudioInputStreamFactory( void CreateAudioInputStreamFactory(
mojo::PendingReceiver<mojom::RendererAudioInputStreamFactory> receiver); mojo::PendingReceiver<mojom::RendererAudioInputStreamFactory> receiver);
void CreateAudioOutputStreamFactory( void CreateAudioOutputStreamFactory(
mojom::RendererAudioOutputStreamFactoryRequest request); mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver);
void BindMediaInterfaceFactoryRequest( void BindMediaInterfaceFactoryRequest(
media::mojom::InterfaceFactoryRequest request); media::mojom::InterfaceFactoryRequest request);
......
...@@ -28,7 +28,7 @@ std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle, ...@@ -28,7 +28,7 @@ std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle,
RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( RenderFrameAudioOutputStreamFactoryHandle::CreateFactory(
RendererAudioOutputStreamFactoryContext* context, RendererAudioOutputStreamFactoryContext* context,
int render_frame_id, int render_frame_id,
mojom::RendererAudioOutputStreamFactoryRequest request) { mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) {
std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle, std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle,
BrowserThread::DeleteOnIOThread> BrowserThread::DeleteOnIOThread>
handle(new RenderFrameAudioOutputStreamFactoryHandle(context, handle(new RenderFrameAudioOutputStreamFactoryHandle(context,
...@@ -38,7 +38,7 @@ RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( ...@@ -38,7 +38,7 @@ RenderFrameAudioOutputStreamFactoryHandle::CreateFactory(
base::PostTask( base::PostTask(
FROM_HERE, {BrowserThread::IO}, FROM_HERE, {BrowserThread::IO},
base::BindOnce(&RenderFrameAudioOutputStreamFactoryHandle::Init, base::BindOnce(&RenderFrameAudioOutputStreamFactoryHandle::Init,
base::Unretained(handle.get()), std::move(request))); base::Unretained(handle.get()), std::move(receiver)));
return handle; return handle;
} }
...@@ -51,12 +51,12 @@ RenderFrameAudioOutputStreamFactoryHandle:: ...@@ -51,12 +51,12 @@ RenderFrameAudioOutputStreamFactoryHandle::
RenderFrameAudioOutputStreamFactoryHandle( RenderFrameAudioOutputStreamFactoryHandle(
RendererAudioOutputStreamFactoryContext* context, RendererAudioOutputStreamFactoryContext* context,
int render_frame_id) int render_frame_id)
: impl_(render_frame_id, context), binding_(&impl_) {} : impl_(render_frame_id, context), receiver_(&impl_) {}
void RenderFrameAudioOutputStreamFactoryHandle::Init( void RenderFrameAudioOutputStreamFactoryHandle::Init(
mojom::RendererAudioOutputStreamFactoryRequest request) { mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
binding_.Bind(std::move(request)); receiver_.Bind(std::move(receiver));
} }
OldRenderFrameAudioOutputStreamFactory::OldRenderFrameAudioOutputStreamFactory( OldRenderFrameAudioOutputStreamFactory::OldRenderFrameAudioOutputStreamFactory(
......
...@@ -14,13 +14,14 @@ ...@@ -14,13 +14,14 @@
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/common/media/renderer_audio_output_stream_factory.mojom.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
namespace content { namespace content {
class RendererAudioOutputStreamFactoryContext; class RendererAudioOutputStreamFactoryContext;
// Handles a RendererAudioOutputStreamFactory request for a render frame host, // Handles a RendererAudioOutputStreamFactory receiver for a render frame host,
// using the provided RendererAudioOutputStreamFactoryContext. This class may // using the provided RendererAudioOutputStreamFactoryContext. This class may
// be constructed on any thread, but must be used on the IO thread after that. // be constructed on any thread, but must be used on the IO thread after that.
// This class is used for creating streams hosted by the browser. It is being // This class is used for creating streams hosted by the browser. It is being
...@@ -77,14 +78,15 @@ class CONTENT_EXPORT OldRenderFrameAudioOutputStreamFactory ...@@ -77,14 +78,15 @@ class CONTENT_EXPORT OldRenderFrameAudioOutputStreamFactory
DISALLOW_COPY_AND_ASSIGN(OldRenderFrameAudioOutputStreamFactory); DISALLOW_COPY_AND_ASSIGN(OldRenderFrameAudioOutputStreamFactory);
}; };
// This class is a convenient bundle of factory and binding. // This class is a convenient bundle of factory and receiver.
class CONTENT_EXPORT RenderFrameAudioOutputStreamFactoryHandle { class CONTENT_EXPORT RenderFrameAudioOutputStreamFactoryHandle {
public: public:
static std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle, static std::unique_ptr<RenderFrameAudioOutputStreamFactoryHandle,
BrowserThread::DeleteOnIOThread> BrowserThread::DeleteOnIOThread>
CreateFactory(RendererAudioOutputStreamFactoryContext* context, CreateFactory(
int render_frame_id, RendererAudioOutputStreamFactoryContext* context,
mojom::RendererAudioOutputStreamFactoryRequest request); int render_frame_id,
mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver);
~RenderFrameAudioOutputStreamFactoryHandle(); ~RenderFrameAudioOutputStreamFactoryHandle();
...@@ -93,10 +95,11 @@ class CONTENT_EXPORT RenderFrameAudioOutputStreamFactoryHandle { ...@@ -93,10 +95,11 @@ class CONTENT_EXPORT RenderFrameAudioOutputStreamFactoryHandle {
RendererAudioOutputStreamFactoryContext* context, RendererAudioOutputStreamFactoryContext* context,
int render_frame_id); int render_frame_id);
void Init(mojom::RendererAudioOutputStreamFactoryRequest request); void Init(
mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver);
OldRenderFrameAudioOutputStreamFactory impl_; OldRenderFrameAudioOutputStreamFactory impl_;
mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_;
DISALLOW_COPY_AND_ASSIGN(RenderFrameAudioOutputStreamFactoryHandle); DISALLOW_COPY_AND_ASSIGN(RenderFrameAudioOutputStreamFactoryHandle);
}; };
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "media/base/audio_parameters.h" #include "media/base/audio_parameters.h"
#include "media/mojo/mojom/audio_data_pipe.mojom.h" #include "media/mojo/mojom/audio_data_pipe.mojom.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/system/platform_handle.h" #include "mojo/public/cpp/system/platform_handle.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -29,11 +30,6 @@ namespace content { ...@@ -29,11 +30,6 @@ namespace content {
namespace { namespace {
using testing::Test; using testing::Test;
using AudioOutputStreamFactory = mojom::RendererAudioOutputStreamFactory;
using AudioOutputStreamFactoryPtr =
mojo::InterfacePtr<AudioOutputStreamFactory>;
using AudioOutputStreamFactoryRequest =
mojo::InterfaceRequest<AudioOutputStreamFactory>;
using AudioOutputStream = media::mojom::AudioOutputStream; using AudioOutputStream = media::mojom::AudioOutputStream;
using AudioOutputStreamPtr = mojo::InterfacePtr<AudioOutputStream>; using AudioOutputStreamPtr = mojo::InterfacePtr<AudioOutputStream>;
using AudioOutputStreamRequest = mojo::InterfaceRequest<AudioOutputStream>; using AudioOutputStreamRequest = mojo::InterfaceRequest<AudioOutputStream>;
...@@ -143,23 +139,23 @@ class MockContext : public RendererAudioOutputStreamFactoryContext { ...@@ -143,23 +139,23 @@ class MockContext : public RendererAudioOutputStreamFactoryContext {
return std::move(delegate_); return std::move(delegate_);
} }
AudioOutputStreamFactoryPtr CreateFactory() { mojo::Remote<mojom::RendererAudioOutputStreamFactory> CreateFactory() {
DCHECK(!factory_); DCHECK(!factory_);
AudioOutputStreamFactoryPtr ret; mojo::Remote<mojom::RendererAudioOutputStreamFactory> remote;
factory_ = std::make_unique<OldRenderFrameAudioOutputStreamFactory>( factory_ = std::make_unique<OldRenderFrameAudioOutputStreamFactory>(
kRenderFrameId, this); kRenderFrameId, this);
factory_binding_ = std::make_unique< factory_receiver_ = std::make_unique<
mojo::Binding<mojom::RendererAudioOutputStreamFactory>>( mojo::Receiver<mojom::RendererAudioOutputStreamFactory>>(
factory_.get(), mojo::MakeRequest(&ret)); factory_.get(), remote.BindNewPipeAndPassReceiver());
return ret; return remote;
} }
private: private:
const std::string salt_; const std::string salt_;
const bool auth_ok_; const bool auth_ok_;
std::unique_ptr<OldRenderFrameAudioOutputStreamFactory> factory_; std::unique_ptr<OldRenderFrameAudioOutputStreamFactory> factory_;
std::unique_ptr<mojo::Binding<mojom::RendererAudioOutputStreamFactory>> std::unique_ptr<mojo::Receiver<mojom::RendererAudioOutputStreamFactory>>
factory_binding_; factory_receiver_;
std::unique_ptr<media::AudioOutputDelegate> delegate_; std::unique_ptr<media::AudioOutputDelegate> delegate_;
media::AudioOutputDelegate::EventHandler** delegate_event_handler_location_ = media::AudioOutputDelegate::EventHandler** delegate_event_handler_location_ =
nullptr; nullptr;
...@@ -221,12 +217,13 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, CreateStream) { ...@@ -221,12 +217,13 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, CreateStream) {
auto factory_context = std::make_unique<MockContext>(true); auto factory_context = std::make_unique<MockContext>(true);
factory_context->PrepareDelegateForCreation( factory_context->PrepareDelegateForCreation(
std::make_unique<MockAudioOutputDelegate>(), &event_handler); std::make_unique<MockAudioOutputDelegate>(), &event_handler);
AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote =
factory_context->CreateFactory();
media::OutputDeviceStatus status; media::OutputDeviceStatus status;
media::AudioParameters params; media::AudioParameters params;
std::string id; std::string id;
factory_ptr->RequestDeviceAuthorization( factory_remote->RequestDeviceAuthorization(
mojo::MakeRequest(&provider), base::nullopt, "default", mojo::MakeRequest(&provider), base::nullopt, "default",
base::BindOnce(&AuthCallback, base::Unretained(&status), base::BindOnce(&AuthCallback, base::Unretained(&status),
base::Unretained(&params), base::Unretained(&id))); base::Unretained(&params), base::Unretained(&id)));
...@@ -264,12 +261,13 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, NotAuthorized_Denied) { ...@@ -264,12 +261,13 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, NotAuthorized_Denied) {
content::BrowserTaskEnvironment task_environment; content::BrowserTaskEnvironment task_environment;
AudioOutputStreamProviderPtr output_provider; AudioOutputStreamProviderPtr output_provider;
auto factory_context = std::make_unique<MockContext>(false); auto factory_context = std::make_unique<MockContext>(false);
AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote =
factory_context->CreateFactory();
media::OutputDeviceStatus status; media::OutputDeviceStatus status;
media::AudioParameters params; media::AudioParameters params;
std::string id; std::string id;
factory_ptr->RequestDeviceAuthorization( factory_remote->RequestDeviceAuthorization(
mojo::MakeRequest(&output_provider), base::nullopt, "default", mojo::MakeRequest(&output_provider), base::nullopt, "default",
base::BindOnce(&AuthCallback, base::Unretained(&status), base::BindOnce(&AuthCallback, base::Unretained(&status),
base::Unretained(&params), base::Unretained(&id))); base::Unretained(&params), base::Unretained(&id)));
...@@ -291,9 +289,10 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, ...@@ -291,9 +289,10 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest,
base::BindOnce([](bool* destructed) { *destructed = true; }, base::BindOnce([](bool* destructed) { *destructed = true; },
&delegate_is_destructed)), &delegate_is_destructed)),
&event_handler); &event_handler);
AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote =
factory_context->CreateFactory();
factory_ptr->RequestDeviceAuthorization( factory_remote->RequestDeviceAuthorization(
mojo::MakeRequest(&provider), base::nullopt, "default", mojo::MakeRequest(&provider), base::nullopt, "default",
base::BindOnce([](media::OutputDeviceStatus status, base::BindOnce([](media::OutputDeviceStatus status,
const media::AudioParameters& params, const media::AudioParameters& params,
...@@ -322,9 +321,10 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, DelegateError_DeletesStream) { ...@@ -322,9 +321,10 @@ TEST(OldRenderFrameAudioOutputStreamFactoryTest, DelegateError_DeletesStream) {
base::BindOnce([](bool* destructed) { *destructed = true; }, base::BindOnce([](bool* destructed) { *destructed = true; },
&delegate_is_destructed)), &delegate_is_destructed)),
&event_handler); &event_handler);
AudioOutputStreamFactoryPtr factory_ptr = factory_context->CreateFactory(); mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote =
factory_context->CreateFactory();
factory_ptr->RequestDeviceAuthorization( factory_remote->RequestDeviceAuthorization(
mojo::MakeRequest(&provider), base::nullopt, "default", mojo::MakeRequest(&provider), base::nullopt, "default",
base::BindOnce([](media::OutputDeviceStatus status, base::BindOnce([](media::OutputDeviceStatus status,
const media::AudioParameters& params, const media::AudioParameters& params,
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "media/base/output_device_info.h" #include "media/base/output_device_info.h"
#include "media/mojo/mojom/audio_output_stream.mojom.h" #include "media/mojo/mojom/audio_output_stream.mojom.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/receiver.h"
namespace content { namespace content {
...@@ -38,11 +39,12 @@ class RenderFrameAudioOutputStreamFactory::Core final ...@@ -38,11 +39,12 @@ class RenderFrameAudioOutputStreamFactory::Core final
Core(RenderFrameHost* frame, Core(RenderFrameHost* frame,
media::AudioSystem* audio_system, media::AudioSystem* audio_system,
MediaStreamManager* media_stream_manager, MediaStreamManager* media_stream_manager,
mojom::RendererAudioOutputStreamFactoryRequest request); mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver);
~Core() final = default; ~Core() final = default;
void Init(mojom::RendererAudioOutputStreamFactoryRequest request); void Init(
mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver);
size_t current_number_of_providers_for_testing() { size_t current_number_of_providers_for_testing() {
return stream_providers_.size(); return stream_providers_.size();
...@@ -130,7 +132,7 @@ class RenderFrameAudioOutputStreamFactory::Core final ...@@ -130,7 +132,7 @@ class RenderFrameAudioOutputStreamFactory::Core final
const int frame_id_; const int frame_id_;
AudioOutputAuthorizationHandler authorization_handler_; AudioOutputAuthorizationHandler authorization_handler_;
mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_{this};
// Always null-check this weak pointer before dereferencing it. // Always null-check this weak pointer before dereferencing it.
base::WeakPtr<ForwardingAudioStreamFactory::Core> forwarding_factory_; base::WeakPtr<ForwardingAudioStreamFactory::Core> forwarding_factory_;
...@@ -150,11 +152,11 @@ RenderFrameAudioOutputStreamFactory::RenderFrameAudioOutputStreamFactory( ...@@ -150,11 +152,11 @@ RenderFrameAudioOutputStreamFactory::RenderFrameAudioOutputStreamFactory(
RenderFrameHost* frame, RenderFrameHost* frame,
media::AudioSystem* audio_system, media::AudioSystem* audio_system,
MediaStreamManager* media_stream_manager, MediaStreamManager* media_stream_manager,
mojom::RendererAudioOutputStreamFactoryRequest request) mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver)
: core_(new Core(frame, : core_(new Core(frame,
audio_system, audio_system,
media_stream_manager, media_stream_manager,
std::move(request))) { std::move(receiver))) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
} }
...@@ -179,11 +181,10 @@ RenderFrameAudioOutputStreamFactory::Core::Core( ...@@ -179,11 +181,10 @@ RenderFrameAudioOutputStreamFactory::Core::Core(
RenderFrameHost* frame, RenderFrameHost* frame,
media::AudioSystem* audio_system, media::AudioSystem* audio_system,
MediaStreamManager* media_stream_manager, MediaStreamManager* media_stream_manager,
mojom::RendererAudioOutputStreamFactoryRequest request) mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver)
: process_id_(frame->GetProcess()->GetID()), : process_id_(frame->GetProcess()->GetID()),
frame_id_(frame->GetRoutingID()), frame_id_(frame->GetRoutingID()),
authorization_handler_(audio_system, media_stream_manager, process_id_), authorization_handler_(audio_system, media_stream_manager, process_id_) {
binding_(this) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
ForwardingAudioStreamFactory::Core* tmp_factory = ForwardingAudioStreamFactory::Core* tmp_factory =
...@@ -202,14 +203,14 @@ RenderFrameAudioOutputStreamFactory::Core::Core( ...@@ -202,14 +203,14 @@ RenderFrameAudioOutputStreamFactory::Core::Core(
// thread. // thread.
base::PostTask( base::PostTask(
FROM_HERE, {BrowserThread::IO}, FROM_HERE, {BrowserThread::IO},
base::BindOnce(&Core::Init, base::Unretained(this), std::move(request))); base::BindOnce(&Core::Init, base::Unretained(this), std::move(receiver)));
} }
void RenderFrameAudioOutputStreamFactory::Core::Init( void RenderFrameAudioOutputStreamFactory::Core::Init(
mojom::RendererAudioOutputStreamFactoryRequest request) { mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) {
DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_CURRENTLY_ON(BrowserThread::IO);
binding_.Bind(std::move(request)); receiver_.Bind(std::move(receiver));
} }
void RenderFrameAudioOutputStreamFactory::Core::RequestDeviceAuthorization( void RenderFrameAudioOutputStreamFactory::Core::RequestDeviceAuthorization(
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/common/media/renderer_audio_output_stream_factory.mojom.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
namespace media { namespace media {
class AudioSystem; class AudioSystem;
...@@ -45,7 +46,7 @@ class CONTENT_EXPORT RenderFrameAudioOutputStreamFactory final { ...@@ -45,7 +46,7 @@ class CONTENT_EXPORT RenderFrameAudioOutputStreamFactory final {
RenderFrameHost* frame, RenderFrameHost* frame,
media::AudioSystem* audio_system, media::AudioSystem* audio_system,
MediaStreamManager* media_stream_manager, MediaStreamManager* media_stream_manager,
mojom::RendererAudioOutputStreamFactoryRequest request); mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver);
~RenderFrameAudioOutputStreamFactory(); ~RenderFrameAudioOutputStreamFactory();
......
...@@ -30,8 +30,11 @@ ...@@ -30,8 +30,11 @@
#include "media/audio/test_audio_thread.h" #include "media/audio/test_audio_thread.h"
#include "media/base/audio_parameters.h" #include "media/base/audio_parameters.h"
#include "media/mojo/mojom/audio_output_stream.mojom.h" #include "media/mojo/mojom/audio_output_stream.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/pending_associated_remote.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/audio/public/cpp/fake_stream_factory.h" #include "services/audio/public/cpp/fake_stream_factory.h"
#include "services/audio/public/mojom/constants.mojom.h" #include "services/audio/public/mojom/constants.mojom.h"
#include "services/audio/public/mojom/stream_factory.mojom.h" #include "services/audio/public/mojom/stream_factory.mojom.h"
...@@ -133,24 +136,24 @@ class RenderFrameAudioOutputStreamFactoryTest ...@@ -133,24 +136,24 @@ class RenderFrameAudioOutputStreamFactoryTest
}; };
TEST_F(RenderFrameAudioOutputStreamFactoryTest, ConstructDestruct) { TEST_F(RenderFrameAudioOutputStreamFactoryTest, ConstructDestruct) {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote;
RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), RenderFrameAudioOutputStreamFactory factory(
media_stream_manager_.get(), main_rfh(), audio_system_.get(), media_stream_manager_.get(),
mojo::MakeRequest(&factory_ptr)); factory_remote.BindNewPipeAndPassReceiver());
} }
TEST_F(RenderFrameAudioOutputStreamFactoryTest, TEST_F(RenderFrameAudioOutputStreamFactoryTest,
RequestDeviceAuthorizationForDefaultDevice_StatusOk) { RequestDeviceAuthorizationForDefaultDevice_StatusOk) {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote;
RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), RenderFrameAudioOutputStreamFactory factory(
media_stream_manager_.get(), main_rfh(), audio_system_.get(), media_stream_manager_.get(),
mojo::MakeRequest(&factory_ptr)); factory_remote.BindNewPipeAndPassReceiver());
media::mojom::AudioOutputStreamProviderPtr provider_ptr; media::mojom::AudioOutputStreamProviderPtr provider_ptr;
MockAuthorizationCallback mock_callback; MockAuthorizationCallback mock_callback;
factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr),
base::nullopt, kDefaultDeviceId, base::nullopt, kDefaultDeviceId,
mock_callback.Get()); mock_callback.Get());
EXPECT_CALL(mock_callback, EXPECT_CALL(mock_callback,
Run(media::OUTPUT_DEVICE_STATUS_OK, _, std::string())); Run(media::OUTPUT_DEVICE_STATUS_OK, _, std::string()));
...@@ -163,16 +166,16 @@ TEST_F(RenderFrameAudioOutputStreamFactoryTest, ...@@ -163,16 +166,16 @@ TEST_F(RenderFrameAudioOutputStreamFactoryTest,
TEST_F( TEST_F(
RenderFrameAudioOutputStreamFactoryTest, RenderFrameAudioOutputStreamFactoryTest,
RequestDeviceAuthorizationForDefaultDeviceAndDestroyProviderPtr_CleansUp) { RequestDeviceAuthorizationForDefaultDeviceAndDestroyProviderPtr_CleansUp) {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote;
RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), RenderFrameAudioOutputStreamFactory factory(
media_stream_manager_.get(), main_rfh(), audio_system_.get(), media_stream_manager_.get(),
mojo::MakeRequest(&factory_ptr)); factory_remote.BindNewPipeAndPassReceiver());
media::mojom::AudioOutputStreamProviderPtr provider_ptr; media::mojom::AudioOutputStreamProviderPtr provider_ptr;
MockAuthorizationCallback mock_callback; MockAuthorizationCallback mock_callback;
factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr),
base::nullopt, kDefaultDeviceId, base::nullopt, kDefaultDeviceId,
mock_callback.Get()); mock_callback.Get());
provider_ptr.reset(); provider_ptr.reset();
EXPECT_CALL(mock_callback, EXPECT_CALL(mock_callback,
...@@ -186,16 +189,16 @@ TEST_F( ...@@ -186,16 +189,16 @@ TEST_F(
TEST_F( TEST_F(
RenderFrameAudioOutputStreamFactoryTest, RenderFrameAudioOutputStreamFactoryTest,
RequestDeviceAuthorizationForNondefaultDeviceWithoutAuthorization_Fails) { RequestDeviceAuthorizationForNondefaultDeviceWithoutAuthorization_Fails) {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote;
RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), RenderFrameAudioOutputStreamFactory factory(
media_stream_manager_.get(), main_rfh(), audio_system_.get(), media_stream_manager_.get(),
mojo::MakeRequest(&factory_ptr)); factory_remote.BindNewPipeAndPassReceiver());
media::mojom::AudioOutputStreamProviderPtr provider_ptr; media::mojom::AudioOutputStreamProviderPtr provider_ptr;
MockAuthorizationCallback mock_callback; MockAuthorizationCallback mock_callback;
factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr),
base::nullopt, kDeviceId, base::nullopt, kDeviceId,
mock_callback.Get()); mock_callback.Get());
EXPECT_CALL(mock_callback, EXPECT_CALL(mock_callback,
Run(Ne(media::OUTPUT_DEVICE_STATUS_OK), _, std::string())); Run(Ne(media::OUTPUT_DEVICE_STATUS_OK), _, std::string()));
...@@ -207,16 +210,16 @@ TEST_F( ...@@ -207,16 +210,16 @@ TEST_F(
TEST_F(RenderFrameAudioOutputStreamFactoryTest, TEST_F(RenderFrameAudioOutputStreamFactoryTest,
CreateStream_CreatesStreamAndFreesProvider) { CreateStream_CreatesStreamAndFreesProvider) {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote;
RenderFrameAudioOutputStreamFactory factory(main_rfh(), audio_system_.get(), RenderFrameAudioOutputStreamFactory factory(
media_stream_manager_.get(), main_rfh(), audio_system_.get(), media_stream_manager_.get(),
mojo::MakeRequest(&factory_ptr)); factory_remote.BindNewPipeAndPassReceiver());
media::mojom::AudioOutputStreamProviderPtr provider_ptr; media::mojom::AudioOutputStreamProviderPtr provider_ptr;
MockAuthorizationCallback mock_callback; MockAuthorizationCallback mock_callback;
factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr),
base::nullopt, kDefaultDeviceId, base::nullopt, kDefaultDeviceId,
mock_callback.Get()); mock_callback.Get());
{ {
media::mojom::AudioOutputStreamProviderClientPtr client; media::mojom::AudioOutputStreamProviderClientPtr client;
mojo::MakeRequest(&client); mojo::MakeRequest(&client);
...@@ -239,14 +242,14 @@ TEST_F(RenderFrameAudioOutputStreamFactoryTest, ...@@ -239,14 +242,14 @@ TEST_F(RenderFrameAudioOutputStreamFactoryTest,
MockAuthorizationCallback mock_callback; MockAuthorizationCallback mock_callback;
{ {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> factory_remote;
RenderFrameAudioOutputStreamFactory factory( RenderFrameAudioOutputStreamFactory factory(
main_rfh(), audio_system_.get(), media_stream_manager_.get(), main_rfh(), audio_system_.get(), media_stream_manager_.get(),
mojo::MakeRequest(&factory_ptr)); factory_remote.BindNewPipeAndPassReceiver());
factory_ptr->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr), factory_remote->RequestDeviceAuthorization(mojo::MakeRequest(&provider_ptr),
base::nullopt, kDefaultDeviceId, base::nullopt, kDefaultDeviceId,
mock_callback.Get()); mock_callback.Get());
audio::mojom::StreamFactory::CreateOutputStreamCallback created_callback; audio::mojom::StreamFactory::CreateOutputStreamCallback created_callback;
EXPECT_CALL(mock_callback, EXPECT_CALL(mock_callback,
......
...@@ -25,7 +25,7 @@ AudioOutputIPCFactory::AudioOutputIPCFactory( ...@@ -25,7 +25,7 @@ AudioOutputIPCFactory::AudioOutputIPCFactory(
AudioOutputIPCFactory::~AudioOutputIPCFactory() { AudioOutputIPCFactory::~AudioOutputIPCFactory() {
// Allow destruction in tests. // Allow destruction in tests.
DCHECK(factory_ptrs_.empty()); DCHECK(factory_remotes_.empty());
DCHECK_EQ(instance_, this); DCHECK_EQ(instance_, this);
instance_ = nullptr; instance_ = nullptr;
} }
...@@ -42,16 +42,16 @@ AudioOutputIPCFactory::CreateAudioOutputIPC(int frame_id) const { ...@@ -42,16 +42,16 @@ AudioOutputIPCFactory::CreateAudioOutputIPC(int frame_id) const {
void AudioOutputIPCFactory::RegisterRemoteFactory( void AudioOutputIPCFactory::RegisterRemoteFactory(
int frame_id, int frame_id,
service_manager::InterfaceProvider* interface_provider) { service_manager::InterfaceProvider* interface_provider) {
mojom::RendererAudioOutputStreamFactoryPtr factory_ptr; mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory> factory_remote;
interface_provider->GetInterface(&factory_ptr); interface_provider->GetInterface(
// PassInterface unbinds the message pipe from the current thread. This factory_remote.InitWithNewPipeAndPassReceiver());
// allows us to bind it to the IO thread.
// Unretained is safe due to the contract at the top of the header file. // Unretained is safe due to the contract at the top of the header file.
// It's safe to pass the |factory_remote| PendingRemote between threads.
io_task_runner_->PostTask( io_task_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(&AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread, base::BindOnce(&AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread,
base::Unretained(this), frame_id, base::Unretained(this), frame_id,
factory_ptr.PassInterface())); std::move(factory_remote)));
} }
void AudioOutputIPCFactory::MaybeDeregisterRemoteFactory(int frame_id) { void AudioOutputIPCFactory::MaybeDeregisterRemoteFactory(int frame_id) {
...@@ -65,17 +65,17 @@ void AudioOutputIPCFactory::MaybeDeregisterRemoteFactory(int frame_id) { ...@@ -65,17 +65,17 @@ void AudioOutputIPCFactory::MaybeDeregisterRemoteFactory(int frame_id) {
mojom::RendererAudioOutputStreamFactory* mojom::RendererAudioOutputStreamFactory*
AudioOutputIPCFactory::GetRemoteFactory(int frame_id) const { AudioOutputIPCFactory::GetRemoteFactory(int frame_id) const {
DCHECK(io_task_runner_->BelongsToCurrentThread()); DCHECK(io_task_runner_->BelongsToCurrentThread());
auto it = factory_ptrs_.find(frame_id); auto it = factory_remotes_.find(frame_id);
return it == factory_ptrs_.end() ? nullptr : it->second.get(); return it == factory_remotes_.end() ? nullptr : it->second.get();
} }
void AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread( void AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread(
int frame_id, int frame_id,
mojom::RendererAudioOutputStreamFactoryPtrInfo factory_ptr_info) { mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory>
factory_pending_remote) {
DCHECK(io_task_runner_->BelongsToCurrentThread()); DCHECK(io_task_runner_->BelongsToCurrentThread());
std::pair<StreamFactoryMap::iterator, bool> emplace_result = std::pair<StreamFactoryMap::iterator, bool> emplace_result =
factory_ptrs_.emplace(frame_id, factory_remotes_.emplace(frame_id, std::move(factory_pending_remote));
mojo::MakeProxy(std::move(factory_ptr_info)));
DCHECK(emplace_result.second) << "Attempt to register a factory for a " DCHECK(emplace_result.second) << "Attempt to register a factory for a "
"frame which already has a factory " "frame which already has a factory "
...@@ -85,9 +85,9 @@ void AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread( ...@@ -85,9 +85,9 @@ void AudioOutputIPCFactory::RegisterRemoteFactoryOnIOThread(
DCHECK(emplaced_factory.is_bound()) DCHECK(emplaced_factory.is_bound())
<< "Factory is not bound to a remote implementation."; << "Factory is not bound to a remote implementation.";
// Unretained is safe because |this| owns the binding, so a connection error // Unretained is safe because |this| owns the remote, so a connection error
// cannot trigger after destruction. // cannot trigger after destruction.
emplaced_factory.set_connection_error_handler(base::BindOnce( emplaced_factory.set_disconnect_handler(base::BindOnce(
&AudioOutputIPCFactory::MaybeDeregisterRemoteFactoryOnIOThread, &AudioOutputIPCFactory::MaybeDeregisterRemoteFactoryOnIOThread,
base::Unretained(this), frame_id)); base::Unretained(this), frame_id));
} }
...@@ -96,10 +96,10 @@ void AudioOutputIPCFactory::MaybeDeregisterRemoteFactoryOnIOThread( ...@@ -96,10 +96,10 @@ void AudioOutputIPCFactory::MaybeDeregisterRemoteFactoryOnIOThread(
int frame_id) { int frame_id) {
DCHECK(io_task_runner_->BelongsToCurrentThread()); DCHECK(io_task_runner_->BelongsToCurrentThread());
// This function can be called both by the frame and the connection error // This function can be called both by the frame and the connection error
// handler of the factory pointer. Calling erase multiple times even though // handler of the factory remote. Calling erase multiple times even though
// there is nothing to erase is safe, so we don't have to handle this in any // there is nothing to erase is safe, so we don't have to handle this in any
// particular way. // particular way.
factory_ptrs_.erase(frame_id); factory_remotes_.erase(frame_id);
} }
} // namespace content } // namespace content
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/common/media/renderer_audio_output_stream_factory.mojom.h" #include "content/common/media/renderer_audio_output_stream_factory.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace base { namespace base {
class SingleThreadTaskRunner; class SingleThreadTaskRunner;
...@@ -63,13 +65,15 @@ class CONTENT_EXPORT AudioOutputIPCFactory { ...@@ -63,13 +65,15 @@ class CONTENT_EXPORT AudioOutputIPCFactory {
private: private:
using StreamFactoryMap = using StreamFactoryMap =
base::flat_map<int, mojom::RendererAudioOutputStreamFactoryPtr>; base::flat_map<int,
mojo::Remote<mojom::RendererAudioOutputStreamFactory>>;
mojom::RendererAudioOutputStreamFactory* GetRemoteFactory(int frame_id) const; mojom::RendererAudioOutputStreamFactory* GetRemoteFactory(int frame_id) const;
void RegisterRemoteFactoryOnIOThread( void RegisterRemoteFactoryOnIOThread(
int frame_id, int frame_id,
mojom::RendererAudioOutputStreamFactoryPtrInfo factory_ptr_info); mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory>
factory_pending_remote);
void MaybeDeregisterRemoteFactoryOnIOThread(int frame_id); void MaybeDeregisterRemoteFactoryOnIOThread(int frame_id);
...@@ -77,7 +81,7 @@ class CONTENT_EXPORT AudioOutputIPCFactory { ...@@ -77,7 +81,7 @@ class CONTENT_EXPORT AudioOutputIPCFactory {
bool UsingMojoFactories() const; bool UsingMojoFactories() const;
// Maps frame id to the corresponding factory. // Maps frame id to the corresponding factory.
StreamFactoryMap factory_ptrs_; StreamFactoryMap factory_remotes_;
const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
#include "base/test/task_environment.h" #include "base/test/task_environment.h"
#include "base/threading/thread.h" #include "base/threading/thread.h"
#include "media/audio/audio_output_ipc.h" #include "media/audio/audio_output_ipc.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/interface_request.h" #include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/message_pipe.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "services/service_manager/public/cpp/interface_provider.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
...@@ -38,7 +38,7 @@ std::unique_ptr<base::Thread> MakeIOThread() { ...@@ -38,7 +38,7 @@ std::unique_ptr<base::Thread> MakeIOThread() {
class FakeRemoteFactory : public mojom::RendererAudioOutputStreamFactory { class FakeRemoteFactory : public mojom::RendererAudioOutputStreamFactory {
public: public:
FakeRemoteFactory() : binding_(this) {} FakeRemoteFactory() = default;
~FakeRemoteFactory() override {} ~FakeRemoteFactory() override {}
void RequestDeviceAuthorization( void RequestDeviceAuthorization(
...@@ -58,14 +58,14 @@ class FakeRemoteFactory : public mojom::RendererAudioOutputStreamFactory { ...@@ -58,14 +58,14 @@ class FakeRemoteFactory : public mojom::RendererAudioOutputStreamFactory {
} }
void Bind(mojo::ScopedMessagePipeHandle handle) { void Bind(mojo::ScopedMessagePipeHandle handle) {
EXPECT_FALSE(binding_.is_bound()); EXPECT_FALSE(receiver_.is_bound());
binding_.Bind( receiver_.Bind(
mojo::InterfaceRequest<mojom::RendererAudioOutputStreamFactory>( mojo::InterfaceRequest<mojom::RendererAudioOutputStreamFactory>(
std::move(handle))); std::move(handle)));
} }
private: private:
mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_{this};
base::OnceClosure on_called_; base::OnceClosure on_called_;
}; };
......
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include "media/audio/audio_device_description.h" #include "media/audio/audio_device_description.h"
#include "media/base/audio_parameters.h" #include "media/base/audio_parameters.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/platform_handle.h" #include "mojo/public/cpp/system/platform_handle.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -93,7 +95,7 @@ class TestRemoteFactory : public mojom::RendererAudioOutputStreamFactory { ...@@ -93,7 +95,7 @@ class TestRemoteFactory : public mojom::RendererAudioOutputStreamFactory {
public: public:
TestRemoteFactory() TestRemoteFactory()
: expect_request_(false), : expect_request_(false),
binding_(this, mojo::MakeRequest(&this_proxy_)) {} receiver_(this, this_remote_.BindNewPipeAndPassReceiver()) {}
~TestRemoteFactory() override {} ~TestRemoteFactory() override {}
...@@ -146,9 +148,9 @@ class TestRemoteFactory : public mojom::RendererAudioOutputStreamFactory { ...@@ -146,9 +148,9 @@ class TestRemoteFactory : public mojom::RendererAudioOutputStreamFactory {
} }
void Disconnect() { void Disconnect() {
binding_.Close(); receiver_.reset();
this_proxy_.reset(); this_remote_.reset();
binding_.Bind(mojo::MakeRequest(&this_proxy_)); receiver_.Bind(this_remote_.BindNewPipeAndPassReceiver());
provider_binding_.reset(); provider_binding_.reset();
provider_.reset(); provider_.reset();
expect_request_ = false; expect_request_ = false;
...@@ -159,14 +161,14 @@ class TestRemoteFactory : public mojom::RendererAudioOutputStreamFactory { ...@@ -159,14 +161,14 @@ class TestRemoteFactory : public mojom::RendererAudioOutputStreamFactory {
} }
private: private:
mojom::RendererAudioOutputStreamFactory* get() { return this_proxy_.get(); } mojom::RendererAudioOutputStreamFactory* get() { return this_remote_.get(); }
bool expect_request_; bool expect_request_;
base::Optional<base::UnguessableToken> expected_session_id_; base::Optional<base::UnguessableToken> expected_session_id_;
std::string expected_device_id_; std::string expected_device_id_;
mojom::RendererAudioOutputStreamFactoryPtr this_proxy_; mojo::Remote<mojom::RendererAudioOutputStreamFactory> this_remote_;
mojo::Binding<mojom::RendererAudioOutputStreamFactory> binding_; mojo::Receiver<mojom::RendererAudioOutputStreamFactory> receiver_{this};
std::unique_ptr<TestStreamProvider> provider_; std::unique_ptr<TestStreamProvider> provider_;
base::Optional<mojo::Binding<media::mojom::AudioOutputStreamProvider>> base::Optional<mojo::Binding<media::mojom::AudioOutputStreamProvider>>
provider_binding_; provider_binding_;
......
...@@ -31,7 +31,9 @@ ...@@ -31,7 +31,9 @@
#include "media/audio/simple_sources.h" #include "media/audio/simple_sources.h"
#include "media/base/audio_parameters.h" #include "media/base/audio_parameters.h"
#include "media/base/media_switches.h" #include "media/base/media_switches.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/system/platform_handle.h" #include "mojo/public/cpp/system/platform_handle.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
...@@ -189,12 +191,12 @@ class RendererAudioOutputStreamFactoryIntegrationTest : public Test { ...@@ -189,12 +191,12 @@ class RendererAudioOutputStreamFactoryIntegrationTest : public Test {
} }
UniqueAudioOutputStreamFactoryPtr CreateAndBindFactory( UniqueAudioOutputStreamFactoryPtr CreateAndBindFactory(
mojom::RendererAudioOutputStreamFactoryRequest request) { mojo::PendingReceiver<mojom::RendererAudioOutputStreamFactory> receiver) {
factory_context_.reset(new RendererAudioOutputStreamFactoryContextImpl( factory_context_.reset(new RendererAudioOutputStreamFactoryContextImpl(
kRenderProcessId, &audio_system_, &audio_manager_, kRenderProcessId, &audio_system_, &audio_manager_,
media_stream_manager_.get())); media_stream_manager_.get()));
return RenderFrameAudioOutputStreamFactoryHandle::CreateFactory( return RenderFrameAudioOutputStreamFactoryHandle::CreateFactory(
factory_context_.get(), kRenderFrameId, std::move(request)); factory_context_.get(), kRenderFrameId, std::move(receiver));
} }
std::unique_ptr<MediaStreamManager> media_stream_manager_; std::unique_ptr<MediaStreamManager> media_stream_manager_;
...@@ -229,35 +231,39 @@ TEST_F(RendererAudioOutputStreamFactoryIntegrationTest, StreamIntegrationTest) { ...@@ -229,35 +231,39 @@ TEST_F(RendererAudioOutputStreamFactoryIntegrationTest, StreamIntegrationTest) {
}, },
&create_stream_called, stream)); &create_stream_called, stream));
mojom::RendererAudioOutputStreamFactoryPtr stream_factory; mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory>
auto factory_handle = pending_stream_factory;
CreateAndBindFactory(mojo::MakeRequest(&stream_factory)); auto factory_handle = CreateAndBindFactory(
pending_stream_factory.InitWithNewPipeAndPassReceiver());
base::Thread renderer_side_ipc_thread("Renderer IPC thread"); base::Thread renderer_side_ipc_thread("Renderer IPC thread");
ASSERT_TRUE(renderer_side_ipc_thread.Start()); ASSERT_TRUE(renderer_side_ipc_thread.Start());
auto renderer_ipc_task_runner = renderer_side_ipc_thread.task_runner(); auto renderer_ipc_task_runner = renderer_side_ipc_thread.task_runner();
// Bind |stream_factory| to |renderer_ipc_task_runner|. // Bind |pending_stream_factory| to |renderer_ipc_task_runner|.
mojom::RendererAudioOutputStreamFactory* factory_ptr; mojo::Remote<mojom::RendererAudioOutputStreamFactory> stream_factory;
mojom::RendererAudioOutputStreamFactory* factory_remote;
renderer_ipc_task_runner->PostTask( renderer_ipc_task_runner->PostTask(
FROM_HERE, base::BindOnce( FROM_HERE,
[](mojom::RendererAudioOutputStreamFactoryPtr* factory, base::BindOnce(
mojom::RendererAudioOutputStreamFactoryPtrInfo info, [](mojo::Remote<mojom::RendererAudioOutputStreamFactory>* factory,
mojom::RendererAudioOutputStreamFactory** ptr) { mojo::PendingRemote<mojom::RendererAudioOutputStreamFactory>
factory->Bind(std::move(info)); pending_remote,
*ptr = factory->get(); mojom::RendererAudioOutputStreamFactory** ptr) {
}, factory->Bind(std::move(pending_remote));
base::Unretained(&stream_factory), *ptr = factory->get();
stream_factory.PassInterface(), &factory_ptr)); },
// Wait for factory_ptr to be set. base::Unretained(&stream_factory), std::move(pending_stream_factory),
&factory_remote));
// Wait for factory_remote to be set.
SyncWith(renderer_ipc_task_runner); SyncWith(renderer_ipc_task_runner);
auto renderer_side_ipc = std::make_unique<MojoAudioOutputIPC>( auto renderer_side_ipc = std::make_unique<MojoAudioOutputIPC>(
base::BindRepeating( base::BindRepeating(
[](mojom::RendererAudioOutputStreamFactory* factory_ptr) { [](mojom::RendererAudioOutputStreamFactory* factory_remote) {
return factory_ptr; return factory_remote;
}, },
factory_ptr), factory_remote),
renderer_ipc_task_runner); renderer_ipc_task_runner);
auto device = base::MakeRefCounted<media::AudioOutputDevice>( auto device = base::MakeRefCounted<media::AudioOutputDevice>(
...@@ -278,7 +284,8 @@ TEST_F(RendererAudioOutputStreamFactoryIntegrationTest, StreamIntegrationTest) { ...@@ -278,7 +284,8 @@ TEST_F(RendererAudioOutputStreamFactoryIntegrationTest, StreamIntegrationTest) {
// |stream_factory| must be destroyed on the correct thread. // |stream_factory| must be destroyed on the correct thread.
renderer_ipc_task_runner->PostTask( renderer_ipc_task_runner->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce([](mojom::RendererAudioOutputStreamFactoryPtr) {}, base::BindOnce([](mojo::Remote<mojom::RendererAudioOutputStreamFactory>
stream_factory) { stream_factory.reset(); },
std::move(stream_factory))); std::move(stream_factory)));
SyncWith(renderer_ipc_task_runner); SyncWith(renderer_ipc_task_runner);
// Wait for any clean-up tasks. // Wait for any clean-up tasks.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment