Diff
Modified: trunk/LayoutTests/ChangeLog (226210 => 226211)
--- trunk/LayoutTests/ChangeLog 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/LayoutTests/ChangeLog 2017-12-21 02:45:36 UTC (rev 226211)
@@ -1,3 +1,16 @@
+2017-12-20 Eric Carlson <eric.carl...@apple.com>
+
+ [MediaStream] Add screen capture IDL and stub functions
+ https://bugs.webkit.org/show_bug.cgi?id=181070
+ <rdar://problem/35555184>
+
+ Reviewed by Youenn Fablet.
+
+ * fast/mediastream/screencapture-disabled-expected.txt: Added.
+ * fast/mediastream/screencapture-disabled.html: Added.
+ * fast/mediastream/screencapture-enabled-expected.txt: Added.
+ * fast/mediastream/screencapture-enabled.html: Added.
+
2017-12-20 Matt Lewis <jlew...@apple.com>
Unreviewed, rolling out r225656.
Added: trunk/LayoutTests/fast/mediastream/screencapture-disabled-expected.txt (0 => 226211)
--- trunk/LayoutTests/fast/mediastream/screencapture-disabled-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/screencapture-disabled-expected.txt 2017-12-21 02:45:36 UTC (rev 226211)
@@ -0,0 +1,2 @@
+PASS undefined is undefined.
+
Added: trunk/LayoutTests/fast/mediastream/screencapture-disabled.html (0 => 226211)
--- trunk/LayoutTests/fast/mediastream/screencapture-disabled.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/screencapture-disabled.html 2017-12-21 02:45:36 UTC (rev 226211)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<script src=""
+<script>
+ if (window.testRunner)
+ window.testRunner.dumpAsText();
+
+ if (window.internals)
+ window.internals.settings.setScreenCaptureEnabled(false);
+
+ function runTest() {
+ if (!window.testRunner)
+ return;
+
+ shouldBeUndefined(navigator.mediaDevices.getDisplayMedia);
+ }
+
+ window.addEventListener("load", runTest, false);
+</script>
Added: trunk/LayoutTests/fast/mediastream/screencapture-enabled-expected.txt (0 => 226211)
--- trunk/LayoutTests/fast/mediastream/screencapture-enabled-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/screencapture-enabled-expected.txt 2017-12-21 02:45:36 UTC (rev 226211)
@@ -0,0 +1,4 @@
+PASS function getDisplayMedia() {
+ [native code]
+} is defined.
+
Added: trunk/LayoutTests/fast/mediastream/screencapture-enabled.html (0 => 226211)
--- trunk/LayoutTests/fast/mediastream/screencapture-enabled.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/screencapture-enabled.html 2017-12-21 02:45:36 UTC (rev 226211)
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<script src=""
+
+<script>
+ if (window.testRunner)
+ window.testRunner.dumpAsText();
+
+ if (window.internals)
+ window.internals.settings.setScreenCaptureEnabled(true);
+
+ function runTest() {
+ if (!window.testRunner)
+ return;
+
+ shouldBeDefined(navigator.mediaDevices.getDisplayMedia);
+ }
+
+ window.addEventListener("load", runTest, false);
+</script>
Modified: trunk/Source/WebCore/ChangeLog (226210 => 226211)
--- trunk/Source/WebCore/ChangeLog 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/ChangeLog 2017-12-21 02:45:36 UTC (rev 226211)
@@ -1,3 +1,74 @@
+2017-12-20 Eric Carlson <eric.carl...@apple.com>
+
+ [MediaStream] Add screen capture IDL and stub functions
+ https://bugs.webkit.org/show_bug.cgi?id=181070
+ <rdar://problem/35555184>
+
+ Reviewed by Youenn Fablet.
+
+ Tests: fast/mediastream/screencapture-disabled.html
+ fast/mediastream/screencapture-enabled.html
+
+ * Modules/mediastream/MediaDevices.cpp:
+ (WebCore::MediaDevices::getDisplayMedia const):
+ (WebCore::MediaDevices::getSupportedConstraints):
+ * Modules/mediastream/MediaDevices.h:
+ * Modules/mediastream/MediaDevices.idl:
+ * Modules/mediastream/MediaTrackConstraints.cpp:
+ (WebCore::convertToInternalForm):
+ * Modules/mediastream/MediaTrackConstraints.h:
+ * Modules/mediastream/MediaTrackConstraints.idl:
+ * Modules/mediastream/MediaTrackSupportedConstraints.h:
+ * Modules/mediastream/MediaTrackSupportedConstraints.idl:
+ * Modules/mediastream/UserMediaRequest.cpp:
+ (WebCore::UserMediaRequest::start):
+ (WebCore::UserMediaRequest::allow):
+ (WebCore::UserMediaRequest::deny):
+ * Modules/mediastream/UserMediaRequest.h:
+ * page/RuntimeEnabledFeatures.h:
+ (WebCore::RuntimeEnabledFeatures::screenCaptureEnabled const):
+ (WebCore::RuntimeEnabledFeatures::setScreenCaptureEnabled):
+ * platform/mediastream/CaptureDevice.h:
+ * platform/mediastream/MediaConstraints.cpp:
+ (WebCore::MediaTrackConstraintSetMap::set):
+ * platform/mediastream/MediaConstraints.h:
+ (WebCore::MediaTrackConstraintSetMap::displaySurface const):
+ (WebCore::MediaTrackConstraintSetMap::logicalSurface const):
+ (WebCore::MediaTrackConstraintSetMap::encode const):
+ (WebCore::MediaTrackConstraintSetMap::decode):
+ * platform/mediastream/MediaStreamRequest.h:
+ * platform/mediastream/RealtimeMediaSource.cpp:
+ (WebCore::RealtimeMediaSource::fitnessDistance):
+ (WebCore::RealtimeMediaSource::applyConstraint):
+ (WebCore::RealtimeMediaSource::supportsConstraint const):
+ * platform/mediastream/RealtimeMediaSourceCenter.cpp:
+ (WebCore::RealtimeMediaSourceCenter::validateRequestConstraints):
+ (WebCore::RealtimeMediaSourceCenter::captureDeviceWithPersistentID):
+ * platform/mediastream/RealtimeMediaSourceSettings.h:
+ (WebCore::RealtimeMediaSourceSettings::supportsDisplaySurface const):
+ (WebCore::RealtimeMediaSourceSettings::displaySurface const):
+ (WebCore::RealtimeMediaSourceSettings::setDisplaySurface):
+ (WebCore::RealtimeMediaSourceSettings::supportsLogicalSurface const):
+ (WebCore::RealtimeMediaSourceSettings::logicalSurface const):
+ (WebCore::RealtimeMediaSourceSettings::setLogicalSurface):
+ * platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp:
+ (WebCore::RealtimeMediaSourceSupportedConstraints::supportsConstraint const):
+ * platform/mediastream/RealtimeMediaSourceSupportedConstraints.h:
+ (WebCore::RealtimeMediaSourceSupportedConstraints::supportsDisplaySurface const):
+ (WebCore::RealtimeMediaSourceSupportedConstraints::setSupportsDisplaySurface):
+ (WebCore::RealtimeMediaSourceSupportedConstraints::supportsLogicalSurface const):
+ (WebCore::RealtimeMediaSourceSupportedConstraints::setSupportsLogicalSurface):
+ (WebCore::RealtimeMediaSourceSupportedConstraints::encode const):
+ (WebCore::RealtimeMediaSourceSupportedConstraints::decode):
+ * platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp:
+ * platform/mock/MockRealtimeVideoSource.cpp:
+ * testing/InternalSettings.cpp:
+ (WebCore::InternalSettings::Backup::Backup):
+ (WebCore::InternalSettings::Backup::restoreTo):
+ (WebCore::InternalSettings::setScreenCaptureEnabled):
+ * testing/InternalSettings.h:
+ * testing/InternalSettings.idl:
+
2017-12-20 Matt Lewis <jlew...@apple.com>
Unreviewed, rolling out r225656.
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -39,6 +39,7 @@
#include "EventNames.h"
#include "MediaDevicesRequest.h"
#include "MediaTrackSupportedConstraints.h"
+#include "RuntimeEnabledFeatures.h"
#include "UserMediaRequest.h"
#include <wtf/RandomNumber.h>
@@ -108,6 +109,19 @@
return { };
}
+ExceptionOr<void> MediaDevices::getDisplayMedia(const StreamConstraints& constraints, Promise&& promise) const
+{
+ auto* document = this->document();
+ if (!document)
+ return Exception { InvalidStateError };
+
+ auto request = UserMediaRequest::create(*document, { MediaStreamRequest::Type::DisplayMedia, createMediaConstraints(constraints.audio), createMediaConstraints(constraints.video) }, WTFMove(promise));
+ if (request)
+ request->start();
+
+ return { };
+}
+
void MediaDevices::enumerateDevices(EnumerateDevicesPromise&& promise) const
{
auto* document = this->document();
@@ -131,6 +145,11 @@
result.echoCancellation = supported.supportsEchoCancellation();
result.deviceId = supported.supportsDeviceId();
result.groupId = supported.supportsGroupId();
+ if (RuntimeEnabledFeatures::sharedFeatures().screenCaptureEnabled()) {
+ result.deviceId = supported.supportsDeviceId();
+ result.groupId = supported.supportsGroupId();
+ }
+
return result;
}
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.h (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -65,6 +65,7 @@
Variant<bool, MediaTrackConstraints> audio;
};
ExceptionOr<void> getUserMedia(const StreamConstraints&, Promise&&) const;
+ ExceptionOr<void> getDisplayMedia(const StreamConstraints&, Promise&&) const;
void enumerateDevices(EnumerateDevicesPromise&&) const;
MediaTrackSupportedConstraints getSupportedConstraints();
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.idl (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.idl 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.idl 2017-12-21 02:45:36 UTC (rev 226211)
@@ -38,6 +38,7 @@
MediaTrackSupportedConstraints getSupportedConstraints();
[PrivateIdentifier, PublicIdentifier] Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints);
+ [EnabledAtRuntime=ScreenCapture] Promise<MediaStream> getDisplayMedia(optional MediaStreamConstraints constraints);
};
[
Modified: trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.cpp (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -171,6 +171,8 @@
// FIXME: add channelCount
set(result, setType, "deviceId", MediaConstraintType::DeviceId, constraintSet.deviceId);
set(result, setType, "groupId", MediaConstraintType::GroupId, constraintSet.groupId);
+ set(result, setType, "displaySurface", MediaConstraintType::DisplaySurface, constraintSet.displaySurface);
+ set(result, setType, "logicalSurface", MediaConstraintType::LogicalSurface, constraintSet.logicalSurface);
return result;
}
Modified: trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.h (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -73,6 +73,8 @@
std::optional<ConstrainBoolean> echoCancellation;
std::optional<ConstrainDOMString> deviceId;
std::optional<ConstrainDOMString> groupId;
+ std::optional<ConstrainDOMString> displaySurface;
+ std::optional<ConstrainBoolean> logicalSurface;
};
struct MediaTrackConstraints : MediaTrackConstraintSet {
Modified: trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.idl (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.idl 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaTrackConstraints.idl 2017-12-21 02:45:36 UTC (rev 226211)
@@ -47,6 +47,9 @@
// FIXME 169871: add channelCount
ConstrainDOMString deviceId;
ConstrainDOMString groupId;
+ ConstrainDOMString displaySurface;
+ ConstrainBoolean logicalSurface;
+
};
typedef (double or ConstrainDoubleRange) ConstrainDouble;
Modified: trunk/Source/WebCore/Modules/mediastream/MediaTrackSupportedConstraints.h (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaTrackSupportedConstraints.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaTrackSupportedConstraints.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -46,6 +46,8 @@
bool echoCancellation;
bool deviceId;
bool groupId;
+ bool displaySurface;
+ bool logicalSurface;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/MediaTrackSupportedConstraints.idl (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/MediaTrackSupportedConstraints.idl 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/MediaTrackSupportedConstraints.idl 2017-12-21 02:45:36 UTC (rev 226211)
@@ -45,4 +45,6 @@
// FIXME 169871: add channelCount
boolean deviceId = true;
boolean groupId = true;
+ boolean displaySurface = true;
+ boolean logicalSurface = true;
};
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -159,10 +159,28 @@
{
ASSERT(m_scriptExecutionContext);
if (!m_scriptExecutionContext) {
- deny(MediaAccessDenialReason::UserMediaDisabled, emptyString());
+ deny(MediaAccessDenialReason::UserMediaDisabled);
return;
}
+ if (m_request.type == MediaStreamRequest::Type::DisplayMedia) {
+ // https://w3c.github.io/mediacapture-screen-share/#constraints
+ // 5.2 Constraining Display Surface Selection
+ // The getDisplayMedia function does not permit the use of constraints for selection of a source as described
+ // in the getUserMedia() algorithm. Prior to invoking the getUserMedia() algorithm, if either of the video
+ // and audio attributes are set to a MediaTrackConstraints value (as opposed to being absent or set to a
+ // Boolean value), reject the promise with a InvalidAccessError and abort.
+ if (m_request.videoConstraints.isValid && !(m_request.videoConstraints.mandatoryConstraints.isEmpty() && m_request.videoConstraints.advancedConstraints.isEmpty())) {
+ deny(MediaAccessDenialReason::InvalidAccess);
+ return;
+ }
+
+ if (m_request.audioConstraints.isValid && !(m_request.audioConstraints.mandatoryConstraints.isEmpty() && m_request.audioConstraints.advancedConstraints.isEmpty())) {
+ deny(MediaAccessDenialReason::InvalidAccess);
+ return;
+ }
+ }
+
// https://w3c.github.io/mediacapture-main/getusermedia.html#dom-mediadevices-getusermedia()
// 1. Let constraints be the method's first argument.
// 2. Let requestedMediaTypes be the set of media types in constraints with either a dictionary
@@ -171,7 +189,7 @@
// "optional" occurs in the WebIDL due to WebIDL rules, but the argument must be supplied in order
// for the call to succeed.
if (!m_request.audioConstraints.isValid && !m_request.videoConstraints.isValid) {
- deny(MediaAccessDenialReason::NoConstraints, emptyString());
+ deny(MediaAccessDenialReason::NoConstraints);
return;
}
@@ -181,7 +199,7 @@
auto& document = downcast<Document>(*m_scriptExecutionContext);
auto* controller = UserMediaController::from(document.page());
if (!controller) {
- deny(MediaAccessDenialReason::UserMediaDisabled, emptyString());
+ deny(MediaAccessDenialReason::UserMediaDisabled);
return;
}
@@ -192,7 +210,7 @@
// the value NotAllowedError.
String errorMessage;
if (!canCallGetUserMedia(document, m_request.audioConstraints.isValid, m_request.videoConstraints.isValid, errorMessage)) {
- deny(MediaAccessDenialReason::PermissionDenied, emptyString());
+ deny(MediaAccessDenialReason::PermissionDenied);
document.domWindow()->printErrorMessage(errorMessage);
return;
}
@@ -209,7 +227,7 @@
return;
if (!privateStream) {
- deny(MediaAccessDenialReason::HardwareError, emptyString());
+ deny(MediaAccessDenialReason::HardwareError);
return;
}
privateStream->monitorOrientation(downcast<Document>(m_scriptExecutionContext)->orientationNotifier());
@@ -216,7 +234,7 @@
auto stream = MediaStream::create(*m_scriptExecutionContext, privateStream.releaseNonNull());
if (stream->getTracks().isEmpty()) {
- deny(MediaAccessDenialReason::HardwareError, emptyString());
+ deny(MediaAccessDenialReason::HardwareError);
return;
}
@@ -272,6 +290,10 @@
RELEASE_LOG(MediaStream, "UserMediaRequest::deny - permission denied");
m_promise.reject(NotAllowedError);
break;
+ case MediaAccessDenialReason::InvalidAccess:
+ RELEASE_LOG(MediaStream, "UserMediaRequest::deny - invalid access");
+ m_promise.reject(InvalidAccessError);
+ break;
}
}
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (226210 => 226211)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -56,8 +56,8 @@
WEBCORE_EXPORT void setAllowedMediaDeviceUIDs(const String& audioDeviceUID, const String& videoDeviceUID);
WEBCORE_EXPORT void allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt);
- enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, OtherFailure };
- WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& invalidConstraint);
+ enum MediaAccessDenialReason { NoConstraints, UserMediaDisabled, NoCaptureDevices, InvalidConstraint, HardwareError, PermissionDenied, InvalidAccess, OtherFailure };
+ WEBCORE_EXPORT void deny(MediaAccessDenialReason, const String& invalidConstraint = emptyString());
const Vector<String>& audioDeviceUIDs() const { return m_audioDeviceUIDs; }
const Vector<String>& videoDeviceUIDs() const { return m_videoDeviceUIDs; }
Modified: trunk/Source/WebCore/page/RuntimeEnabledFeatures.h (226210 => 226211)
--- trunk/Source/WebCore/page/RuntimeEnabledFeatures.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/page/RuntimeEnabledFeatures.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -106,6 +106,8 @@
void setMediaDevicesEnabled(bool isEnabled) { m_isMediaDevicesEnabled = isEnabled; }
bool mediaStreamEnabled() const { return m_isMediaStreamEnabled; }
void setMediaStreamEnabled(bool isEnabled) { m_isMediaStreamEnabled = isEnabled; }
+ bool screenCaptureEnabled() const { return m_isScreenCaptureEnabled; }
+ void setScreenCaptureEnabled(bool isEnabled) { m_isScreenCaptureEnabled = isEnabled; }
#endif
#if ENABLE(WEB_RTC)
@@ -265,6 +267,7 @@
#if ENABLE(MEDIA_STREAM)
bool m_isMediaDevicesEnabled { false };
bool m_isMediaStreamEnabled { true };
+ bool m_isScreenCaptureEnabled { false };
#endif
#if ENABLE(WEB_RTC)
Modified: trunk/Source/WebCore/platform/mediastream/CaptureDevice.h (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/CaptureDevice.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/CaptureDevice.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -31,7 +31,7 @@
class CaptureDevice {
public:
- enum class DeviceType { Unknown, Microphone, Camera };
+ enum class DeviceType { Unknown, Microphone, Camera, Screen, Application, Window, Browser };
CaptureDevice(const String& persistentId, DeviceType type, const String& label, const String& groupId = emptyString())
: m_persistentId(persistentId)
Modified: trunk/Source/WebCore/platform/mediastream/MediaConstraints.cpp (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/MediaConstraints.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/MediaConstraints.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -242,6 +242,8 @@
case MediaConstraintType::FacingMode:
case MediaConstraintType::DeviceId:
case MediaConstraintType::GroupId:
+ case MediaConstraintType::DisplaySurface:
+ case MediaConstraintType::LogicalSurface:
case MediaConstraintType::Unknown:
ASSERT_NOT_REACHED();
break;
@@ -269,6 +271,8 @@
case MediaConstraintType::FacingMode:
case MediaConstraintType::DeviceId:
case MediaConstraintType::GroupId:
+ case MediaConstraintType::DisplaySurface:
+ case MediaConstraintType::LogicalSurface:
case MediaConstraintType::Unknown:
ASSERT_NOT_REACHED();
break;
@@ -281,6 +285,12 @@
case MediaConstraintType::EchoCancellation:
m_echoCancellation = WTFMove(constraint);
break;
+ case MediaConstraintType::DisplaySurface:
+ m_displaySurface = WTFMove(constraint);
+ break;
+ case MediaConstraintType::LogicalSurface:
+ m_logicalSurface = WTFMove(constraint);
+ break;
case MediaConstraintType::Width:
case MediaConstraintType::Height:
@@ -319,6 +329,8 @@
case MediaConstraintType::FrameRate:
case MediaConstraintType::Volume:
case MediaConstraintType::EchoCancellation:
+ case MediaConstraintType::DisplaySurface:
+ case MediaConstraintType::LogicalSurface:
case MediaConstraintType::Unknown:
ASSERT_NOT_REACHED();
break;
Modified: trunk/Source/WebCore/platform/mediastream/MediaConstraints.h (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/MediaConstraints.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/MediaConstraints.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -593,6 +593,8 @@
std::optional<DoubleConstraint> volume() const { return m_volume; }
std::optional<BooleanConstraint> echoCancellation() const { return m_echoCancellation; }
+ std::optional<BooleanConstraint> displaySurface() const { return m_displaySurface; }
+ std::optional<BooleanConstraint> logicalSurface() const { return m_logicalSurface; }
std::optional<StringConstraint> facingMode() const { return m_facingMode; }
std::optional<StringConstraint> deviceId() const { return m_deviceId; }
@@ -610,6 +612,8 @@
encoder << m_volume;
encoder << m_echoCancellation;
+ encoder << m_displaySurface;
+ encoder << m_logicalSurface;
encoder << m_facingMode;
encoder << m_deviceId;
@@ -637,6 +641,10 @@
if (!decoder.decode(map.m_echoCancellation))
return std::nullopt;
+ if (!decoder.decode(map.m_displaySurface))
+ return std::nullopt;
+ if (!decoder.decode(map.m_logicalSurface))
+ return std::nullopt;
if (!decoder.decode(map.m_facingMode))
return std::nullopt;
@@ -659,6 +667,8 @@
std::optional<DoubleConstraint> m_volume;
std::optional<BooleanConstraint> m_echoCancellation;
+ std::optional<BooleanConstraint> m_displaySurface;
+ std::optional<BooleanConstraint> m_logicalSurface;
std::optional<StringConstraint> m_facingMode;
std::optional<StringConstraint> m_deviceId;
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamRequest.h (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamRequest.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamRequest.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -34,7 +34,7 @@
namespace WebCore {
struct MediaStreamRequest {
- enum class Type { UserMedia };
+ enum class Type { UserMedia, DisplayMedia };
Type type;
MediaConstraints audioConstraints;
MediaConstraints videoConstraints;
@@ -64,7 +64,7 @@
namespace WebCore {
struct MediaStreamRequest {
- enum class Type { UserMedia };
+ enum class Type { UserMedia, DisplayMedia };
Type type;
};
@@ -77,7 +77,8 @@
template<> struct EnumTraits<WebCore::MediaStreamRequest> {
using values = EnumValues<
WebCore::MediaStreamRequest::Type,
- WebCore::MediaStreamRequest::Type::UserMedia
+ WebCore::MediaStreamRequest::Type::UserMedia,
+ WebCore::MediaStreamRequest::Type::DisplayMedia
>;
};
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -361,10 +361,9 @@
break;
}
- case MediaConstraintType::DeviceId: {
+ case MediaConstraintType::DeviceId:
ASSERT_NOT_REACHED();
break;
- }
case MediaConstraintType::GroupId: {
ASSERT(constraint.isString());
@@ -375,6 +374,10 @@
break;
}
+ case MediaConstraintType::DisplaySurface:
+ case MediaConstraintType::LogicalSurface:
+ break;
+
case MediaConstraintType::Unknown:
// Unknown (or unsupported) constraints should be ignored.
break;
@@ -514,6 +517,11 @@
// There is nothing to do here, neither can be changed.
break;
+ case MediaConstraintType::DisplaySurface:
+ case MediaConstraintType::LogicalSurface:
+ ASSERT(constraint.isBoolean());
+ break;
+
case MediaConstraintType::Unknown:
break;
}
@@ -705,6 +713,15 @@
return capabilities.supportsDeviceId();
break;
+ case MediaConstraintType::DisplaySurface:
+ case MediaConstraintType::LogicalSurface:
+ // https://www.w3.org/TR/screen-capture/#new-constraints-for-captured-display-surfaces
+ // 5.2.1 New Constraints for Captured Display Surfaces
+ // Since the source of media cannot be changed after a MediaStreamTrack has been returned,
+ // these constraints cannot be changed by an application.
+ return false;
+ break;
+
case MediaConstraintType::Unknown:
// Unknown (or unsupported) constraints should be ignored.
break;
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceCenter.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -262,6 +262,14 @@
audioDeviceInfo.append({sourceOrError.captureSource->fitnessScore(), device});
}
break;
+ case CaptureDevice::DeviceType::Screen:
+ case CaptureDevice::DeviceType::Application:
+ case CaptureDevice::DeviceType::Window:
+ case CaptureDevice::DeviceType::Browser:
+ ASSERT(request.type == MediaStreamRequest::Type::DisplayMedia);
+ ASSERT(request.videoConstraints.mandatoryConstraints.isEmpty());
+ ASSERT(request.videoConstraints.advancedConstraints.isEmpty());
+ break;
case CaptureDevice::DeviceType::Unknown:
ASSERT_NOT_REACHED();
break;
@@ -309,6 +317,10 @@
case CaptureDevice::DeviceType::Microphone:
return audioCaptureDeviceManager().captureDeviceWithPersistentID(type, id);
break;
+ case CaptureDevice::DeviceType::Screen:
+ case CaptureDevice::DeviceType::Application:
+ case CaptureDevice::DeviceType::Window:
+ case CaptureDevice::DeviceType::Browser:
case CaptureDevice::DeviceType::Unknown:
ASSERT_NOT_REACHED();
break;
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSettings.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -89,6 +89,14 @@
const AtomicString& groupId() const { return m_groupId; }
void setGroupId(const AtomicString& groupId) { m_groupId = groupId; }
+ bool supportsDisplaySurface() const { return m_supportedConstraints.supportsDisplaySurface(); }
+ const AtomicString& displaySurface() const { return m_displaySurface; }
+ void setDisplaySurface(const AtomicString& displaySurface) { m_displaySurface = displaySurface; }
+
+ bool supportsLogicalSurface() const { return m_supportedConstraints.supportsLogicalSurface(); }
+ bool logicalSurface() const { return m_logicalSurface; }
+ void setLogicalSurface(bool logicalSurface) { m_logicalSurface = logicalSurface; }
+
const RealtimeMediaSourceSupportedConstraints& supportedConstraints() const { return m_supportedConstraints; }
void setSupportedConstraints(const RealtimeMediaSourceSupportedConstraints& supportedConstraints) { m_supportedConstraints = supportedConstraints; }
@@ -113,6 +121,9 @@
AtomicString m_groupId;
AtomicString m_label;
+ AtomicString m_displaySurface;
+ bool m_logicalSurface { 0 };
+
RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
};
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSupportedConstraints.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -61,6 +61,10 @@
return supportsDeviceId();
case MediaConstraintType::GroupId:
return supportsGroupId();
+ case MediaConstraintType::DisplaySurface:
+ return supportsDisplaySurface();
+ case MediaConstraintType::LogicalSurface:
+ return supportsLogicalSurface();
}
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSupportedConstraints.h (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSupportedConstraints.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSourceSupportedConstraints.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -49,7 +49,9 @@
SampleSize,
EchoCancellation,
DeviceId,
- GroupId
+ GroupId,
+ DisplaySurface,
+ LogicalSurface,
};
class RealtimeMediaSourceSupportedConstraints {
@@ -91,6 +93,12 @@
bool supportsGroupId() const { return m_supportsGroupId; }
void setSupportsGroupId(bool value) { m_supportsGroupId = value; }
+ bool supportsDisplaySurface() const { return m_supportsDisplaySurface; }
+ void setSupportsDisplaySurface(bool value) { m_supportsDisplaySurface = value; }
+
+ bool supportsLogicalSurface() const { return m_supportsLogicalSurface; }
+ void setSupportsLogicalSurface(bool value) { m_supportsLogicalSurface = value; }
+
bool supportsConstraint(MediaConstraintType) const;
template<class Encoder> void encode(Encoder&) const;
@@ -108,6 +116,8 @@
bool m_supportsEchoCancellation { false };
bool m_supportsDeviceId { false };
bool m_supportsGroupId { false };
+ bool m_supportsDisplaySurface { false };
+ bool m_supportsLogicalSurface { false };
};
template<class Encoder>
@@ -123,7 +133,9 @@
<< m_supportsSampleSize
<< m_supportsEchoCancellation
<< m_supportsDeviceId
- << m_supportsGroupId;
+ << m_supportsGroupId
+ << m_supportsDisplaySurface
+ << m_supportsLogicalSurface;
}
template<class Decoder>
@@ -139,7 +151,9 @@
&& decoder.decode(constraints.m_supportsSampleSize)
&& decoder.decode(constraints.m_supportsEchoCancellation)
&& decoder.decode(constraints.m_supportsDeviceId)
- && decoder.decode(constraints.m_supportsGroupId);
+ && decoder.decode(constraints.m_supportsGroupId)
+ && decoder.decode(constraints.m_supportsDisplaySurface)
+ && decoder.decode(constraints.m_supportsLogicalSurface);
}
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp (226210 => 226211)
--- trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mediastream/mac/RealtimeMediaSourceCenterMac.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -53,8 +53,13 @@
case CaptureDevice::DeviceType::Camera:
return AVVideoCaptureSource::create(device.persistentId(), constraints);
break;
+
case CaptureDevice::DeviceType::Microphone:
- case CaptureDevice::DeviceType::Unknown:
+ case CaptureDevice::DeviceType::Screen:
+ case CaptureDevice::DeviceType::Application:
+ case CaptureDevice::DeviceType::Window:
+ case CaptureDevice::DeviceType::Browser:
+ case CaptureDevice::DeviceType::Unknown:
ASSERT_NOT_REACHED();
break;
}
Modified: trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp (226210 => 226211)
--- trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/platform/mock/MockRealtimeVideoSource.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -60,6 +60,11 @@
case CaptureDevice::DeviceType::Camera:
return MockRealtimeVideoSource::create(device.persistentId(), device.label(), constraints);
break;
+
+ case CaptureDevice::DeviceType::Screen:
+ case CaptureDevice::DeviceType::Application:
+ case CaptureDevice::DeviceType::Window:
+ case CaptureDevice::DeviceType::Browser:
case CaptureDevice::DeviceType::Microphone:
case CaptureDevice::DeviceType::Unknown:
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebCore/testing/InternalSettings.cpp (226210 => 226211)
--- trunk/Source/WebCore/testing/InternalSettings.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/testing/InternalSettings.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -112,6 +112,9 @@
, m_webGPUEnabled(RuntimeEnabledFeatures::sharedFeatures().webGPUEnabled())
#endif
, m_webVREnabled(RuntimeEnabledFeatures::sharedFeatures().webVREnabled())
+#if ENABLE(MEDIA_STREAM)
+ , m_setScreenCaptureEnabled(RuntimeEnabledFeatures::sharedFeatures().screenCaptureEnabled())
+#endif
, m_shouldMockBoldSystemFontForAccessibility(RenderTheme::singleton().shouldMockBoldSystemFontForAccessibility())
#if USE(AUDIO_SESSION)
, m_shouldManageAudioSessionCategory(DeprecatedGlobalSettings::shouldManageAudioSessionCategory())
@@ -210,6 +213,9 @@
RuntimeEnabledFeatures::sharedFeatures().setWebGPUEnabled(m_webGPUEnabled);
#endif
RuntimeEnabledFeatures::sharedFeatures().setWebVREnabled(m_webVREnabled);
+#if ENABLE(MEDIA_STREAM)
+ RuntimeEnabledFeatures::sharedFeatures().setScreenCaptureEnabled(m_setScreenCaptureEnabled);
+#endif
#if USE(AUDIO_SESSION)
DeprecatedGlobalSettings::setShouldManageAudioSessionCategory(m_shouldManageAudioSessionCategory);
@@ -762,6 +768,15 @@
RuntimeEnabledFeatures::sharedFeatures().setWebVREnabled(enabled);
}
+void InternalSettings::setScreenCaptureEnabled(bool enabled)
+{
+#if ENABLE(MEDIA_STREAM)
+ RuntimeEnabledFeatures::sharedFeatures().setScreenCaptureEnabled(enabled);
+#else
+ UNUSED_PARAM(enabled);
+#endif
+}
+
ExceptionOr<String> InternalSettings::userInterfaceDirectionPolicy()
{
if (!m_page)
Modified: trunk/Source/WebCore/testing/InternalSettings.h (226210 => 226211)
--- trunk/Source/WebCore/testing/InternalSettings.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/testing/InternalSettings.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -123,6 +123,7 @@
static void setWebGL2Enabled(bool);
static void setWebGPUEnabled(bool);
static void setWebVREnabled(bool);
+ static void setScreenCaptureEnabled(bool);
private:
explicit InternalSettings(Page*);
@@ -203,6 +204,7 @@
bool m_webGL2Enabled;
bool m_webGPUEnabled;
bool m_webVREnabled;
+ bool m_setScreenCaptureEnabled;
bool m_shouldMockBoldSystemFontForAccessibility;
#if USE(AUDIO_SESSION)
Modified: trunk/Source/WebCore/testing/InternalSettings.idl (226210 => 226211)
--- trunk/Source/WebCore/testing/InternalSettings.idl 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebCore/testing/InternalSettings.idl 2017-12-21 02:45:36 UTC (rev 226211)
@@ -92,6 +92,7 @@
void setWebGL2Enabled(boolean enabled);
void setWebGPUEnabled(boolean enabled);
void setWebVREnabled(boolean enabled);
+ void setScreenCaptureEnabled(boolean enabled);
[MayThrowException] DOMString userInterfaceDirectionPolicy();
[MayThrowException] void setUserInterfaceDirectionPolicy(DOMString policy);
Modified: trunk/Source/WebKit/ChangeLog (226210 => 226211)
--- trunk/Source/WebKit/ChangeLog 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebKit/ChangeLog 2017-12-21 02:45:36 UTC (rev 226211)
@@ -1,3 +1,19 @@
+2017-12-20 Eric Carlson <eric.carl...@apple.com>
+
+ [MediaStream] Add screen capture IDL and stub functions
+ https://bugs.webkit.org/show_bug.cgi?id=181070
+ <rdar://problem/35555184>
+
+ Reviewed by Youenn Fablet.
+
+ * Shared/WebPreferences.yaml:
+ * UIProcess/API/Cocoa/WKPreferences.mm:
+ (-[WKPreferences _screenCaptureEnabled]):
+ (-[WKPreferences _setScreenCaptureEnabled:]):
+ * UIProcess/API/Cocoa/WKPreferencesPrivate.h:
+ * WebProcess/InjectedBundle/InjectedBundle.cpp:
+ (WebKit::InjectedBundle::overrideBoolPreferenceForTestRunner):
+
2017-12-20 Youenn Fablet <you...@apple.com>
Crash when clearing std::optional<WebKit::WebServiceWorkerFetchTaskClient::BlobLoader>
Modified: trunk/Source/WebKit/Shared/WebPreferences.yaml (226210 => 226211)
--- trunk/Source/WebKit/Shared/WebPreferences.yaml 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebKit/Shared/WebPreferences.yaml 2017-12-21 02:45:36 UTC (rev 226211)
@@ -486,6 +486,12 @@
webcoreBinding: RuntimeEnabledFeatures
condition: ENABLE(MEDIA_STREAM)
+ScreenCaptureEnabled:
+ type: bool
+ defaultValue: false
+ webcoreBinding: RuntimeEnabledFeatures
+ condition: ENABLE(MEDIA_STREAM)
+
PeerConnectionEnabled:
type: bool
defaultValue: WebCore::LibWebRTCProvider::webRTCAvailable()
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm (226210 => 226211)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferences.mm 2017-12-21 02:45:36 UTC (rev 226211)
@@ -582,6 +582,16 @@
_preferences->setMediaDevicesEnabled(enabled);
}
+- (BOOL)_screenCaptureEnabled
+{
+ return _preferences->screenCaptureEnabled();
+}
+
+- (void)_setScreenCaptureEnabled:(BOOL)enabled
+{
+ _preferences->setScreenCaptureEnabled(enabled);
+}
+
- (BOOL)_mockCaptureDevicesEnabled
{
return _preferences->mockCaptureDevicesEnabled();
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h (226210 => 226211)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKPreferencesPrivate.h 2017-12-21 02:45:36 UTC (rev 226211)
@@ -104,6 +104,7 @@
@property (nonatomic, setter=_setPeerConnectionEnabled:) BOOL _peerConnectionEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, setter=_setMediaDevicesEnabled:) BOOL _mediaDevicesEnabled WK_API_AVAILABLE(macosx(10.13), ios(11.0));
+@property (nonatomic, setter=_setScreenCaptureEnabled:) BOOL _screenCaptureEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_MAC_TBA));
@property (nonatomic, setter=_setMockCaptureDevicesEnabled:) BOOL _mockCaptureDevicesEnabled WK_API_AVAILABLE(macosx(10.13), ios(11.0));
@property (nonatomic, setter=_setMockCaptureDevicesPromptEnabled:) BOOL _mockCaptureDevicesPromptEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, setter=_setMediaCaptureRequiresSecureConnection:) BOOL _mediaCaptureRequiresSecureConnection WK_API_AVAILABLE(macosx(10.13), ios(11.0));
Modified: trunk/Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp (226210 => 226211)
--- trunk/Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp 2017-12-21 02:38:00 UTC (rev 226210)
+++ trunk/Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp 2017-12-21 02:45:36 UTC (rev 226211)
@@ -224,6 +224,8 @@
#if ENABLE(MEDIA_STREAM)
if (preference == "WebKitMediaDevicesEnabled")
RuntimeEnabledFeatures::sharedFeatures().setMediaDevicesEnabled(enabled);
+ if (preference == "WebKitScreenCaptureEnabled")
+ RuntimeEnabledFeatures::sharedFeatures().setScreenCaptureEnabled(enabled);
#endif
#if ENABLE(WEB_RTC)