blob: 092a5b7765640ae9d91999555dbf8287d80fd299 [file] [log] [blame]
// Copyright 2015 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_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_BASE_H_
#define CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_BASE_H_
#include <array>
#include <map>
#include <memory>
#include <string>
#include "base/memory/singleton.h"
#include "chrome/browser/media/webrtc/desktop_media_list.h"
#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h"
#include "chrome/browser/media/webrtc/desktop_media_picker_factory.h"
#include "chrome/common/extensions/api/desktop_capture.h"
#include "extensions/browser/extension_function.h"
#include "url/gurl.h"
namespace extensions {
class DesktopCaptureChooseDesktopMediaFunctionBase : public ExtensionFunction {
public:
// Used to set PickerFactory used to create mock DesktopMediaPicker instances
// for tests. Calling tests keep ownership of the factory. Can be called with
// |factory| set to NULL at the end of the test.
static void SetPickerFactoryForTests(DesktopMediaPickerFactory* factory);
DesktopCaptureChooseDesktopMediaFunctionBase();
void Cancel();
protected:
~DesktopCaptureChooseDesktopMediaFunctionBase() override;
static const char kTargetNotFoundError[];
// |exclude_system_audio| and |exclude_self_browser_surface| are piped from
// the original call. They are constraints that need to be applied before
// the picker is shown to the user, as they affect the picker.
// It is therefore provided to the extension function rather than
// to getUserMedia(), as is the case for other constraints.
//
// |suppress_local_audio_playback_intended| is an indication of what the
// application *intends* to set. This flag is necessary because the
// media-picker shown to the user shows a warning that local system audio will
// be suppressed when that is the case, so this flag has to be plumbed down
// with the other flags that affect the picker. However, unlike the other
// flags, this one only communicates intent, and has no other effect.
// It is a necessary evil, a work-around to address crbug.com/1354189.
// This will go away once the Extension API itself goes away.
//
// |origin| is the origin for which the stream is created.
//
// |target_name| is the display name of the stream target.
ResponseAction Execute(
const std::vector<api::desktop_capture::DesktopCaptureSourceType>&
sources,
bool exclude_system_audio,
bool exclude_self_browser_surface,
bool suppress_local_audio_playback_intended,
content::RenderFrameHost* render_frame_host,
const GURL& origin,
const std::u16string target_name);
// Returns the calling application name to show in the picker.
std::string GetCallerDisplayName() const;
int request_id_;
private:
void OnPickerDialogResults(
const GURL& origin,
const content::GlobalRenderFrameHostId& render_frame_host_id,
const std::string& err,
content::DesktopMediaID source);
std::unique_ptr<DesktopMediaPickerController> picker_controller_;
};
class DesktopCaptureCancelChooseDesktopMediaFunctionBase
: public ExtensionFunction {
public:
DesktopCaptureCancelChooseDesktopMediaFunctionBase();
protected:
~DesktopCaptureCancelChooseDesktopMediaFunctionBase() override;
private:
// ExtensionFunction overrides.
ResponseAction Run() override;
};
class DesktopCaptureRequestsRegistry {
public:
DesktopCaptureRequestsRegistry();
DesktopCaptureRequestsRegistry(const DesktopCaptureRequestsRegistry&) =
delete;
DesktopCaptureRequestsRegistry& operator=(
const DesktopCaptureRequestsRegistry&) = delete;
~DesktopCaptureRequestsRegistry();
static DesktopCaptureRequestsRegistry* GetInstance();
void AddRequest(int process_id,
int request_id,
DesktopCaptureChooseDesktopMediaFunctionBase* handler);
void RemoveRequest(int process_id, int request_id);
void CancelRequest(int process_id, int request_id);
private:
friend struct base::DefaultSingletonTraits<DesktopCaptureRequestsRegistry>;
struct RequestId {
RequestId(int process_id, int request_id);
// Need to use RequestId as a key in std::map<>.
bool operator<(const RequestId& other) const;
int process_id;
int request_id;
};
using RequestsMap =
std::map<RequestId, DesktopCaptureChooseDesktopMediaFunctionBase*>;
RequestsMap requests_;
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_DESKTOP_CAPTURE_DESKTOP_CAPTURE_BASE_H_