diff options
Diffstat (limited to 'content/shell/renderer/layout_test')
6 files changed, 257 insertions, 0 deletions
diff --git a/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc b/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc index c4fbdf7..ff01415 100644 --- a/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc +++ b/content/shell/renderer/layout_test/layout_test_content_renderer_client.cc @@ -17,6 +17,7 @@ #include "content/shell/renderer/layout_test/blink_test_runner.h" #include "content/shell/renderer/layout_test/layout_test_render_frame_observer.h" #include "content/shell/renderer/layout_test/layout_test_render_process_observer.h" +#include "content/shell/renderer/layout_test/test_media_stream_renderer_factory.h" #include "content/shell/renderer/shell_render_view_observer.h" #include "content/shell/renderer/test_runner/app_banner_client.h" #include "content/shell/renderer/test_runner/mock_credential_manager_client.h" @@ -171,6 +172,16 @@ LayoutTestContentRendererClient::CreateAppBannerClient( return interfaces->CreateAppBannerClient(); } +scoped_ptr<MediaStreamRendererFactory> +LayoutTestContentRendererClient::CreateMediaStreamRendererFactory() { +#if defined(ENABLE_WEBRTC) + return scoped_ptr<MediaStreamRendererFactory>( + new TestMediaStreamRendererFactory()); +#else + return nullptr; +#endif +} + void LayoutTestContentRendererClient::WebTestProxyCreated( RenderView* render_view, WebTestProxyBase* proxy) { diff --git a/content/shell/renderer/layout_test/layout_test_content_renderer_client.h b/content/shell/renderer/layout_test/layout_test_content_renderer_client.h index a20db61..a1ae6a9 100644 --- a/content/shell/renderer/layout_test/layout_test_content_renderer_client.h +++ b/content/shell/renderer/layout_test/layout_test_content_renderer_client.h @@ -45,6 +45,8 @@ class LayoutTestContentRendererClient : public ShellContentRendererClient { blink::WebThemeEngine* OverrideThemeEngine() override; scoped_ptr<blink::WebAppBannerClient> CreateAppBannerClient( RenderFrame* render_frame) override; + scoped_ptr<MediaStreamRendererFactory> CreateMediaStreamRendererFactory() + override; private: void WebTestProxyCreated(RenderView* render_view, WebTestProxyBase* proxy); diff --git a/content/shell/renderer/layout_test/test_media_stream_renderer_factory.cc b/content/shell/renderer/layout_test/test_media_stream_renderer_factory.cc new file mode 100644 index 0000000..0c07c5a --- /dev/null +++ b/content/shell/renderer/layout_test/test_media_stream_renderer_factory.cc @@ -0,0 +1,64 @@ +// Copyright 2014 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 "content/shell/renderer/layout_test/test_media_stream_renderer_factory.h" + +#include "content/shell/renderer/layout_test/test_video_frame_provider.h" +#include "third_party/WebKit/public/platform/WebMediaStream.h" +#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" +#include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" +#include "url/gurl.h" + +using namespace blink; + +namespace { + +static const int kVideoCaptureWidth = 352; +static const int kVideoCaptureHeight = 288; +static const int kVideoCaptureFrameDurationMs = 33; + +bool IsMockMediaStreamWithVideo(const WebURL& url) { +#if ENABLE_WEBRTC + WebMediaStream descriptor( + WebMediaStreamRegistry::lookupMediaStreamDescriptor(url)); + if (descriptor.isNull()) + return false; + WebVector<WebMediaStreamTrack> video_tracks; + descriptor.videoTracks(video_tracks); + return video_tracks.size() > 0; +#else + return false; +#endif +} + +} // namespace + +namespace content { + +TestMediaStreamRendererFactory::TestMediaStreamRendererFactory() {} + +TestMediaStreamRendererFactory::~TestMediaStreamRendererFactory() {} + +scoped_refptr<VideoFrameProvider> +TestMediaStreamRendererFactory::GetVideoFrameProvider( + const GURL& url, + const base::Closure& error_cb, + const VideoFrameProvider::RepaintCB& repaint_cb) { + if (!IsMockMediaStreamWithVideo(url)) + return NULL; + + return new TestVideoFrameProvider( + gfx::Size(kVideoCaptureWidth, kVideoCaptureHeight), + base::TimeDelta::FromMilliseconds(kVideoCaptureFrameDurationMs), + error_cb, + repaint_cb); +} + +scoped_refptr<MediaStreamAudioRenderer> +TestMediaStreamRendererFactory::GetAudioRenderer(const GURL& url, + int render_frame_id) { + return NULL; +} + +} // namespace content diff --git a/content/shell/renderer/layout_test/test_media_stream_renderer_factory.h b/content/shell/renderer/layout_test/test_media_stream_renderer_factory.h new file mode 100644 index 0000000..2b9a294 --- /dev/null +++ b/content/shell/renderer/layout_test/test_media_stream_renderer_factory.h @@ -0,0 +1,34 @@ +// Copyright 2014 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. + +#ifndef CONTENT_SHELL_RENDERER_LAYOUT_TEST_TEST_MEDIA_STREAM_RENDERER_FACTORY_H_ +#define CONTENT_SHELL_RENDERER_LAYOUT_TEST_TEST_MEDIA_STREAM_RENDERER_FACTORY_H_ + +#include "base/callback_forward.h" +#include "content/public/renderer/media_stream_renderer_factory.h" +#include "third_party/WebKit/public/platform/WebURL.h" + +namespace content { + +// TestMediaStreamClient is a mock implementation of MediaStreamClient used when +// running layout tests. +class TestMediaStreamRendererFactory : public MediaStreamRendererFactory { + public: + TestMediaStreamRendererFactory(); + ~TestMediaStreamRendererFactory() override; + + // MediaStreamRendererFactory implementation. + scoped_refptr<VideoFrameProvider> GetVideoFrameProvider( + const GURL& url, + const base::Closure& error_cb, + const VideoFrameProvider::RepaintCB& repaint_cb) override; + + scoped_refptr<MediaStreamAudioRenderer> GetAudioRenderer( + const GURL& url, + int render_frame_id) override; +}; + +} // namespace content + +#endif // CONTENT_SHELL_RENDERER_LAYOUT_TEST_TEST_MEDIA_STREAM_RENDERER_FACTORY_H_ diff --git a/content/shell/renderer/layout_test/test_video_frame_provider.cc b/content/shell/renderer/layout_test/test_video_frame_provider.cc new file mode 100644 index 0000000..0989572 --- /dev/null +++ b/content/shell/renderer/layout_test/test_video_frame_provider.cc @@ -0,0 +1,83 @@ +// Copyright 2013 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 "content/shell/renderer/layout_test/test_video_frame_provider.h" + +#include "base/bind.h" +#include "base/location.h" +#include "base/message_loop/message_loop_proxy.h" +#include "media/base/video_frame.h" + +namespace content { + +TestVideoFrameProvider::TestVideoFrameProvider( + const gfx::Size& size, + const base::TimeDelta& frame_duration, + const base::Closure& error_cb, + const VideoFrameProvider::RepaintCB& repaint_cb) + : message_loop_proxy_(base::MessageLoopProxy::current()), + size_(size), + state_(kStopped), + frame_duration_(frame_duration), + error_cb_(error_cb), + repaint_cb_(repaint_cb) { +} + +TestVideoFrameProvider::~TestVideoFrameProvider() {} + +void TestVideoFrameProvider::Start() { + DVLOG(1) << "TestVideoFrameProvider::Start"; + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); + state_ = kStarted; + message_loop_proxy_->PostTask( + FROM_HERE, + base::Bind(&TestVideoFrameProvider::GenerateFrame, this)); +} + +void TestVideoFrameProvider::Stop() { + DVLOG(1) << "TestVideoFrameProvider::Stop"; + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); + state_ = kStopped; +} + +void TestVideoFrameProvider::Play() { + DVLOG(1) << "TestVideoFrameProvider::Play"; + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); + if (state_ == kPaused) + state_ = kStarted; +} + +void TestVideoFrameProvider::Pause() { + DVLOG(1) << "TestVideoFrameProvider::Pause"; + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); + if (state_ == kStarted) + state_ = kPaused; +} + +void TestVideoFrameProvider::GenerateFrame() { + DVLOG(1) << "TestVideoFrameProvider::GenerateFrame"; + DCHECK(message_loop_proxy_->BelongsToCurrentThread()); + if (state_ == kStopped) + return; + + if (state_ == kStarted) { + // Always allocate a new frame filled with white color. + scoped_refptr<media::VideoFrame> video_frame = + media::VideoFrame::CreateColorFrame( + size_, 255, 128, 128, current_time_); + + // TODO(wjia): set pixel data to pre-defined patterns if it's desired to + // verify frame content. + + repaint_cb_.Run(video_frame); + } + + current_time_ += frame_duration_; + message_loop_proxy_->PostDelayedTask( + FROM_HERE, + base::Bind(&TestVideoFrameProvider::GenerateFrame, this), + frame_duration_); +} + +} // namespace content diff --git a/content/shell/renderer/layout_test/test_video_frame_provider.h b/content/shell/renderer/layout_test/test_video_frame_provider.h new file mode 100644 index 0000000..00ee3c8 --- /dev/null +++ b/content/shell/renderer/layout_test/test_video_frame_provider.h @@ -0,0 +1,63 @@ +// Copyright 2013 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. + +#ifndef CONTENT_SHELL_RENDERER_LAYOUT_TEST_TEST_VIDEO_FRAME_PROVIDER_H_ +#define CONTENT_SHELL_RENDERER_LAYOUT_TEST_TEST_VIDEO_FRAME_PROVIDER_H_ + +#include "base/time/time.h" +#include "content/public/renderer/video_frame_provider.h" +#include "ui/gfx/geometry/size.h" + +namespace base { +class MessageLoopProxy; +} + +namespace content { + +// A simple implementation of VideoFrameProvider generates raw frames and +// passes them to webmediaplayer. +// Since non-black pixel values are required in the layout test, e.g., +// media/video-capture-canvas.html, this class should generate frame with +// only non-black pixels. +class TestVideoFrameProvider : public VideoFrameProvider { + public: + TestVideoFrameProvider( + const gfx::Size& size, + const base::TimeDelta& frame_duration, + const base::Closure& error_cb, + const RepaintCB& repaint_cb); + + // VideoFrameProvider implementation. + void Start() override; + void Stop() override; + void Play() override; + void Pause() override; + + protected: + ~TestVideoFrameProvider() override; + + private: + enum State { + kStarted, + kPaused, + kStopped, + }; + + void GenerateFrame(); + + scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; + gfx::Size size_; + State state_; + + base::TimeDelta current_time_; + base::TimeDelta frame_duration_; + base::Closure error_cb_; + RepaintCB repaint_cb_; + + DISALLOW_COPY_AND_ASSIGN(TestVideoFrameProvider); +}; + +} // namespace content + +#endif // CONTENT_SHELL_RENDERER_LAYOUT_TEST_TEST_VIDEO_FRAME_PROVIDER_H_ |