desktop_capture_apitest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/media/fake_desktop_media_list.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"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions {
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct TestFlags {
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool expect_screens;
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool expect_windows;
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::DesktopMediaID selected_source;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool cancelled;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Following flags are set by FakeDesktopMediaPicker when it's created and
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // deleted.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool picker_created;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool picker_deleted;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPicker : public DesktopMediaPicker {
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit FakeDesktopMediaPicker(TestFlags* expectation)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : expectation_(expectation),
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        weak_factory_(this) {
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expectation_->picker_created = true;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~FakeDesktopMediaPicker() {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    expectation_->picker_deleted = true;
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DesktopMediaPicker interface.
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void Show(gfx::NativeWindow context,
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    gfx::NativeWindow parent,
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& app_name,
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    const base::string16& target_name,
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    scoped_ptr<DesktopMediaList> model,
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const DoneCallback& done_callback) OVERRIDE {
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!expectation_->cancelled) {
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // Post a task to call the callback asynchronously.
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::ThreadTaskRunnerHandle::Get()->PostTask(
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          FROM_HERE,
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          base::Bind(&FakeDesktopMediaPicker::CallCallback,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     weak_factory_.GetWeakPtr(), done_callback));
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // If we expect the dialog to be cancelled then store the callback to
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // retain reference to the callback handler.
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      done_callback_ = done_callback;
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CallCallback(DoneCallback done_callback) {
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    done_callback.Run(expectation_->selected_source);
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags* expectation_;
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DoneCallback done_callback_;
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::WeakPtrFactory<FakeDesktopMediaPicker> weak_factory_;
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPicker);
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPickerFactory :
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public DesktopCaptureChooseDesktopMediaFunction::PickerFactory {
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory() {}
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakeDesktopMediaPickerFactory() {}
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetTestFlags(TestFlags* test_flags, int tests_count) {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_flags_ = test_flags;
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tests_count_ = tests_count;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_test_ = 0;
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DesktopCaptureChooseDesktopMediaFunction::PickerFactory interface.
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual scoped_ptr<DesktopMediaList> CreateModel(
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      bool show_screens,
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      bool show_windows) OVERRIDE {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_LE(current_test_, tests_count_);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (current_test_ >= tests_count_)
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return scoped_ptr<DesktopMediaList>();
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(test_flags_[current_test_].expect_screens, show_screens);
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(test_flags_[current_test_].expect_windows, show_windows);
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return scoped_ptr<DesktopMediaList>(new FakeDesktopMediaList());
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<DesktopMediaPicker> CreatePicker() OVERRIDE {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_LE(current_test_, tests_count_);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (current_test_ >= tests_count_)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return scoped_ptr<DesktopMediaPicker>();
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ++current_test_;
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return scoped_ptr<DesktopMediaPicker>(
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new FakeDesktopMediaPicker(test_flags_ + current_test_ - 1));
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags* test_flags_;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int tests_count_;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int current_test_;
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPickerFactory);
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class DesktopCaptureApiTest : public ExtensionApiTest {
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DesktopCaptureApiTest() {
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DesktopCaptureChooseDesktopMediaFunction::
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        SetPickerFactoryForTests(&picker_factory_);
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~DesktopCaptureApiTest() {
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DesktopCaptureChooseDesktopMediaFunction::
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        SetPickerFactoryForTests(NULL);
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL GetURLForPath(const std::string& host, const std::string& path) {
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string port = base::IntToString(embedded_test_server()->port());
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GURL::Replacements replacements;
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    replacements.SetHostStr(host);
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    replacements.SetPortStr(port);
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return embedded_test_server()->GetURL(path).ReplaceComponents(replacements);
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory picker_factory_;
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on Windows: http://crbug.com/301887
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ChooseDesktopMedia DISABLED_ChooseDesktopMedia
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ChooseDesktopMedia ChooseDesktopMedia
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, MAYBE_ChooseDesktopMedia) {
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Each element in the following array corresponds to one test in
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // chrome/test/data/extensions/api_test/desktop_capture/test.js .
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags test_flags[] = {
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // pickerUiCanceled()
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMedia()
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // screensOnly()
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, false,
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // WindowsOnly()
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, true,
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMediaAndGetStream()
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              webrtc::kFullDesktopScreenId) },
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMediaAndTryGetStreamWithInvalidId()
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              webrtc::kFullDesktopScreenId) },
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // cancelDialog()
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    { true, true,
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      content::DesktopMediaID(), true },
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  picker_factory_.SetTestFlags(test_flags, arraysize(test_flags));
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("desktop_capture")) << message_;
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test is flaky http://crbug.com/301887.
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, DISABLED_Delegation) {
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Initialize test server.
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath test_data;
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data));
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  embedded_test_server()->ServeFilesFromDirectory(test_data.AppendASCII(
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "extensions/api_test/desktop_capture_delegate"));
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  host_resolver()->AddRule("*", embedded_test_server()->base_url().host());
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Load extension.
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath extension_path =
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      test_data_dir_.AppendASCII("desktop_capture_delegate");
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const Extension* extension = LoadExtensionWithFlags(
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      extension_path, ExtensionBrowserTest::kFlagNone);
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(extension);
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui_test_utils::NavigateToURL(
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser(), GetURLForPath("example.com", "/example.com.html"));
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags test_flags[] = {
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { true, true,
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0), true },
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  picker_factory_.SetTestFlags(test_flags, arraysize(test_flags));
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool result;
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* web_contents =
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      web_contents, "getStream()", &result));
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(result);
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      web_contents, "getStreamWithInvalidId()", &result));
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(result);
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Verify that the picker is closed once the tab is closed.
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContentsDestroyedWatcher destroyed_watcher(web_contents);
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      web_contents, "openPickerDialogAndReturn()", &result));
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(result);
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(test_flags[2].picker_created);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(test_flags[2].picker_deleted);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_contents->Close();
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  destroyed_watcher.Wait();
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(test_flags[2].picker_deleted);
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
243