desktop_capture_apitest.cc revision 3551c9c881056c480085172ff9840cab31610854
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <queue>
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/path_service.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/thread_task_runner_handle.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/media/desktop_media_picker.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/dns/mock_host_resolver.h"
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/screen_capturer.h"
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/window_capturer.h"
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions {
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPicker : public DesktopMediaPicker {
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit FakeDesktopMediaPicker(const content::DesktopMediaID& source)
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : source_(source),
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        weak_factory_(this) {
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakeDesktopMediaPicker() {}
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DesktopMediaPicker interface.
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Show(gfx::NativeWindow context,
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    gfx::NativeWindow parent,
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const string16& app_name,
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    scoped_ptr<DesktopMediaPickerModel> model,
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const DoneCallback& done_callback) OVERRIDE {
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Post a task to call the callback asynchronously.
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    base::ThreadTaskRunnerHandle::Get()->PostTask(
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      FROM_HERE, base::Bind(&FakeDesktopMediaPicker::CallCallback,
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            weak_factory_.GetWeakPtr(), done_callback));
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CallCallback(DoneCallback done_callback) {
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    done_callback.Run(source_);
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content::DesktopMediaID source_;
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::WeakPtrFactory<FakeDesktopMediaPicker> weak_factory_;
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPicker);
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPickerFactory :
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public DesktopCaptureChooseDesktopMediaFunction::PickerFactory {
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  struct Expectation {
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool screens;
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool windows;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    content::DesktopMediaID selected_source;
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory() {}
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakeDesktopMediaPickerFactory() {}
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void SetExpectations(const Expectation* expectation_array, int size) {
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    for (int i = 0; i < size; ++i) {
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      expectations_.push(expectation_array[i]);
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DesktopCaptureChooseDesktopMediaFunction::PickerFactory interface.
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<DesktopMediaPickerModel> CreateModel(
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<webrtc::ScreenCapturer> screen_capturer,
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<webrtc::WindowCapturer> window_capturer) OVERRIDE {
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(!expectations_.empty());
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!expectations_.empty()) {
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      EXPECT_EQ(expectations_.front().screens, !!screen_capturer.get());
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      EXPECT_EQ(expectations_.front().windows, !!window_capturer.get());
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return scoped_ptr<DesktopMediaPickerModel>(
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new DesktopMediaPickerModel(screen_capturer.Pass(),
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    window_capturer.Pass()));
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<DesktopMediaPicker> CreatePicker() OVERRIDE {
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    content::DesktopMediaID next_source;
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!expectations_.empty()) {
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      next_source = expectations_.front().selected_source;
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      expectations_.pop();
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return scoped_ptr<DesktopMediaPicker>(
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        new FakeDesktopMediaPicker(next_source));
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::queue<Expectation> expectations_;
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPickerFactory);
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class DesktopCaptureApiTest : public ExtensionApiTest {
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DesktopCaptureApiTest() {
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DesktopCaptureChooseDesktopMediaFunction::
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        SetPickerFactoryForTests(&picker_factory_);
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~DesktopCaptureApiTest() {
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DesktopCaptureChooseDesktopMediaFunction::
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        SetPickerFactoryForTests(NULL);
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL GetURLForPath(const std::string& host, const std::string& path) {
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string port = base::IntToString(embedded_test_server()->port());
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GURL::Replacements replacements;
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    replacements.SetHostStr(host);
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    replacements.SetPortStr(port);
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return embedded_test_server()->GetURL(path).ReplaceComponents(replacements);
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory picker_factory_;
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, ChooseDesktopMedia) {
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Each of the following expectations corresponds to one test in
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // chrome/test/data/extensions/api_test/desktop_capture/test.js .
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory::Expectation picker_expectations[] = {
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // pickerUiCanceled()
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMedia()
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // screensOnly()
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, false,
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // WindowsOnly()
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, true,
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMediaAndGetStream()
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMediaAndTryGetStreamWithInvalidId()
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  picker_factory_.SetExpectations(picker_expectations,
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  arraysize(picker_expectations));
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("desktop_capture")) << message_;
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, Delegation) {
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Initialize test server.
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath test_data;
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data));
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  embedded_test_server()->ServeFilesFromDirectory(test_data.AppendASCII(
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "extensions/api_test/desktop_capture_delegate"));
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  host_resolver()->AddRule("*", embedded_test_server()->base_url().host());
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Load extension.
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath extension_path =
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      test_data_dir_.AppendASCII("desktop_capture_delegate");
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const Extension* extension = LoadExtensionWithFlags(
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      extension_path, ExtensionBrowserTest::kFlagNone);
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(extension);
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui_test_utils::NavigateToURL(
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser(), GetURLForPath("example.com", "/example.com.html"));
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory::Expectation picker_expectations[] = {
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  picker_factory_.SetExpectations(picker_expectations,
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  arraysize(picker_expectations));
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool result;
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "getStream()", &result));
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(result);
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "getStreamWithInvalidId()", &result));
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(result);
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
201