// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "base/bind.h" #include "base/callback_helpers.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/thread_task_runner_handle.h" #include "base/threading/thread.h" #include "media/base/audio_hardware_config.h" #include "media/base/media_log.h" #include "media/base/test_helpers.h" #include "media/blink/webmediaplayer_delegate.h" #include "media/blink/webmediaplayer_impl.h" #include "media/blink/webmediaplayer_params.h" #include "media/renderers/default_renderer_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" #include "third_party/WebKit/public/web/WebFrameClient.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebView.h" #include "url/gurl.h" namespace media { int64_t OnAdjustAllocatedMemory(int64_t delta) { return 0; } // Dummy superclass necessary since blink::WebFrameClient() has a protected // destructor. class DummyWebFrameClient : public blink::WebFrameClient {}; class DummyWebMediaPlayerClient : public blink::WebMediaPlayerClient { public: DummyWebMediaPlayerClient() {} // blink::WebMediaPlayerClient implementation. void networkStateChanged() override {} void readyStateChanged() override {} void timeChanged() override {} void repaint() override {} void durationChanged() override {} void sizeChanged() override {} void playbackStateChanged() override {} void setWebLayer(blink::WebLayer*) override {} blink::WebMediaPlayer::TrackId addAudioTrack( const blink::WebString& id, blink::WebMediaPlayerClient::AudioTrackKind, const blink::WebString& label, const blink::WebString& language, bool enabled) override { return 0; } void removeAudioTrack(blink::WebMediaPlayer::TrackId) override {} blink::WebMediaPlayer::TrackId addVideoTrack( const blink::WebString& id, blink::WebMediaPlayerClient::VideoTrackKind, const blink::WebString& label, const blink::WebString& language, bool selected) override { return 0; } void removeVideoTrack(blink::WebMediaPlayer::TrackId) override {} void addTextTrack(blink::WebInbandTextTrack*) override {} void removeTextTrack(blink::WebInbandTextTrack*) override {} void mediaSourceOpened(blink::WebMediaSource*) override {} void requestSeek(double) override {} void remoteRouteAvailabilityChanged(bool) override {} void connectedToRemoteDevice() override {} void disconnectedFromRemoteDevice() override {} private: DISALLOW_COPY_AND_ASSIGN(DummyWebMediaPlayerClient); }; class WebMediaPlayerImplTest : public testing::Test { public: WebMediaPlayerImplTest() : media_thread_("MediaThreadForTest"), web_view_(blink::WebView::create(nullptr)), web_local_frame_( blink::WebLocalFrame::create(blink::WebTreeScopeType::Document, &web_frame_client_)), media_log_(new MediaLog()), audio_parameters_(TestAudioParameters::Normal()), audio_hardware_config_(audio_parameters_, audio_parameters_) { web_view_->setMainFrame(web_local_frame_); media_thread_.StartAndWaitForTesting(); wmpi_.reset(new WebMediaPlayerImpl( web_local_frame_, &client_, nullptr, base::WeakPtr(), make_scoped_ptr(new DefaultRendererFactory( media_log_, nullptr, DefaultRendererFactory::GetGpuFactoriesCB(), audio_hardware_config_)), url_index_, WebMediaPlayerParams( WebMediaPlayerParams::DeferLoadCB(), scoped_refptr(), media_log_, media_thread_.task_runner(), message_loop_.task_runner(), message_loop_.task_runner(), WebMediaPlayerParams::Context3DCB(), base::Bind(&OnAdjustAllocatedMemory), nullptr, nullptr, nullptr))); } ~WebMediaPlayerImplTest() override { // Destruct WebMediaPlayerImpl and pump the message loop to ensure that // objects passed to the message loop for destruction are released. // // NOTE: This should be done before any other member variables are // destructed since WMPI may reference them during destruction. wmpi_.reset(); message_loop_.RunUntilIdle(); web_view_->close(); web_local_frame_->close(); } protected: // "Renderer" thread. base::MessageLoop message_loop_; // "Media" thread. This is necessary because WMPI destruction waits on a // WaitableEvent. base::Thread media_thread_; // Blink state. DummyWebFrameClient web_frame_client_; blink::WebView* web_view_; blink::WebLocalFrame* web_local_frame_; scoped_refptr media_log_; linked_ptr url_index_; // Audio hardware configuration. AudioParameters audio_parameters_; AudioHardwareConfig audio_hardware_config_; // The client interface used by |wmpi_|. Just a dummy for now, but later we // may want a mock or intelligent fake. DummyWebMediaPlayerClient client_; // The WebMediaPlayerImpl instance under test. scoped_ptr wmpi_; private: DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImplTest); }; TEST_F(WebMediaPlayerImplTest, ConstructAndDestroy) {} } // namespace media