Skip to content

Commit

Permalink
Handle a DISPLAY_VIDEO_CAPTURE_THIS_TAB request in the browser process
Browse files Browse the repository at this point in the history
This is the second step in implementing getCurrentBrowsingContextMedia behind
a runtime flag.

TL;DR: This is an API for capturing the current tab.

Explainer:
https://docs.google.com/document/d/1CIQH2ygvw7eTGO__Pcds_D46Gcn-iPAqESQqOsHHfkI

Design doc:
go/get-current-browsing-context-media

Intent-to-Prototype:
https://groups.google.com/u/3/a/chromium.org/g/blink-dev/c/NYVbRRBlABI/m/MJEzcyEUCQAJ

PR against spec:
w3c/mediacapture-screen-share#148

Next steps:
* Implement the confirmation-box.
* Implement unit-tests that rely on the confirmation-box.

Bug: 1136942
Change-Id: I8b25baa85565999ec44ed2f1b0bd1e19d6f148c4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2502628
Reviewed-by: Guido Urdaneta <[email protected]>
Reviewed-by: Yuri Wiitala <[email protected]>
Reviewed-by: Robert Kaplow <[email protected]>
Reviewed-by: Sergey Ulanov <[email protected]>
Commit-Queue: Sergey Ulanov <[email protected]>
Cr-Commit-Position: refs/heads/master@{#824534}
  • Loading branch information
Elad Alon authored and Commit Bot committed Nov 5, 2020
1 parent d55c008 commit 88e5eee
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 21 deletions.
15 changes: 9 additions & 6 deletions chrome/browser/media/capture_access_handler_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -131,12 +131,15 @@ void CaptureAccessHandlerBase::UpdateMediaRequestState(
blink::mojom::MediaStreamType stream_type,
content::MediaRequestState state) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if ((stream_type !=
blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE) &&
(stream_type != blink::mojom::MediaStreamType::GUM_TAB_VIDEO_CAPTURE) &&
(stream_type != blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE) &&
(stream_type != blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE)) {
return;
switch (stream_type) {
case blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE:
case blink::mojom::MediaStreamType::GUM_TAB_VIDEO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
break;
default:
return;
}

if (state == content::MEDIA_REQUEST_STATE_DONE) {
Expand Down
17 changes: 14 additions & 3 deletions chrome/browser/media/webrtc/display_media_access_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ bool DisplayMediaAccessHandler::SupportsStreamType(
content::WebContents* web_contents,
const blink::mojom::MediaStreamType stream_type,
const extensions::Extension* extension) {
return stream_type == blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE;
return stream_type == blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE ||
stream_type ==
blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB;
// This class handles MEDIA_DISPLAY_AUDIO_CAPTURE as well, but only if it is
// accompanied by MEDIA_DISPLAY_VIDEO_CAPTURE request as per spec.
// https://w3c.github.io/mediacapture-screen-share/#mediadevices-additions
Expand Down Expand Up @@ -135,6 +137,16 @@ void DisplayMediaAccessHandler::HandleRequest(
}
#endif // defined(OS_MAC)

if (request.video_type ==
blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB) {
// TODO(crbug.com/1136942): Add support for capture-this-tab instead of
// returning an error
std::move(callback).Run(
blink::MediaStreamDevices(),
blink::mojom::MediaStreamRequestResult::NOT_SUPPORTED, nullptr);
return;
}

std::unique_ptr<DesktopMediaPicker> picker = picker_factory_->CreatePicker();
if (!picker) {
std::move(callback).Run(
Expand Down Expand Up @@ -267,8 +279,7 @@ void DisplayMediaAccessHandler::OnPickerDialogResults(
web_contents->GetLastCommittedURL(),
url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC);
ui = GetDevicesForDesktopCapture(
web_contents, &devices, media_id,
blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE,
web_contents, &devices, media_id, pending_request.request.video_type,
blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE,
media_id.audio_share, false /* disable_local_echo */,
display_notification_, visible_url, visible_url);
Expand Down
14 changes: 14 additions & 0 deletions chrome/browser/media/webrtc/media_capture_devices_dispatcher.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/constants.h"
#include "media/base/media_switches.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"

#if defined(OS_ANDROID)
Expand Down Expand Up @@ -163,6 +164,19 @@ void MediaCaptureDevicesDispatcher::ProcessMediaAccessRequest(
}
#endif

// Kill switch for getCurrentBrowsingContextMedia() on browser side to prevent
// renderer from bypassing blink side checks.
if (request.video_type ==
blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB) {
if (!base::FeatureList::IsEnabled(
blink::features::kRTCGetCurrentBrowsingContextMedia)) {
std::move(callback).Run(
blink::MediaStreamDevices(),
blink::mojom::MediaStreamRequestResult::NOT_SUPPORTED, nullptr);
return;
}
}

for (const auto& handler : media_access_handlers_) {
if (handler->SupportsStreamType(web_contents, request.video_type,
extension) ||
Expand Down
10 changes: 2 additions & 8 deletions chrome/browser/media/webrtc/media_stream_capture_indicator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -111,16 +111,13 @@ ObserverMethod GetObserverMethodToCall(const blink::MediaStreamDevice& device) {
case blink::mojom::MediaStreamType::GUM_DESKTOP_AUDIO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
return IsDeviceCapturingDisplay(device)
? &MediaStreamCaptureIndicator::Observer::
OnIsCapturingDisplayChanged
: &MediaStreamCaptureIndicator::Observer::
OnIsCapturingWindowChanged;

case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
// TODO(crbug.com/1136942): Finish wiring getCurrentBrowsingContextMedia.
NOTIMPLEMENTED();
FALLTHROUGH;
case blink::mojom::MediaStreamType::NO_SERVICE:
case blink::mojom::MediaStreamType::NUM_MEDIA_TYPES:
NOTREACHED();
Expand Down Expand Up @@ -324,13 +321,10 @@ int& MediaStreamCaptureIndicator::WebContentsDeviceUsage::GetStreamCount(
case blink::mojom::MediaStreamType::GUM_DESKTOP_AUDIO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_AUDIO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
return IsDeviceCapturingDisplay(device) ? display_stream_count_
: window_stream_count_;

case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
// TODO(crbug.com/1136942): Finish wiring getCurrentBrowsingContextMedia.
NOTIMPLEMENTED();
FALLTHROUGH;
case blink::mojom::MediaStreamType::NO_SERVICE:
case blink::mojom::MediaStreamType::NUM_MEDIA_TYPES:
NOTREACHED();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ void InProcessVideoCaptureDeviceLauncher::LaunchDeviceAsync(
#endif // !defined(OS_ANDROID)

case blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE:
FALLTHROUGH;
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE: {
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE:
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB: {
const DesktopMediaID desktop_id = DesktopMediaID::Parse(device_id);
if (desktop_id.is_null()) {
DLOG(ERROR) << "Desktop media ID is null";
Expand Down
9 changes: 7 additions & 2 deletions content/browser/renderer_host/media/media_stream_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ const char* StreamTypeToString(blink::mojom::MediaStreamType type) {
return "DISPLAY_AUDIO_CAPTURE";
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE:
return "DISPLAY_VIDEO_CAPTURE";
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
return "DISPLAY_VIDEO_CAPTURE_THIS_TAB";
case blink::mojom::MediaStreamType::NO_SERVICE:
return "NO_SERVICE";
case blink::mojom::MediaStreamType::NUM_MEDIA_TYPES:
Expand Down Expand Up @@ -1465,7 +1467,8 @@ void MediaStreamManager::SetUpRequest(const std::string& label) {
request->SetVideoType(request->controls.video.stream_type);

const bool is_display_capture =
request->video_type() == MediaStreamType::DISPLAY_VIDEO_CAPTURE;
request->video_type() == MediaStreamType::DISPLAY_VIDEO_CAPTURE ||
request->video_type() == MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB;
if (is_display_capture && !SetUpDisplayCaptureRequest(request)) {
FinalizeRequestFailed(label, request,
MediaStreamRequestResult::SCREEN_CAPTURE_FAILURE);
Expand Down Expand Up @@ -1510,7 +1513,9 @@ void MediaStreamManager::SetUpRequest(const std::string& label) {

bool MediaStreamManager::SetUpDisplayCaptureRequest(DeviceRequest* request) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK(request->video_type() == MediaStreamType::DISPLAY_VIDEO_CAPTURE);
DCHECK(request->video_type() == MediaStreamType::DISPLAY_VIDEO_CAPTURE ||
request->video_type() ==
MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB);

// getDisplayMedia function does not permit the use of constraints for
// selection of a source, see
Expand Down
10 changes: 10 additions & 0 deletions content/browser/renderer_host/media/video_capture_controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ void LogVideoFrameDrop(media::VideoCaptureFrameDropReason reason,
UMA_HISTOGRAM_ENUMERATION("Media.VideoCapture.FrameDrop.DisplayCapture",
reason, kEnumCount);
break;
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
UMA_HISTOGRAM_ENUMERATION(
"Media.VideoCapture.FrameDrop.DisplayCaptureCurrentTab", reason,
kEnumCount);
break;
default:
// Do nothing
return;
Expand Down Expand Up @@ -103,6 +108,11 @@ void LogMaxConsecutiveVideoFrameDropCountExceeded(
"Media.VideoCapture.MaxFrameDropExceeded.DisplayCapture", reason,
kEnumCount);
break;
case blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB:
UMA_HISTOGRAM_ENUMERATION(
"Media.VideoCapture.MaxFrameDropExceeded.DisplayCaptureCurrentTab",
reason, kEnumCount);
break;
default:
// Do nothing
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19223,6 +19223,7 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
<histogram_suffixes name="VideoCaptureFrameDrop" separator=".">
<suffix name="DeviceCapture" label=""/>
<suffix name="DisplayCapture" label=""/>
<suffix name="DisplayCaptureCurrentTab" label=""/>
<suffix name="GumDesktopCapture" label=""/>
<suffix name="GumTabCapture" label=""/>
<affected-histogram name="Media.VideoCapture.FrameDrop"/>
Expand Down

0 comments on commit 88e5eee

Please sign in to comment.