blob: 6fb778093f57942faebbc6a68a92967826476674 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_LIST_H_
#define CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_LIST_H_
#include <optional>
#include <string>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/time/time.h"
#include "content/public/browser/desktop_media_id.h"
#include "ui/gfx/image/image_skia.h"
class DesktopMediaListObserver;
namespace content {
class WebContents;
}
// DesktopMediaList provides the list of desktop media source (screens, windows,
// tabs), and their thumbnails, to the desktop media picker dialog. It
// transparently updates the list in the background, and notifies the desktop
// media picker when something changes.
//
// TODO(crbug.com/40637301): Consider renaming this class.
class DesktopMediaList {
public:
// Reflects content::DesktopMediaID::Type, but can decorate it with additional
// information. For example, we can specify *current* screen/window/type while
// keeping all other code that uses content::DesktopMediaID::Type unchanged.
enum class Type {
kNone, // TYPE_NONE
kScreen, // TYPE_SCREEN
kWindow, // TYPE_WINDOW
kWebContents, // TYPE_WEB_CONTENTS
kCurrentTab, // TYPE_WEB_CONTENTS of the current tab.
};
// A WebContents filter can be applied to DesktopMediaList::Type::kWebContents
// MediaList object in order to provide a way to filter out any WebContents
// that shouldn't be included.
using WebContentsFilter =
base::RepeatingCallback<bool(content::WebContents*)>;
// Wraps a given filter to produce a new filter that excludes a given
// WebContents, but is otherwise identical to the original filter.
//
// Note: |excluded_web_contents| will internally be converted to a WeakPtr
// in order to make posting the filter safe. If that weak pointer expires,
// the exclusion also expires. This is safe even when the capturer/capturee
// are the same, because capturing itself will be rejected in that case.
static WebContentsFilter ExcludeWebContents(
WebContentsFilter filter,
content::WebContents* excluded_web_contents);
// Struct used to represent each entry in the list.
struct Source {
Source();
Source(const Source& other_source);
~Source();
// Id of the source.
content::DesktopMediaID id;
// Name of the source that should be shown to the user.
std::u16string name;
// The thumbnail for the source.
gfx::ImageSkia thumbnail;
// A preview for this source, used when both a thumbnail and preview are
// used. Currently only the case in the tab_desktop_media_list.
gfx::ImageSkia preview;
};
using UpdateCallback = base::OnceClosure;
virtual ~DesktopMediaList() = default;
// Sets time interval between updates. By default list of sources and their
// thumbnail are updated once per second. If called after StartUpdating() then
// it will take effect only after the next update.
virtual void SetUpdatePeriod(base::TimeDelta period) = 0;
// Sets size to which the thumbnails should be scaled. If called after
// StartUpdating() then some thumbnails may be still scaled to the old size
// until they are updated.
virtual void SetThumbnailSize(const gfx::Size& thumbnail_size) = 0;
// Sets ID of the hosting desktop picker dialog. The window with this ID will
// be filtered out from the list of sources.
virtual void SetViewDialogWindowId(content::DesktopMediaID dialog_id) = 0;
// Starts updating the model. The model is initially empty, so OnSourceAdded()
// notifications will be generated for each existing source as it is
// enumerated. After the initial enumeration the model will be refreshed based
// on the update period, and notifications generated only for changes in the
// model.
virtual void StartUpdating(DesktopMediaListObserver* observer) = 0;
// Updates the model and calls |callback| when all currently existing sources
// have been found, passing |this| as the argument. In most respects, this is
// a simplified version of StartUpdating(). This method should only be called
// once per DesktopMediaList instance. It should not be called after
// StartUpdating(), and StartUpdating() should not be called until |callback|
// has been called.
virtual void Update(UpdateCallback callback) = 0;
virtual int GetSourceCount() const = 0;
virtual const Source& GetSource(int index) const = 0;
virtual Type GetMediaListType() const = 0;
// Set or clear the id of a single source which needs a preview image
// generating in addition to its thumbnail.
virtual void SetPreviewedSource(
const std::optional<content::DesktopMediaID>& id) = 0;
// Returns true if this DesktopMediaList wraps some other object (usually a
// DesktopCapturer), that takes responsibility for showing its own source
// list where the user will likely make their selection. When true, there will
// only be one source listed which will represent the selection made in the
// delegated source list.
// Returns false if this DesktopMediaList needs UI created for it to show its
// source list.
virtual bool IsSourceListDelegated() const = 0;
// May only be called if |IsSourceListDelegated| returns true. When called,
// clears any selection from the delegated source list and will cause the
// delegated source list to reappear if it is focused.
virtual void ClearDelegatedSourceListSelection() = 0;
// Notifies the list that it is now focused. This is especially important
// when IsSourceDelegated() returns true, as it helps to notify the delegated
// source list when it should be visible.
virtual void FocusList() = 0;
// Notifies the list that it is no longer focused. This is especially
// important when IsSourceDelegated() returns true, as it helps to notify the
// delegated source list when it should be hidden.
virtual void HideList() = 0;
// Show the delegated source list. This is intended to be used for delegated
// source lists that need to be displayed independently from when the
// DesktopMediaList gains focus.
virtual void ShowDelegatedList() = 0;
};
#endif // CHROME_BROWSER_MEDIA_WEBRTC_DESKTOP_MEDIA_LIST_H_