summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc')
-rw-r--r--chromium/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc91
1 files changed, 91 insertions, 0 deletions
diff --git a/chromium/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc b/chromium/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
new file mode 100644
index 00000000000..fa7d872810a
--- /dev/null
+++ b/chromium/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
@@ -0,0 +1,91 @@
+// 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;
+}