blob: baf08f625d3b99d41d019edf9bf7cd422dd91ee1 [file] [log] [blame]
// 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 <stdint.h>
#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<WebMediaPlayerDelegate>(),
make_scoped_ptr(new DefaultRendererFactory(
media_log_, nullptr, DefaultRendererFactory::GetGpuFactoriesCB(),
audio_hardware_config_)),
url_index_,
WebMediaPlayerParams(
WebMediaPlayerParams::DeferLoadCB(),
scoped_refptr<RestartableAudioRendererSink>(), 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<MediaLog> media_log_;
linked_ptr<media::UrlIndex> 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<WebMediaPlayerImpl> wmpi_;
private:
DISALLOW_COPY_AND_ASSIGN(WebMediaPlayerImplTest);
};
TEST_F(WebMediaPlayerImplTest, ConstructAndDestroy) {}
} // namespace media