blob: f7a36a6d2922544e95a7403225428a29a2e5c7a8 [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/command_line.h"
#include "build/build_config.h"
#include "content/browser/webrtc/webrtc_content_browsertest_base.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/shell/common/shell_switches.h"
#include "media/base/media_switches.h"
#include "media/base/test_data_util.h"
#include "media/mojo/buildflags.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/system/sys_info.h"
#endif
#if BUILDFLAG(ENABLE_MOJO_RENDERER)
// Remote mojo renderer does not send audio/video frames back to the renderer
// process and hence does not support capture: https://crbug.com/641559.
#define MAYBE_CaptureFromMediaElement DISABLED_CaptureFromMediaElement
#else
#define MAYBE_CaptureFromMediaElement CaptureFromMediaElement
#endif
namespace {
static const char kCanvasCaptureTestHtmlFile[] = "/media/canvas_capture.html";
static const char kCanvasCaptureColorTestHtmlFile[] =
"/media/canvas_capture_color.html";
static const char kVideoAudioHtmlFile[] =
"/media/video_audio_element_capture_test.html";
static struct FileAndTypeParameters {
bool has_video;
bool has_audio;
bool use_audio_tag;
std::string filename;
} const kFileAndTypeParameters[] = {
{true, false, false, "bear-320x240-video-only.webm"},
{false, true, false, "bear-320x240-audio-only.webm"},
{true, true, false, "bear-320x240.webm"},
{false, true, true, "bear-320x240-audio-only.webm"},
};
} // namespace
namespace content {
// This class is the browser tests for Media Capture from DOM Elements API,
// which allows for creation of a MediaStream out of a <canvas>, <video> or
// <audio> element.
class WebRtcCaptureFromElementBrowserTest
: public WebRtcContentBrowserTestBase,
public testing::WithParamInterface<struct FileAndTypeParameters> {
public:
WebRtcCaptureFromElementBrowserTest() {}
WebRtcCaptureFromElementBrowserTest(
const WebRtcCaptureFromElementBrowserTest&) = delete;
WebRtcCaptureFromElementBrowserTest& operator=(
const WebRtcCaptureFromElementBrowserTest&) = delete;
~WebRtcCaptureFromElementBrowserTest() override {}
void SetUpCommandLine(base::CommandLine* command_line) override {
WebRtcContentBrowserTestBase::SetUpCommandLine(command_line);
// Allow <video>/<audio>.play() when not initiated by user gesture.
command_line->AppendSwitchASCII(
switches::kAutoplayPolicy,
switches::autoplay::kNoUserGestureRequiredPolicy);
// Allow experimental canvas features.
command_line->AppendSwitch(
switches::kEnableExperimentalWebPlatformFeatures);
// Allow window.internals for simulating context loss.
command_line->AppendSwitch(switches::kExposeInternalsForTesting);
}
};
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
VerifyCanvas2DCaptureColor) {
MakeTypicalCall("testCanvas2DCaptureColors(true);",
kCanvasCaptureColorTestHtmlFile);
}
#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
#define MAYBE_VerifyCanvasWebGLCaptureOpaqueColor \
DISABLED_VerifyCanvasWebGLCaptureOpaqueColor
#else
#define MAYBE_VerifyCanvasWebGLCaptureOpaqueColor \
VerifyCanvasWebGLCaptureOpaqueColor
#endif // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
MAYBE_VerifyCanvasWebGLCaptureOpaqueColor) {
MakeTypicalCall("testCanvasWebGLCaptureOpaqueColors(true);",
kCanvasCaptureColorTestHtmlFile);
}
#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
#define MAYBE_VerifyCanvasWebGLCaptureAlphaColor \
DISABLED_VerifyCanvasWebGLCaptureAlphaColor
#else
#define MAYBE_VerifyCanvasWebGLCaptureAlphaColor \
VerifyCanvasWebGLCaptureAlphaColor
#endif // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
MAYBE_VerifyCanvasWebGLCaptureAlphaColor) {
MakeTypicalCall("testCanvasWebGLCaptureAlphaColors(true);",
kCanvasCaptureColorTestHtmlFile);
}
// TODO(crbug.com/40856408): Flaky.
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID)
#define MAYBE_VerifyCanvasCapture2DFrames DISABLED_VerifyCanvasCapture2DFrames
#else
#define MAYBE_VerifyCanvasCapture2DFrames VerifyCanvasCapture2DFrames
#endif
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
MAYBE_VerifyCanvasCapture2DFrames) {
MakeTypicalCall("testCanvasCapture(draw2d);", kCanvasCaptureTestHtmlFile);
}
// TODO(crbug.com/40846825): Flaky on mac, windows, and linux.
// TODO(crbug.com/362833242): Flaky on Android.
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
DISABLED_VerifyCanvasCaptureWebGLFrames) {
MakeTypicalCall("testCanvasCapture(drawWebGL);", kCanvasCaptureTestHtmlFile);
}
// https://crbug.com/869723
// Flaky on Windows 10 with Viz (i.e. in viz_content_browsertests).
// https://crbug.com/989759
// Flaky on other platforms due to frame delivery for offscreen canvases.
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
DISABLED_VerifyCanvasCaptureOffscreenCanvasFrames) {
MakeTypicalCall("testCanvasCapture(drawOffscreenCanvas);",
kCanvasCaptureTestHtmlFile);
}
// TODO(crbug.com/40846743): Fix and re-enable.
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
DISABLED_VerifyCanvasCaptureBitmapRendererFrames) {
MakeTypicalCall("testCanvasCapture(drawBitmapRenderer);",
kCanvasCaptureTestHtmlFile);
}
IN_PROC_BROWSER_TEST_P(WebRtcCaptureFromElementBrowserTest,
MAYBE_CaptureFromMediaElement) {
MakeTypicalCall(JsReplace("testCaptureFromMediaElement($1, $2, $3, $4)",
GetParam().filename, GetParam().has_video,
GetParam().has_audio, GetParam().use_audio_tag),
kVideoAudioHtmlFile);
}
// https://crbug.com/986020.
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
DISABLED_CaptureFromCanvas2DHandlesContextLoss) {
MakeTypicalCall("testCanvas2DContextLoss(true);",
kCanvasCaptureColorTestHtmlFile);
}
// Not supported on android https://crbug.com/898286.
// Not supported on accelerated canvases https://crbug.com/954142.
IN_PROC_BROWSER_TEST_F(WebRtcCaptureFromElementBrowserTest,
DISABLED_CaptureFromOpaqueCanvas2DHandlesContextLoss) {
MakeTypicalCall("testCanvas2DContextLoss(false);",
kCanvasCaptureColorTestHtmlFile);
}
INSTANTIATE_TEST_SUITE_P(All,
WebRtcCaptureFromElementBrowserTest,
testing::ValuesIn(kFileAndTypeParameters));
} // namespace content