#include "chrome/browser/media/webrtc/tab_capture_access_handler.h"
#include <memory>
#include <utility>
#include "base/functional/bind.h"
#include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h"
#include "chrome/browser/media/webrtc/capture_policy_utils.h"
#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
#include "chrome/browser/media/webrtc/same_origin_observer.h"
#include "chrome/browser/profiles/profile.h"
#include "components/url_formatter/elide_url.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/desktop_media_id.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_media_capture_id.h"
#include "extensions/common/permissions/permissions_data.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "chrome/browser/chromeos/policy/dlp/dlp_content_manager.h"
#endif
namespace {
class SameOriginPolicyUI : public MediaStreamUI { … };
std::unique_ptr<content::MediaStreamUI> GetMediaStreamUI(
const content::MediaStreamRequest& request,
content::WebContents* web_contents,
std::unique_ptr<MediaStreamUI> media_ui,
blink::mojom::StreamDevices& out_devices) { … }
}
TabCaptureAccessHandler::TabCaptureAccessHandler() = default;
TabCaptureAccessHandler::~TabCaptureAccessHandler() = default;
bool TabCaptureAccessHandler::SupportsStreamType(
content::WebContents* web_contents,
const blink::mojom::MediaStreamType type,
const extensions::Extension* extension) { … }
bool TabCaptureAccessHandler::CheckMediaAccessPermission(
content::RenderFrameHost* render_frame_host,
const url::Origin& security_origin,
blink::mojom::MediaStreamType type,
const extensions::Extension* extension) { … }
void TabCaptureAccessHandler::HandleRequest(
content::WebContents* web_contents,
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback,
const extensions::Extension* extension) { … }
void TabCaptureAccessHandler::AcceptRequest(
content::WebContents* web_contents,
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback,
bool is_allowlisted_extension,
std::unique_ptr<MediaStreamUI> media_ui) { … }
#if BUILDFLAG(IS_CHROMEOS)
void TabCaptureAccessHandler::OnDlpRestrictionChecked(
base::WeakPtr<content::WebContents> web_contents,
std::unique_ptr<PendingAccessRequest> pending_request,
std::unique_ptr<MediaStreamUI> media_ui,
bool is_dlp_allowed) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (!web_contents) {
return;
}
if (is_dlp_allowed) {
AcceptRequest(web_contents.get(), pending_request->request,
std::move(pending_request->callback),
pending_request->is_allowlisted_extension,
std::move(media_ui));
} else {
std::move(pending_request->callback)
.Run(blink::mojom::StreamDevicesSet(),
blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED,
nullptr);
}
}
#endif