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>
+