blob: fa7d872810a6907e9a4154cbc7872c8698e45080 [file] [log] [blame]
// 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 "chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h"
#include "base/no_destructor.h"
#include "build/build_config.h"
#include "chrome/browser/media/webrtc/desktop_media_list_ash.h"
#include "chrome/browser/media/webrtc/native_desktop_media_list.h"
#include "chrome/browser/media/webrtc/tab_desktop_media_list.h"
#include "content/public/browser/desktop_capture.h"
DesktopMediaPickerFactoryImpl::DesktopMediaPickerFactoryImpl() = default;
DesktopMediaPickerFactoryImpl::~DesktopMediaPickerFactoryImpl() = default;
// static
DesktopMediaPickerFactoryImpl* DesktopMediaPickerFactoryImpl::GetInstance() {
static base::NoDestructor<DesktopMediaPickerFactoryImpl> impl;
return impl.get();
}
std::unique_ptr<DesktopMediaPicker>
DesktopMediaPickerFactoryImpl::CreatePicker() {
// DesktopMediaPicker is implemented only for Windows, OSX and Aura Linux
// builds.
#if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX)
return DesktopMediaPicker::Create();
#else
return nullptr;
#endif
}
std::vector<std::unique_ptr<DesktopMediaList>>
DesktopMediaPickerFactoryImpl::CreateMediaList(
const std::vector<content::DesktopMediaID::Type>& types) {
// Keep same order as the input |sources| and avoid duplicates.
std::vector<std::unique_ptr<DesktopMediaList>> source_lists;
bool have_screen_list = false;
bool have_window_list = false;
bool have_tab_list = false;
for (auto source_type : types) {
switch (source_type) {
case content::DesktopMediaID::TYPE_NONE:
break;
case content::DesktopMediaID::TYPE_SCREEN: {
if (have_screen_list)
continue;
std::unique_ptr<DesktopMediaList> screen_list;
#if defined(OS_CHROMEOS)
screen_list = std::make_unique<DesktopMediaListAsh>(
content::DesktopMediaID::TYPE_SCREEN);
#else // !defined(OS_CHROMEOS)
screen_list = std::make_unique<NativeDesktopMediaList>(
content::DesktopMediaID::TYPE_SCREEN,
content::desktop_capture::CreateScreenCapturer());
#endif // !defined(OS_CHROMEOS)
have_screen_list = true;
source_lists.push_back(std::move(screen_list));
break;
}
case content::DesktopMediaID::TYPE_WINDOW: {
if (have_window_list)
continue;
std::unique_ptr<DesktopMediaList> window_list;
#if defined(OS_CHROMEOS)
window_list = std::make_unique<DesktopMediaListAsh>(
content::DesktopMediaID::TYPE_WINDOW);
#else // !defined(OS_CHROMEOS)
window_list = std::make_unique<NativeDesktopMediaList>(
content::DesktopMediaID::TYPE_WINDOW,
content::desktop_capture::CreateWindowCapturer());
#endif // !defined(OS_CHROMEOS)
have_window_list = true;
source_lists.push_back(std::move(window_list));
break;
}
case content::DesktopMediaID::TYPE_WEB_CONTENTS: {
if (have_tab_list)
continue;
std::unique_ptr<DesktopMediaList> tab_list =
std::make_unique<TabDesktopMediaList>();
have_tab_list = true;
source_lists.push_back(std::move(tab_list));
break;
}
}
}
return source_lists;
}