summaryrefslogtreecommitdiffstats
path: root/content/shell/renderer/layout_test
diff options
context:
space:
mode:
Diffstat (limited to 'content/shell/renderer/layout_test')
-rw-r--r--content/shell/renderer/layout_test/layout_test_content_renderer_client.cc11
-rw-r--r--content/shell/renderer/layout_test/layout_test_content_renderer_client.h2
-rw-r--r--content/shell/renderer/layout_test/test_media_stream_renderer_factory.cc64
-rw-r--r--content/shell/renderer/layout_test/test_media_stream_renderer_factory.h34
-rw-r--r--content/shell/renderer/layout_test/test_video_frame_provider.cc83
-rw-r--r--content/shell/renderer/layout_test/test_video_frame_provider.h63
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_