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.
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Show(content::WebContents* web_contents,
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                    gfx::NativeWindow context,
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    gfx::NativeWindow parent,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& app_name,
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    const base::string16& target_name,
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    scoped_ptr<DesktopMediaList> model,
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const DoneCallback& done_callback) OVERRIDE {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!expectation_->cancelled) {
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // Post a task to call the callback asynchronously.
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      base::ThreadTaskRunnerHandle::Get()->PostTask(
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          FROM_HERE,
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          base::Bind(&FakeDesktopMediaPicker::CallCallback,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     weak_factory_.GetWeakPtr(), done_callback));
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    } else {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // If we expect the dialog to be cancelled then store the callback to
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      // retain reference to the callback handler.
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      done_callback_ = done_callback;
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void CallCallback(DoneCallback done_callback) {
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    done_callback.Run(expectation_->selected_source);
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags* expectation_;
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DoneCallback done_callback_;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::WeakPtrFactory<FakeDesktopMediaPicker> weak_factory_;
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPicker);
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPickerFactory :
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    public DesktopCaptureChooseDesktopMediaFunction::PickerFactory {
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory() {}
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~FakeDesktopMediaPickerFactory() {}
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetTestFlags(TestFlags* test_flags, int tests_count) {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_flags_ = test_flags;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    tests_count_ = tests_count;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_test_ = 0;
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // DesktopCaptureChooseDesktopMediaFunction::PickerFactory interface.
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual scoped_ptr<DesktopMediaList> CreateModel(
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      bool show_screens,
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      bool show_windows) OVERRIDE {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_LE(current_test_, tests_count_);
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (current_test_ >= tests_count_)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return scoped_ptr<DesktopMediaList>();
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(test_flags_[current_test_].expect_screens, show_screens);
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(test_flags_[current_test_].expect_windows, show_windows);
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return scoped_ptr<DesktopMediaList>(new FakeDesktopMediaList());
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<DesktopMediaPicker> CreatePicker() OVERRIDE {
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_LE(current_test_, tests_count_);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (current_test_ >= tests_count_)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return scoped_ptr<DesktopMediaPicker>();
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ++current_test_;
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return scoped_ptr<DesktopMediaPicker>(
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        new FakeDesktopMediaPicker(test_flags_ + current_test_ - 1));
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private:
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags* test_flags_;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int tests_count_;
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int current_test_;
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPickerFactory);
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class DesktopCaptureApiTest : public ExtensionApiTest {
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DesktopCaptureApiTest() {
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DesktopCaptureChooseDesktopMediaFunction::
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        SetPickerFactoryForTests(&picker_factory_);
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual ~DesktopCaptureApiTest() {
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DesktopCaptureChooseDesktopMediaFunction::
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        SetPickerFactoryForTests(NULL);
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected:
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL GetURLForPath(const std::string& host, const std::string& path) {
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string port = base::IntToString(embedded_test_server()->port());
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    GURL::Replacements replacements;
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    replacements.SetHostStr(host);
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    replacements.SetPortStr(port);
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return embedded_test_server()->GetURL(path).ReplaceComponents(replacements);
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeDesktopMediaPickerFactory picker_factory_;
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Flaky on Windows: http://crbug.com/301887
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ChooseDesktopMedia DISABLED_ChooseDesktopMedia
1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_ChooseDesktopMedia ChooseDesktopMedia
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, MAYBE_ChooseDesktopMedia) {
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Each element in the following array corresponds to one test in
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // chrome/test/data/extensions/api_test/desktop_capture/test.js .
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags test_flags[] = {
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // pickerUiCanceled()
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMedia()
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // screensOnly()
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, false,
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // WindowsOnly()
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, true,
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID() },
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMediaAndGetStream()
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              webrtc::kFullDesktopScreenId) },
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // chooseMediaAndTryGetStreamWithInvalidId()
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN,
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              webrtc::kFullDesktopScreenId) },
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // cancelDialog()
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    { true, true,
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      content::DesktopMediaID(), true },
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  picker_factory_.SetTestFlags(test_flags, arraysize(test_flags));
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("desktop_capture")) << message_;
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test is flaky http://crbug.com/301887.
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, DISABLED_Delegation) {
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Initialize test server.
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath test_data;
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data));
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  embedded_test_server()->ServeFilesFromDirectory(test_data.AppendASCII(
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "extensions/api_test/desktop_capture_delegate"));
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  host_resolver()->AddRule("*", embedded_test_server()->base_url().host());
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Load extension.
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::FilePath extension_path =
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      test_data_dir_.AppendASCII("desktop_capture_delegate");
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const Extension* extension = LoadExtensionWithFlags(
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      extension_path, ExtensionBrowserTest::kFlagNone);
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(extension);
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ui_test_utils::NavigateToURL(
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      browser(), GetURLForPath("example.com", "/example.com.html"));
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestFlags test_flags[] = {
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, true,
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) },
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    { true, true,
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0), true },
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  picker_factory_.SetTestFlags(test_flags, arraysize(test_flags));
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool result;
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContents* web_contents =
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      web_contents, "getStream()", &result));
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(result);
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      web_contents, "getStreamWithInvalidId()", &result));
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(result);
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Verify that the picker is closed once the tab is closed.
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::WebContentsDestroyedWatcher destroyed_watcher(web_contents);
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      web_contents, "openPickerDialogAndReturn()", &result));
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(result);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(test_flags[2].picker_created);
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(test_flags[2].picker_deleted);
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_contents->Close();
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  destroyed_watcher.Wait();
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(test_flags[2].picker_deleted);
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
244