Add browsertest covering getDisplayMedia() cases
Bug: 326740
Change-Id: I9c75b405e4b5a8a216901df48b5cc41d39ba34fb
Reviewed-on: https://chromium-review.googlesource.com/1187650
Commit-Queue: Emircan Uysaler <emircan@chromium.org>
Reviewed-by: Sergey Ulanov <sergeyu@chromium.org>
Reviewed-by: Christian Fremerey <chfremer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#588730}
diff --git a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
new file mode 100644
index 0000000..1a6068f
--- /dev/null
+++ b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -0,0 +1,123 @@
+// Copyright 2018 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 <string>
+
+#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h"
+#include "chrome/common/chrome_switches.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_switches.h"
+#include "content/public/test/browser_test_utils.h"
+#include "media/base/media_switches.h"
+
+namespace {
+
+static const char kMainHtmlPage[] = "/webrtc/webrtc_getdisplaymedia_test.html";
+
+struct TestConfig {
+ const char* display_surface;
+ const char* logical_surface;
+ const char* cursor;
+};
+
+} // namespace
+
+// Base class for top level tests for getDisplayMedia().
+class WebRtcGetDisplayMediaBrowserTest : public WebRtcTestBase {
+ public:
+ void SetUpInProcessBrowserTestFixture() override {
+ DetectErrorsInJavaScript();
+ }
+
+ void RunGetDisplayMedia(content::WebContents* tab,
+ const std::string& constraints) {
+ std::string result;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(),
+ base::StringPrintf("runGetDisplayMedia(%s);", constraints.c_str()),
+ &result));
+ EXPECT_EQ(result, "getdisplaymedia-success");
+ }
+};
+
+// Top level test for getDisplayMedia(). Pops picker Ui and selects desktop
+// capture by default.
+class WebRtcGetDisplayMediaBrowserTestWithPicker
+ : public WebRtcGetDisplayMediaBrowserTest {
+ public:
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ command_line->AppendSwitch(
+ switches::kEnableExperimentalWebPlatformFeatures);
+ command_line->AppendSwitchASCII(switches::kAutoSelectDesktopCaptureSource,
+ "Entire screen");
+ }
+};
+
+// Real desktop capture is flaky on below platforms.
+#if defined(OS_CHROMEOS) || defined(OS_WIN)
+#define MAYBE_MANUAL_GetDisplayMediaVideo DISABLED_MANUAL_GetDisplayMediaVideo
+#else
+#define MAYBE_MANUAL_GetDisplayMediaVideo MANUAL_GetDisplayMediaVideo
+#endif
+IN_PROC_BROWSER_TEST_F(WebRtcGetDisplayMediaBrowserTestWithPicker,
+ MAYBE_MANUAL_GetDisplayMediaVideo) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ content::WebContents* tab = OpenTestPageInNewTab(kMainHtmlPage);
+ std::string constraints("{video:true}");
+ RunGetDisplayMedia(tab, constraints);
+}
+
+// Top level test for getDisplayMedia(). Skips picker UI and uses fake device
+// with specified type.
+class WebRtcGetDisplayMediaBrowserTestWithFakeUI
+ : public WebRtcGetDisplayMediaBrowserTest,
+ public testing::WithParamInterface<TestConfig> {
+ public:
+ WebRtcGetDisplayMediaBrowserTestWithFakeUI() {
+ test_config_ = GetParam();
+ }
+
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ command_line->AppendSwitch(
+ switches::kEnableExperimentalWebPlatformFeatures);
+ command_line->AppendSwitch(switches::kUseFakeUIForMediaStream);
+ command_line->AppendSwitchASCII(
+ switches::kUseFakeDeviceForMediaStream,
+ base::StringPrintf("display-media-type=%s",
+ test_config_.display_surface));
+ }
+
+ protected:
+ TestConfig test_config_;
+};
+
+IN_PROC_BROWSER_TEST_P(WebRtcGetDisplayMediaBrowserTestWithFakeUI,
+ MANUAL_GetDisplayMedia) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ content::WebContents* tab = OpenTestPageInNewTab(kMainHtmlPage);
+ std::string constraints("{video:true}");
+ RunGetDisplayMedia(tab, constraints);
+
+ std::string result;
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(), "getDisplaySurfaceSetting();", &result));
+ EXPECT_EQ(result, test_config_.display_surface);
+
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(), "getLogicalSurfaceSetting();", &result));
+ EXPECT_EQ(result, test_config_.logical_surface);
+
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+ tab->GetMainFrame(), "getCursorSetting();", &result));
+ EXPECT_EQ(result, test_config_.cursor);
+}
+
+INSTANTIATE_TEST_CASE_P(,
+ WebRtcGetDisplayMediaBrowserTestWithFakeUI,
+ testing::Values(TestConfig{"monitor", "true", "never"},
+ TestConfig{"window", "true", "never"},
+ TestConfig{"browser", "true",
+ "never"}));
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index c770896..66ca1051 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -628,6 +628,7 @@
"../browser/media/webrtc/webrtc_browsertest_perf.h",
"../browser/media/webrtc/webrtc_desktop_capture_browsertest.cc",
"../browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc",
+ "../browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc",
"../browser/media/webrtc/webrtc_getmediadevices_browsertest.cc",
"../browser/media/webrtc/webrtc_internals_integration_browsertest.cc",
"../browser/media/webrtc/webrtc_internals_perf_browsertest.cc",
diff --git a/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html b/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html
new file mode 100644
index 0000000..c124a82
--- /dev/null
+++ b/chrome/test/data/webrtc/webrtc_getdisplaymedia_test.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+ <title>WebRTC Automated Test</title>
+ <script type="text/javascript" src="test_functions.js"></script>
+ <script type="text/javascript" src="video_detector.js"></script>
+ <script type="text/javascript" src="indexeddb.js"></script>
+ <script>
+ 'use strict';
+ var settings;
+
+ function handleSuccess(stream) {
+ var video = document.querySelector('video');
+ settings = stream.getVideoTracks()[0].getSettings();
+ video.srcObject = stream;
+ video.play();
+ returnToTest("getdisplaymedia-success");
+ }
+
+ function handleError(error) {
+ console.log('getUserMedia error: ' + error.name, error);
+ returnToTest("getdisplaymedia-failure");
+ }
+
+ function runGetDisplayMedia(constraints) {
+ navigator.getDisplayMedia(constraints).
+ then(handleSuccess).catch(handleError);
+ }
+
+ function getDisplaySurfaceSetting() {
+ returnToTest(settings.displaySurface);
+ }
+
+ function getLogicalSurfaceSetting() {
+ returnToTest(settings.logicalSurface ? "true" : "false");
+ }
+
+ function getCursorSetting() {
+ returnToTest(settings.cursor);
+ }
+ </script>
+</head>
+<body>
+ <table border="0">
+ <tr>
+ <td>getdisplayMedia() output</td>
+ </tr>
+ <tr>
+ <td>
+ <video id="local-view" autoplay="autoplay"></video>
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
+