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 @@ ...@@ -23,7 +23,7 @@
} }
function runGetDisplayMedia(constraints) { function runGetDisplayMedia(constraints) {
navigator.getDisplayMedia(constraints). navigator.mediaDevices.getDisplayMedia(constraints).
then(handleSuccess).catch(handleError); then(handleSuccess).catch(handleError);
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
// (https://github.com/tidoust/reffy-reports) // (https://github.com/tidoust/reffy-reports)
// Source: Screen Capture (https://w3c.github.io/mediacapture-screen-share/) // Source: Screen Capture (https://w3c.github.io/mediacapture-screen-share/)
partial interface Navigator { partial interface MediaDevices {
Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints); Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints);
}; };
......
...@@ -3,7 +3,7 @@ PASS getDisplayMedia() with video true ...@@ -3,7 +3,7 @@ PASS getDisplayMedia() with video true
PASS getDisplayMedia() with no constraints PASS getDisplayMedia() with no constraints
PASS getDisplayMedia() with video false PASS getDisplayMedia() with video false
PASS getDisplayMedia() with audio 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 advanced constraint
PASS getDisplayMedia() with min constraint PASS getDisplayMedia() with min constraint
PASS getDisplayMedia() with exact constraint PASS getDisplayMedia() with exact constraint
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
'use strict'; 'use strict';
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({video: true}); const stream = await navigator.mediaDevices.getDisplayMedia({video: true});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1); assert_equals(stream.getTracks().length, 1);
...@@ -22,8 +22,8 @@ promise_test(async t => { ...@@ -22,8 +22,8 @@ promise_test(async t => {
// Note that this results in some non-intuitive cases returning a video track, // Note that this results in some non-intuitive cases returning a video track,
// i.e. {video: false}. // i.e. {video: false}.
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia(); const stream = await navigator.mediaDevices.getDisplayMedia();
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1); assert_equals(stream.getTracks().length, 1);
...@@ -32,8 +32,8 @@ promise_test(async t => { ...@@ -32,8 +32,8 @@ promise_test(async t => {
}, 'getDisplayMedia() with no constraints'); }, 'getDisplayMedia() with no constraints');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({video: false}); const stream = await navigator.mediaDevices.getDisplayMedia({video: false});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1); assert_equals(stream.getTracks().length, 1);
...@@ -42,8 +42,8 @@ promise_test(async t => { ...@@ -42,8 +42,8 @@ promise_test(async t => {
}, 'getDisplayMedia() with video false'); }, 'getDisplayMedia() with video false');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({audio: false}); const stream = await navigator.mediaDevices.getDisplayMedia({audio: false});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1); assert_equals(stream.getTracks().length, 1);
...@@ -52,8 +52,8 @@ promise_test(async t => { ...@@ -52,8 +52,8 @@ promise_test(async t => {
}, 'getDisplayMedia() with audio false'); }, 'getDisplayMedia() with audio false');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({audio: true}); const stream = await navigator.mediaDevices.getDisplayMedia({audio: true});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getTracks().length, 1); assert_equals(stream.getTracks().length, 1);
...@@ -62,10 +62,10 @@ promise_test(async t => { ...@@ -62,10 +62,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with audio true'); }, 'getDisplayMedia() with audio true');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try { try {
const stream = const stream = await navigator.mediaDevices.getDisplayMedia(
await navigator.getDisplayMedia({video: {advanced: [{zoom: 1}]}}); {video: {advanced: [{zoom: 1}]}});
} catch (err) { } catch (err) {
assert_equals(err.name, 'TypeError'); assert_equals(err.name, 'TypeError');
return; return;
...@@ -74,10 +74,10 @@ promise_test(async t => { ...@@ -74,10 +74,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with advanced constraint'); }, 'getDisplayMedia() with advanced constraint');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try { try {
const stream = const stream = await navigator.mediaDevices.getDisplayMedia(
await navigator.getDisplayMedia({video: {width: {min: 360}}}); {video: {width: {min: 360}}});
} catch (err) { } catch (err) {
assert_equals(err.name, 'TypeError'); assert_equals(err.name, 'TypeError');
return; return;
...@@ -86,10 +86,10 @@ promise_test(async t => { ...@@ -86,10 +86,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with min constraint'); }, 'getDisplayMedia() with min constraint');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try { try {
const stream = const stream = await navigator.mediaDevices.getDisplayMedia(
await navigator.getDisplayMedia({video: {width: {exact: 360}}}); {video: {width: {exact: 360}}});
} catch (err) { } catch (err) {
assert_equals(err.name, 'TypeError'); assert_equals(err.name, 'TypeError');
return; return;
...@@ -98,10 +98,10 @@ promise_test(async t => { ...@@ -98,10 +98,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with exact constraint'); }, 'getDisplayMedia() with exact constraint');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const maxWidth = 360; const maxWidth = 360;
const stream = const stream = await navigator.mediaDevices.getDisplayMedia(
await navigator.getDisplayMedia({video: {width: {max: maxWidth}}}); {video: {width: {max: maxWidth}}});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getVideoTracks().length, 1); assert_equals(stream.getVideoTracks().length, 1);
...@@ -111,10 +111,10 @@ promise_test(async t => { ...@@ -111,10 +111,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with max constraint'); }, 'getDisplayMedia() with max constraint');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const maxWidth = 360; const maxWidth = 360;
const maxFrameRate = 4; const maxFrameRate = 4;
const stream = await navigator.getDisplayMedia( const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {max: maxWidth}, frameRate: {max: maxFrameRate}}}); {video: {width: {max: maxWidth}, frameRate: {max: maxFrameRate}}});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
...@@ -126,9 +126,10 @@ promise_test(async t => { ...@@ -126,9 +126,10 @@ promise_test(async t => {
}, 'getDisplayMedia() with constraints applied'); }, 'getDisplayMedia() with constraints applied');
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
try { try {
const stream = await navigator.getDisplayMedia({video: {width: {max: 0}}}); const stream = await navigator.mediaDevices.getDisplayMedia(
{video: {width: {max: 0}}});
} catch (err) { } catch (err) {
assert_equals(err.name, 'OverconstrainedError'); assert_equals(err.name, 'OverconstrainedError');
return; return;
...@@ -138,8 +139,8 @@ promise_test(async t => { ...@@ -138,8 +139,8 @@ promise_test(async t => {
// Content shell picks a fake desktop device by default. // Content shell picks a fake desktop device by default.
promise_test(async t => { promise_test(async t => {
assert_idl_attribute(navigator, 'getDisplayMedia'); assert_idl_attribute(navigator.mediaDevices, 'getDisplayMedia');
const stream = await navigator.getDisplayMedia({video: true}); const stream = await navigator.mediaDevices.getDisplayMedia({video: true});
const [track] = stream.getTracks(); const [track] = stream.getTracks();
t.add_cleanup(() => track.stop()); t.add_cleanup(() => track.stop());
assert_equals(stream.getVideoTracks().length, 1); assert_equals(stream.getVideoTracks().length, 1);
......
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
idl_test( idl_test(
['screen-capture'], ['screen-capture'],
['mediacapture-streams', 'html'], ['mediacapture-streams', 'html', 'dom'],
idl_array => { idl_array => {
idl_array.add_objects({ idl_array.add_objects({
Navigator: ['navigator'], MediaDevices: ['navigator.mediaDevices'],
}); });
} }
); );
...@@ -4278,6 +4278,7 @@ interface MediaDevices : EventTarget ...@@ -4278,6 +4278,7 @@ interface MediaDevices : EventTarget
getter ondevicechange getter ondevicechange
method constructor method constructor
method enumerateDevices method enumerateDevices
method getDisplayMedia
method getSupportedConstraints method getSupportedConstraints
method getUserMedia method getUserMedia
setter ondevicechange setter ondevicechange
...@@ -4719,7 +4720,6 @@ interface Navigator ...@@ -4719,7 +4720,6 @@ interface Navigator
getter xr getter xr
method constructor method constructor
method getBattery method getBattery
method getDisplayMedia
method getGamepads method getGamepads
method getInstalledRelatedApps method getInstalledRelatedApps
method getUserMedia method getUserMedia
......
...@@ -28,8 +28,6 @@ blink_modules_sources("mediastream") { ...@@ -28,8 +28,6 @@ blink_modules_sources("mediastream") {
"media_stream_track_content_hint.h", "media_stream_track_content_hint.h",
"media_stream_track_event.cc", "media_stream_track_event.cc",
"media_stream_track_event.h", "media_stream_track_event.h",
"navigator_display_media.cc",
"navigator_display_media.h",
"navigator_media_stream.cc", "navigator_media_stream.cc",
"navigator_media_stream.h", "navigator_media_stream.h",
"navigator_user_media.cc", "navigator_user_media.cc",
......
...@@ -158,6 +158,15 @@ ScriptPromise MediaDevices::SendUserMediaRequest( ...@@ -158,6 +158,15 @@ ScriptPromise MediaDevices::SendUserMediaRequest(
return promise; 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 { const AtomicString& MediaDevices::InterfaceName() const {
return event_target_names::kMediaDevices; return event_target_names::kMediaDevices;
} }
......
...@@ -50,6 +50,10 @@ class MODULES_EXPORT MediaDevices final ...@@ -50,6 +50,10 @@ class MODULES_EXPORT MediaDevices final
const MediaStreamConstraints*, const MediaStreamConstraints*,
ExceptionState&); ExceptionState&);
ScriptPromise getDisplayMedia(ScriptState*,
const MediaStreamConstraints*,
ExceptionState&);
// EventTarget overrides. // EventTarget overrides.
const AtomicString& InterfaceName() const override; const AtomicString& InterfaceName() const override;
ExecutionContext* GetExecutionContext() const override; ExecutionContext* GetExecutionContext() const override;
......
...@@ -10,10 +10,17 @@ ...@@ -10,10 +10,17 @@
ActiveScriptWrappable ActiveScriptWrappable
] interface MediaDevices : EventTarget { ] interface MediaDevices : EventTarget {
[RuntimeEnabled=OnDeviceChange] attribute EventHandler ondevicechange; [RuntimeEnabled=OnDeviceChange] attribute EventHandler ondevicechange;
[CallWith=ScriptState, MeasureAs=MediaDevicesEnumerateDevices] Promise<sequence<MediaDeviceInfo>> enumerateDevices(); [
CallWith = ScriptState, MeasureAs = MediaDevicesEnumerateDevices
] Promise<sequence<MediaDeviceInfo>>
enumerateDevices();
MediaTrackSupportedConstraints getSupportedConstraints(); MediaTrackSupportedConstraints getSupportedConstraints();
[CallWith=ScriptState, [
RaisesException, CallWith = ScriptState, RaisesException, MeasureAs = GetUserMediaPromise
MeasureAs=GetUserMediaPromise ] Promise<MediaStream>
] Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints); 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 = ...@@ -765,7 +765,6 @@ modules_dependency_idl_files =
"mediasource/url_media_source.idl", "mediasource/url_media_source.idl",
"mediasource/video_track_source_buffer.idl", "mediasource/video_track_source_buffer.idl",
"mediastream/media_stream_track_content_hint.idl", "mediastream/media_stream_track_content_hint.idl",
"mediastream/navigator_display_media.idl",
"mediastream/navigator_media_stream.idl", "mediastream/navigator_media_stream.idl",
"mediastream/navigator_user_media.idl", "mediastream/navigator_user_media.idl",
"mediastream/window_media_stream.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