Diff
Modified: trunk/LayoutTests/ChangeLog (215702 => 215703)
--- trunk/LayoutTests/ChangeLog 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/LayoutTests/ChangeLog 2017-04-25 00:02:29 UTC (rev 215703)
@@ -1,3 +1,13 @@
+2017-04-24 Youenn Fablet <you...@apple.com>
+
+ Set defaults video getUserMedia constraints
+ https://bugs.webkit.org/show_bug.cgi?id=171127
+
+ Reviewed by Eric Carlson.
+
+ * fast/mediastream/getUserMedia-default-expected.txt: Added.
+ * fast/mediastream/getUserMedia-default.html: Added.
+
2017-04-24 Chris Dumez <cdu...@apple.com>
createElementNS() should now throw only InvalidCharacterError, not NamespaceError
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-default-expected.txt (0 => 215703)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-default-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-default-expected.txt 2017-04-25 00:02:29 UTC (rev 215703)
@@ -0,0 +1,7 @@
+
+PASS Checking default video tracks settings
+PASS Checking only audio capture
+PASS Checking default video tracks settings except width and height
+FAIL Checking default video tracks settings except height assert_equals: frame height expected 240 but got 480
+PASS Checking default video tracks settings except frameRate
+
Added: trunk/LayoutTests/fast/mediastream/getUserMedia-default.html (0 => 215703)
--- trunk/LayoutTests/fast/mediastream/getUserMedia-default.html (rev 0)
+++ trunk/LayoutTests/fast/mediastream/getUserMedia-default.html 2017-04-25 00:02:29 UTC (rev 215703)
@@ -0,0 +1,56 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Testing getUserMedia default behavior</title>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <script>
+if (window.testRunner)
+ testRunner.setUserMediaPermission(true);
+
+var finishTest, errorTest;
+promise_test((test) => {
+ return navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then((stream) => {
+ let settings = stream.getVideoTracks()[0].getSettings();
+ assert_equals(settings.frameRate, 30, "frame rate");
+ assert_equals(settings.width, settings.height == 640 ? 480 : 640, "frame width");
+ assert_equals(settings.height, settings.width = 640 ? 480 : 640, "frame height");
+ });
+}, "Checking default video tracks settings");
+
+promise_test((test) => {
+ return navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then((stream) => {
+ assert_equals(stream.getVideoTracks().length, 0);
+ });
+}, "Checking only audio capture");
+
+promise_test((test) => {
+ return navigator.mediaDevices.getUserMedia({ audio: true, video: { width: 320, height: 240 } }).then((stream) => {
+ let settings = stream.getVideoTracks()[0].getSettings();
+ assert_equals(settings.frameRate, 30, "frame rate");
+ assert_equals(settings.height, 240, "frame height");
+ });
+}, "Checking default video tracks settings except width and height");
+
+promise_test((test) => {
+ return navigator.mediaDevices.getUserMedia({ audio: true, video: { height: 240 } }).then((stream) => {
+ let settings = stream.getVideoTracks()[0].getSettings();
+ assert_equals(settings.frameRate, 30, "frame rate");
+ assert_equals(settings.height, 240, "frame height");
+ });
+}, "Checking default video tracks settings except height");
+
+promise_test((test) => {
+ return navigator.mediaDevices.getUserMedia({ audio: true, video: { frameRate: {ideal: 60 } } }).then((stream) => {
+ let settings = stream.getVideoTracks()[0].getSettings();
+ assert_equals(settings.frameRate, 60, "frame rate");
+ assert_equals(settings.width, settings.height == 640 ? 480 : 640, "frame width");
+ assert_equals(settings.height, settings.width = 640 ? 480 : 640, "frame height");
+ });
+}, "Checking default video tracks settings except frameRate");
+ </script>
+ </body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (215702 => 215703)
--- trunk/Source/WebCore/ChangeLog 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/ChangeLog 2017-04-25 00:02:29 UTC (rev 215703)
@@ -1,3 +1,27 @@
+2017-04-24 Youenn Fablet <you...@apple.com>
+
+ Set defaults video getUserMedia constraints
+ https://bugs.webkit.org/show_bug.cgi?id=171127
+
+ Reviewed by Eric Carlson.
+
+ Test: fast/mediastream/getUserMedia-default.html
+
+ Adding default optional constraints for video size and frame rate if none is defined.
+ Default is 640x480 30fps.
+
+ Doing some refactoring in MeddiaConstraintsImpl and MeddiaConstraintsData to use more move constructors.
+
+ * Modules/mediastream/MediaConstraintsImpl.cpp:
+ (WebCore::defaultVideoConstraints):
+ (WebCore::MediaConstraintsData::setDefaultVideoConstraints):
+ (WebCore::MediaConstraintsImpl::create): Deleted.
+ * Modules/mediastream/MediaConstraintsImpl.h:
+ * Modules/mediastream/MediaDevices.cpp:
+ (WebCore::MediaDevices::getUserMedia):
+ * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm:
+ (WebCore::MockRealtimeVideoSourceMac::updateSampleBuffer): Fixing crash when setting frameRate.
+
2017-04-24 Chris Dumez <cdu...@apple.com>
createElementNS() should now throw only InvalidCharacterError, not NamespaceError
Modified: trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp (215702 => 215703)
--- trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.cpp 2017-04-25 00:02:29 UTC (rev 215703)
@@ -37,16 +37,62 @@
namespace WebCore {
-Ref<MediaConstraintsImpl> MediaConstraintsImpl::create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid)
+static inline void addDefaultVideoConstraints(MediaTrackConstraintSetMap& videoConstraints, bool addFrameRateConstraint, bool addSizeConstraint, bool addFacingModeConstraint)
{
- return adoptRef(*new MediaConstraintsImpl(WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid));
+ if (addFrameRateConstraint) {
+ DoubleConstraint frameRateConstraint({ }, MediaConstraintType::FrameRate);
+ frameRateConstraint.setIdeal(30);
+ videoConstraints.set(MediaConstraintType::FrameRate, WTFMove(frameRateConstraint));
+ }
+ if (addSizeConstraint) {
+ IntConstraint widthConstraint({ }, MediaConstraintType::Width);
+ widthConstraint.setIdeal(640);
+ videoConstraints.set(MediaConstraintType::Width, WTFMove(widthConstraint));
+
+ IntConstraint heightConstraint({ }, MediaConstraintType::Height);
+ heightConstraint.setIdeal(480);
+ videoConstraints.set(MediaConstraintType::Height, WTFMove(heightConstraint));
+ }
+ if (addFacingModeConstraint) {
+ StringConstraint facingModeConstraint({ }, MediaConstraintType::FacingMode);
+ facingModeConstraint.setIdeal(ASCIILiteral("user"));
+ videoConstraints.set(MediaConstraintType::FacingMode, WTFMove(facingModeConstraint));
+ }
}
-Ref<MediaConstraintsImpl> MediaConstraintsImpl::create(const MediaConstraintsData& data)
+bool MediaConstraintsData::isConstraintSet(std::function<bool(const MediaTrackConstraintSetMap&)>&& callback)
{
- return adoptRef(*new MediaConstraintsImpl(data));
+ if (callback(mandatoryConstraints))
+ return true;
+
+ for (const auto& constraint : advancedConstraints) {
+ if (callback(constraint))
+ return true;
+ }
+ return false;
}
+void MediaConstraintsData::setDefaultVideoConstraints()
+{
+ // 640x480, 30fps, font-facing camera
+ bool hasFrameRateConstraints = isConstraintSet([](const MediaTrackConstraintSetMap& constraint) {
+ return !!constraint.frameRate();
+ });
+
+ bool hasSizeConstraints = isConstraintSet([](const MediaTrackConstraintSetMap& constraint) {
+ return !!constraint.width() || !!constraint.height();
+ });
+
+ bool hasFacingModeConstraints = isConstraintSet([](const MediaTrackConstraintSetMap& constraint) {
+ return !!constraint.facingMode();
+ });
+
+ if (hasFrameRateConstraints && hasSizeConstraints && hasFacingModeConstraints)
+ return;
+
+ addDefaultVideoConstraints(mandatoryConstraints, !hasFrameRateConstraints, !hasSizeConstraints, !hasFacingModeConstraints);
+}
+
} // namespace WebCore
#endif // ENABLE(MEDIA_STREAM)
Modified: trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h (215702 => 215703)
--- trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/Modules/mediastream/MediaConstraintsImpl.h 2017-04-25 00:02:29 UTC (rev 215703)
@@ -47,6 +47,9 @@
{
}
+ void setDefaultVideoConstraints();
+ bool isConstraintSet(std::function<bool(const MediaTrackConstraintSetMap&)>&&);
+
MediaTrackConstraintSetMap mandatoryConstraints;
Vector<MediaTrackConstraintSetMap> advancedConstraints;
bool isValid { false };
@@ -54,8 +57,8 @@
class MediaConstraintsImpl final : public MediaConstraints {
public:
- static Ref<MediaConstraintsImpl> create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid);
- WEBCORE_EXPORT static Ref<MediaConstraintsImpl> create(const MediaConstraintsData&);
+ static Ref<MediaConstraintsImpl> create(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid) { return create(MediaConstraintsData(WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid)); }
+ static Ref<MediaConstraintsImpl> create(MediaConstraintsData&& data) { return adoptRef(*new MediaConstraintsImpl(WTFMove(data))); }
MediaConstraintsImpl() = default;
virtual ~MediaConstraintsImpl() = default;
@@ -65,15 +68,10 @@
bool isValid() const final { return m_data.isValid; }
const MediaConstraintsData& data() const { return m_data; }
+ void setDefaultVideoConstraints() { m_data.setDefaultVideoConstraints(); }
+
private:
- MediaConstraintsImpl(MediaTrackConstraintSetMap&& mandatoryConstraints, Vector<MediaTrackConstraintSetMap>&& advancedConstraints, bool isValid)
- : m_data({ WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), isValid })
- {
- }
- explicit MediaConstraintsImpl(const MediaConstraintsData& data)
- : m_data(data)
- {
- }
+ WEBCORE_EXPORT explicit MediaConstraintsImpl(MediaConstraintsData&& data) : m_data(WTFMove(data)) { }
MediaConstraintsData m_data;
};
Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp (215702 => 215703)
--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp 2017-04-25 00:02:29 UTC (rev 215703)
@@ -74,7 +74,12 @@
auto* document = this->document();
if (!document)
return Exception { INVALID_STATE_ERR };
- return UserMediaRequest::start(*document, createMediaConstraintsImpl(constraints.audio), createMediaConstraintsImpl(constraints.video), WTFMove(promise));
+
+ auto audioConstraints = createMediaConstraintsImpl(constraints.audio);
+ auto videoConstraints = createMediaConstraintsImpl(constraints.video);
+ if (videoConstraints->isValid())
+ videoConstraints->setDefaultVideoConstraints();
+ return UserMediaRequest::start(*document, WTFMove(audioConstraints), WTFMove(videoConstraints), WTFMove(promise));
}
void MediaDevices::enumerateDevices(EnumerateDevicesPromise&& promise) const
Modified: trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm (215702 => 215703)
--- trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm 2017-04-25 00:02:29 UTC (rev 215703)
@@ -143,7 +143,11 @@
void MockRealtimeVideoSourceMac::updateSampleBuffer()
{
- auto pixelBuffer = pixelBufferFromCGImage(imageBuffer()->copyImage()->nativeImage().get());
+ auto imageBuffer = this->imageBuffer();
+ if (!imageBuffer)
+ return;
+
+ auto pixelBuffer = pixelBufferFromCGImage(imageBuffer->copyImage()->nativeImage().get());
auto sampleBuffer = CMSampleBufferFromPixelBuffer(pixelBuffer.get());
videoSampleAvailable(MediaSampleAVFObjC::create(sampleBuffer.get()));
Modified: trunk/Source/WebKit2/ChangeLog (215702 => 215703)
--- trunk/Source/WebKit2/ChangeLog 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebKit2/ChangeLog 2017-04-25 00:02:29 UTC (rev 215703)
@@ -1,3 +1,17 @@
+2017-04-24 Youenn Fablet <you...@apple.com>
+
+ Set defaults video getUserMedia constraints
+ https://bugs.webkit.org/show_bug.cgi?id=171127
+
+ Reviewed by Eric Carlson.
+
+ Updated to cope with MediaStreamConstraintsImpl refactoring.
+
+ * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+ (WebKit::UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints):
+ * UIProcess/UserMediaPermissionRequestManagerProxy.cpp:
+ (WebKit::UserMediaPermissionRequestManagerProxy::requestUserMediaPermissionForFrame):
+
2017-04-24 Chris Dumez <cdu...@apple.com>
Allow tabs with capturing audio or video to exceed background CPU limit
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (215702 => 215703)
--- trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp 2017-04-25 00:02:29 UTC (rev 215703)
@@ -127,7 +127,7 @@
void UserMediaCaptureManagerProxy::createMediaSourceForCaptureDeviceWithConstraints(uint64_t id, const String& deviceID, WebCore::CaptureDevice::DeviceType type, const MediaConstraintsData& constraintsData, bool& succeeded, String& invalidConstraints)
{
- auto constraints = MediaConstraintsImpl::create(constraintsData);
+ auto constraints = MediaConstraintsImpl::create(MediaConstraintsData(constraintsData));
auto source = RealtimeMediaSourceCenter::singleton().audioFactory()->createMediaSourceForCaptureDeviceWithConstraints(deviceID, type, constraints.ptr(), invalidConstraints);
succeeded = !!source;
Modified: trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp (215702 => 215703)
--- trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2017-04-24 23:44:58 UTC (rev 215702)
+++ trunk/Source/WebKit2/UIProcess/UserMediaPermissionRequestManagerProxy.cpp 2017-04-25 00:02:29 UTC (rev 215703)
@@ -269,11 +269,11 @@
if (!m_page.uiClient().decidePolicyForUserMediaPermissionRequest(m_page, *m_page.process().webFrame(frameID), *userMediaOrigin.get(), *topLevelOrigin.get(), request.get()))
userMediaAccessWasDenied(userMediaID, UserMediaPermissionRequestProxy::UserMediaAccessDenialReason::UserMediaDisabled);
-
+
};
- auto audioConstraints = MediaConstraintsImpl::create(audioConstraintsData);
- auto videoConstraints = MediaConstraintsImpl::create(videoConstraintsData);
+ auto audioConstraints = MediaConstraintsImpl::create(MediaConstraintsData(audioConstraintsData));
+ auto videoConstraints = MediaConstraintsImpl::create(MediaConstraintsData(videoConstraintsData));
syncWithWebCorePrefs();
RealtimeMediaSourceCenter::singleton().validateRequestConstraints(validHandler, invalidHandler, audioConstraints, videoConstraints);