Commit d0734458 authored by Emircan Uysaler's avatar Emircan Uysaler Committed by Commit Bot

Move getDisplayMedia to MediaDevices

Following https://github.com/w3c/mediacapture-screen-share/pull/86

Bug: 326740
Change-Id: Ifb65a33a7f998563640d9f508d26d91ecb16c32f
Reviewed-on: https://chromium-review.googlesource.com/c/1313188Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Reviewed-by: default avatarPhilip Jägenstedt <foolip@chromium.org>
Reviewed-by: default avatarHarald Alvestrand <hta@chromium.org>
Commit-Queue: Emircan Uysaler <emircan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605436}
parent 08d4fc12
......@@ -23,7 +23,7 @@
}
function runGetDisplayMedia(constraints) {
navigator.getDisplayMedia(constraints).
navigator.mediaDevices.getDisplayMedia(constraints).
then(handleSuccess).catch(handleError);
}
......
......@@ -3,7 +3,7 @@
// (https://github.com/tidoust/reffy-reports)
// Source: Screen Capture (https://w3c.github.io/mediacapture-screen-share/)
partial interface Navigator {
partial interface MediaDevices {
Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints);
};
......
......@@ -3,7 +3,7 @@ PASS getDisplayMedia() with video true
PASS getDisplayMedia() with no constraints
PASS getDisplayMedia() with video false
PASS getDisplayMedia() with audio false
FAIL getDisplayMedia() with audio true promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getDisplayMedia' on 'Navigator': Audio capture is not supported"
FAIL getDisplayMedia() with audio true promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'getDisplayMedia' on 'MediaDevices': Audio capture is not supported"
PASS getDisplayMedia() with advanced constraint
PASS getDisplayMedia() with min constraint
PASS getDisplayMedia() with exact constraint
......
......@@ -7,8 +7,8 @@
'use strict';
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({video: true});
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({video: true});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1);
......@@ -22,8 +22,8 @@ promise_test(async t => {
// Note that this results in some non-intuitive cases returning a video track,
// i.e. {video: false}.
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia();
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia();
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1);
......@@ -32,8 +32,8 @@ promise_test(async t => {
}, 'getDisplayMedia() with no constraints');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({video: false});
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({video: false});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1);
......@@ -42,8 +42,8 @@ promise_test(async t => {
}, 'getDisplayMedia() with video false');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({audio: false});
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({audio: false});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1);
......@@ -52,8 +52,8 @@ promise_test(async t => {
}, 'getDisplayMedia() with audio false');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({audio: true});
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({audio: true});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1);
......@@ -62,10 +62,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with audio true');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try {
const stream =
await navigator.getDisplayMedia({video: {advanced: [{zoom: 1}]}});
const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {advanced: [{zoom: 1}]}});
} catch (err) {
assert_equals(err.name, 'TypeError');
return;
......@@ -74,10 +74,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with advanced constraint');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try {
const stream =
await navigator.getDisplayMedia({video: {width: {min: 360}}});
const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {min: 360}}});
} catch (err) {
assert_equals(err.name, 'TypeError');
return;
......@@ -86,10 +86,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with min constraint');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try {
const stream =
await navigator.getDisplayMedia({video: {width: {exact: 360}}});
const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {exact: 360}}});
} catch (err) {
assert_equals(err.name, 'TypeError');
return;
......@@ -98,10 +98,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with exact constraint');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const maxWidth = 360;
const stream =
await navigator.getDisplayMedia({video: {width: {max: maxWidth}}});
const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {max: maxWidth}}});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getVideoTracks().length, 1);
......@@ -111,10 +111,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with max constraint');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const maxWidth = 360;
const maxFrameRate = 4;
const stream = await navigator.getDisplayMedia(
const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {max: maxWidth}, frameRate: {max: maxFrameRate}}});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
......@@ -126,9 +126,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with constraints applied');
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try {
const stream = await navigator.getDisplayMedia({video: {width: {max: 0}}});
const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {max: 0}}});
} catch (err) {
assert_equals(err.name, 'OverconstrainedError');
return;
......@@ -138,8 +139,8 @@ promise_test(async t => {
// Content shell picks a fake desktop device by default.
promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({video: true});
assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.mediaDevices.getDisplayMedia({video: true});
const [track] = stream.getTracks();
t.add_cleanup(() => track.stop());
assert_equals(stream.getVideoTracks().length, 1);
......
......@@ -7,10 +7,10 @@
idl_test(
['screen-capture'],
['mediacapture-streams', 'html'],
['mediacapture-streams', 'html', 'dom'],
idl_array => {
idl_array.add_objects({
Navigator: ['navigator'],
MediaDevices: ['navigator.mediaDevices'],
});
}
);
......@@ -4278,6 +4278,7 @@ interface MediaDevices : EventTarget
getter ondevicechange
method constructor
method enumerateDevices
method getDisplayMedia
method getSupportedConstraints
method getUserMedia
setter ondevicechange
......@@ -4719,7 +4720,6 @@ interface Navigator
getter xr
method constructor
method getBattery
method getDisplayMedia
method getGamepads
method getInstalledRelatedApps
method getUserMedia
......
......@@ -28,8 +28,6 @@ blink_modules_sources("mediastream") {
"media_stream_track_content_hint.h",
"media_stream_track_event.cc",
"media_stream_track_event.h",
"navigator_display_media.cc",
"navigator_display_media.h",
"navigator_media_stream.cc",
"navigator_media_stream.h",
"navigator_user_media.cc",
......
......@@ -158,6 +158,15 @@ ScriptPromise MediaDevices::SendUserMediaRequest(
return promise;
}
ScriptPromise MediaDevices::getDisplayMedia(
ScriptState* script_state,
const MediaStreamConstraints* options,
ExceptionState& exception_state) {
return SendUserMediaRequest(script_state,
WebUserMediaRequest::MediaType::kDisplayMedia,
options, exception_state);
}
const AtomicString& MediaDevices::InterfaceName() const {
return event_target_names::kMediaDevices;
}
......
......@@ -50,6 +50,10 @@ class MODULES_EXPORT MediaDevices final
const MediaStreamConstraints*,
ExceptionState&);
ScriptPromise getDisplayMedia(ScriptState*,
const MediaStreamConstraints*,
ExceptionState&);
// EventTarget overrides.
const AtomicString& InterfaceName() const override;
ExecutionContext* GetExecutionContext() const override;
......
......@@ -10,10 +10,17 @@
ActiveScriptWrappable
] interface MediaDevices : EventTarget {
[RuntimeEnabled=OnDeviceChange] attribute EventHandler ondevicechange;
[CallWith=ScriptState, MeasureAs=MediaDevicesEnumerateDevices] Promise<sequence<MediaDeviceInfo>> enumerateDevices();
[
CallWith = ScriptState, MeasureAs = MediaDevicesEnumerateDevices
] Promise<sequence<MediaDeviceInfo>>
enumerateDevices();
MediaTrackSupportedConstraints getSupportedConstraints();
[CallWith=ScriptState,
RaisesException,
MeasureAs=GetUserMediaPromise
] Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints);
[
CallWith = ScriptState, RaisesException, MeasureAs = GetUserMediaPromise
] Promise<MediaStream>
getUserMedia(optional MediaStreamConstraints constraints);
[
RuntimeEnabled = GetDisplayMedia, CallWith = ScriptState, RaisesException
] Promise<MediaStream>
getDisplayMedia(optional MediaStreamConstraints constraints);
};
// 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 "third_party/blink/renderer/modules/mediastream/navigator_display_media.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/modules/mediastream/media_devices.h"
#include "third_party/blink/renderer/modules/mediastream/navigator_user_media.h"
namespace blink {
ScriptPromise NavigatorDisplayMedia::getDisplayMedia(
ScriptState* script_state,
Navigator& navigator,
const MediaStreamConstraints* options,
ExceptionState& exception_state) {
MediaDevices* const media_devices =
NavigatorUserMedia::mediaDevices(navigator);
if (!media_devices) {
return ScriptPromise::RejectWithDOMException(
script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
"Current frame is detached."));
}
return media_devices->SendUserMediaRequest(
script_state, WebUserMediaRequest::MediaType::kDisplayMedia, options,
exception_state);
}
} // namespace blink
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_NAVIGATOR_DISPLAY_MEDIA_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_NAVIGATOR_DISPLAY_MEDIA_H_
#include "third_party/blink/renderer/platform/wtf/allocator.h"
#include "third_party/blink/renderer/core/frame/navigator.h"
namespace blink {
class ExceptionState;
class MediaStreamConstraints;
class ScriptPromise;
class ScriptState;
class NavigatorDisplayMedia {
STATIC_ONLY(NavigatorDisplayMedia);
public:
static ScriptPromise getDisplayMedia(ScriptState*,
Navigator&,
const MediaStreamConstraints*,
ExceptionState&);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_NAVIGATOR_DISPLAY_MEDIA_H_
// 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.
// https://w3c.github.io/mediacapture-screen-share/
[
ImplementedAs = NavigatorDisplayMedia,
RuntimeEnabled = GetDisplayMedia
] partial interface Navigator {
[CallWith = ScriptState, RaisesException] Promise<MediaStream>
getDisplayMedia(optional MediaStreamConstraints constraints);
};
......@@ -765,7 +765,6 @@ modules_dependency_idl_files =
"mediasource/url_media_source.idl",
"mediasource/video_track_source_buffer.idl",
"mediastream/media_stream_track_content_hint.idl",
"mediastream/navigator_display_media.idl",
"mediastream/navigator_media_stream.idl",
"mediastream/navigator_user_media.idl",
"mediastream/window_media_stream.idl",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment