1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/media/webrtc/fake_desktop_media_picker_factory.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "base/memory/weak_ptr.h"
11 #include "base/threading/thread_task_runner_handle.h"
12 #include "chrome/browser/media/webrtc/fake_desktop_media_list.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
FakeDesktopMediaPicker(FakeDesktopMediaPickerFactory::TestFlags * expectation)15 FakeDesktopMediaPicker::FakeDesktopMediaPicker(
16     FakeDesktopMediaPickerFactory::TestFlags* expectation)
17     : expectation_(expectation) {
18   expectation_->picker_created = true;
19 }
~FakeDesktopMediaPicker()20 FakeDesktopMediaPicker::~FakeDesktopMediaPicker() {
21   expectation_->picker_deleted = true;
22 }
23 
24 // DesktopMediaPicker interface.
Show(const DesktopMediaPicker::Params & params,std::vector<std::unique_ptr<DesktopMediaList>> source_lists,DoneCallback done_callback)25 void FakeDesktopMediaPicker::Show(
26     const DesktopMediaPicker::Params& params,
27     std::vector<std::unique_ptr<DesktopMediaList>> source_lists,
28     DoneCallback done_callback) {
29   bool show_screens = false;
30   bool show_windows = false;
31   bool show_tabs = false;
32   picker_params_ = params;
33 
34   for (auto& source_list : source_lists) {
35     switch (source_list->GetMediaListType()) {
36       case content::DesktopMediaID::TYPE_NONE:
37         break;
38       case content::DesktopMediaID::TYPE_SCREEN:
39         show_screens = true;
40         break;
41       case content::DesktopMediaID::TYPE_WINDOW:
42         show_windows = true;
43         break;
44       case content::DesktopMediaID::TYPE_WEB_CONTENTS:
45         show_tabs = true;
46         break;
47     }
48   }
49   EXPECT_EQ(expectation_->expect_screens, show_screens);
50   EXPECT_EQ(expectation_->expect_windows, show_windows);
51   EXPECT_EQ(expectation_->expect_tabs, show_tabs);
52   EXPECT_EQ(expectation_->expect_audio, params.request_audio);
53   EXPECT_EQ(params.modality, ui::ModalType::MODAL_TYPE_CHILD);
54 
55   if (!expectation_->cancelled) {
56     // Post a task to call the callback asynchronously.
57     base::ThreadTaskRunnerHandle::Get()->PostTask(
58         FROM_HERE,
59         base::BindOnce(&FakeDesktopMediaPicker::CallCallback,
60                        weak_factory_.GetWeakPtr(), std::move(done_callback)));
61   } else {
62     // If we expect the dialog to be cancelled then store the callback to
63     // retain reference to the callback handler.
64     done_callback_ = std::move(done_callback);
65   }
66 }
67 
GetParams()68 DesktopMediaPicker::Params FakeDesktopMediaPicker::GetParams() {
69   return picker_params_;
70 }
71 
CallCallback(DoneCallback done_callback)72 void FakeDesktopMediaPicker::CallCallback(DoneCallback done_callback) {
73   std::move(done_callback).Run(expectation_->selected_source);
74 }
75 
76 FakeDesktopMediaPickerFactory::FakeDesktopMediaPickerFactory() = default;
77 
78 FakeDesktopMediaPickerFactory::~FakeDesktopMediaPickerFactory() = default;
79 
SetTestFlags(TestFlags * test_flags,int tests_count)80 void FakeDesktopMediaPickerFactory::SetTestFlags(TestFlags* test_flags,
81                                                  int tests_count) {
82   test_flags_ = test_flags;
83   tests_count_ = tests_count;
84   current_test_ = 0;
85 }
86 
87 std::unique_ptr<DesktopMediaPicker>
CreatePicker()88 FakeDesktopMediaPickerFactory::CreatePicker() {
89   EXPECT_LE(current_test_, tests_count_);
90   if (current_test_ >= tests_count_)
91     return std::unique_ptr<DesktopMediaPicker>();
92   ++current_test_;
93   picker_ = new FakeDesktopMediaPicker(test_flags_ + current_test_ - 1);
94   return std::unique_ptr<DesktopMediaPicker>(picker_);
95 }
96 
97 std::vector<std::unique_ptr<DesktopMediaList>>
CreateMediaList(const std::vector<content::DesktopMediaID::Type> & types)98 FakeDesktopMediaPickerFactory::CreateMediaList(
99     const std::vector<content::DesktopMediaID::Type>& types) {
100   EXPECT_LE(current_test_, tests_count_);
101   std::vector<std::unique_ptr<DesktopMediaList>> media_lists;
102   for (auto source_type : types)
103     media_lists.emplace_back(new FakeDesktopMediaList(source_type));
104   return media_lists;
105 }
106