WebRTC: Navigator.webkitGetUserMedia() requires three arguments
authoradam.bergkvist@ericsson.com <adam.bergkvist@ericsson.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 22 Jun 2015 08:36:38 +0000 (08:36 +0000)
committeradam.bergkvist@ericsson.com <adam.bergkvist@ericsson.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 22 Jun 2015 08:36:38 +0000 (08:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=146022

Reviewed by Eric Carlson.

Source/WebCore:

Updated custom binding to make the third error callback argument
mandatory. Updated and unskipped three tests (for the GTK+ port).

* bindings/js/JSNavigatorCustom.cpp:
(WebCore::JSNavigator::webkitGetUserMedia):

LayoutTests:

Updated and unskipped three existing tests.

* fast/mediastream/argument-types-expected.txt:
* fast/mediastream/getusermedia-expected.txt:
* fast/mediastream/getusermedia.html:
* fast/mediastream/script-tests/argument-types.js:
* platform/gtk/TestExpectations:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@185820 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/mediastream/argument-types-expected.txt
LayoutTests/fast/mediastream/getusermedia-expected.txt
LayoutTests/fast/mediastream/getusermedia.html
LayoutTests/fast/mediastream/script-tests/argument-types.js
LayoutTests/platform/gtk/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSNavigatorCustom.cpp

index 7f2a6b2..fb4b8c8 100644 (file)
@@ -1,3 +1,18 @@
+2015-06-22  Adam Bergkvist  <adam.bergkvist@ericsson.com>
+
+        WebRTC: Navigator.webkitGetUserMedia() requires three arguments
+        https://bugs.webkit.org/show_bug.cgi?id=146022
+
+        Reviewed by Eric Carlson.
+
+        Updated and unskipped three existing tests.
+
+        * fast/mediastream/argument-types-expected.txt:
+        * fast/mediastream/getusermedia-expected.txt:
+        * fast/mediastream/getusermedia.html:
+        * fast/mediastream/script-tests/argument-types.js:
+        * platform/gtk/TestExpectations:
+
 2015-06-21  David Kilzer  <ddkilzer@apple.com>
 
         fast/canvas/webgl/tex-image-and-sub-image-2d-with-video.html is slow on Mavericks WK1 Debug builds
index 0b94be6..4224d40 100644 (file)
@@ -13,30 +13,30 @@ PASS navigator.webkitGetUserMedia(42) threw exception TypeError: Not enough argu
 PASS navigator.webkitGetUserMedia(Infinity) threw exception TypeError: Not enough arguments.
 PASS navigator.webkitGetUserMedia(-Infinity) threw exception TypeError: Not enough arguments.
 PASS navigator.webkitGetUserMedia(emptyFunction) threw exception TypeError: Not enough arguments.
-PASS navigator.webkitGetUserMedia({video: true}, emptyFunction) did not throw exception.
-PASS navigator.webkitGetUserMedia(undefined, emptyFunction) threw exception TypeError: First argument of webkitGetUserMedia must be a valid Dictionary.
-PASS navigator.webkitGetUserMedia(null, emptyFunction) threw exception TypeError: First argument of webkitGetUserMedia must be a valid Dictionary.
-PASS navigator.webkitGetUserMedia({ }, emptyFunction) threw exception Error: NotSupportedError: DOM Exception 9.
-PASS navigator.webkitGetUserMedia(true, emptyFunction) threw exception TypeError: First argument of webkitGetUserMedia must be a valid Dictionary.
-PASS navigator.webkitGetUserMedia(42, emptyFunction) threw exception TypeError: First argument of webkitGetUserMedia must be a valid Dictionary.
-PASS navigator.webkitGetUserMedia(Infinity, emptyFunction) threw exception TypeError: First argument of webkitGetUserMedia must be a valid Dictionary.
-PASS navigator.webkitGetUserMedia(-Infinity, emptyFunction) threw exception TypeError: First argument of webkitGetUserMedia must be a valid Dictionary.
-PASS navigator.webkitGetUserMedia(emptyFunction, emptyFunction) threw exception Error: NotSupportedError: DOM Exception 9.
-PASS navigator.webkitGetUserMedia({video: true}, "foobar") threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, undefined) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, null) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, {}) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, true) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, 42) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, Infinity) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, -Infinity) threw exception TypeError: Argument 2 ('successCallback') to Navigator.webkitGetUserMedia must be a function.
+PASS navigator.webkitGetUserMedia({video: true}, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(undefined, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(null, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({ }, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(true, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(42, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(Infinity, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(-Infinity, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia(emptyFunction, emptyFunction) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, "foobar") threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, undefined) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, null) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, {}) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, true) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, 42) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, Infinity) threw exception TypeError: Not enough arguments.
+PASS navigator.webkitGetUserMedia({video: true}, -Infinity) threw exception TypeError: Not enough arguments.
 PASS navigator.webkitGetUserMedia({ }, emptyFunction, emptyFunction) threw exception Error: NotSupportedError: DOM Exception 9.
 PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, emptyFunction) did not throw exception.
-PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, undefined) did not throw exception.
-PASS navigator.webkitGetUserMedia({audio:true, video:true}, emptyFunction, undefined) did not throw exception.
-PASS navigator.webkitGetUserMedia({audio:true}, emptyFunction, undefined) did not throw exception.
+PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, undefined) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
+PASS navigator.webkitGetUserMedia({audio:true, video:true}, emptyFunction, undefined) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
+PASS navigator.webkitGetUserMedia({audio:true}, emptyFunction, undefined) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, "video") threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
-PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, null) did not throw exception.
+PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, null) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, {}) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, true) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({video: true}, emptyFunction, 42) threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
index a6856f2..dca5fb9 100644 (file)
@@ -4,26 +4,32 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 PASS navigator.webkitGetUserMedia({audio:false, video:false}, error, error); threw exception Error: NotSupportedError: DOM Exception 9.
+PASS navigator.webkitGetUserMedia({audio:false, video:false}, error, null); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({audio:true}, gotStream1, error); did not throw exception.
 PASS Stream generated.
 PASS stream.getAudioTracks().length is 1
 PASS stream.getVideoTracks().length is 0
+PASS navigator.webkitGetUserMedia({video:true}, gotStream2, null); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({video:true}, gotStream2, error); did not throw exception.
 PASS Stream generated.
 PASS stream.getAudioTracks().length is 0
 PASS stream.getVideoTracks().length is 1
+PASS navigator.webkitGetUserMedia({audio:true, video:true}, gotStream3, null); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({audio:true, video:true}, gotStream3, error); did not throw exception.
 PASS Stream generated.
 PASS stream.getAudioTracks().length is 1
 PASS stream.getVideoTracks().length is 1
+PASS navigator.webkitGetUserMedia({audio:{mandatory:{}, optional:[]}, video:true}, gotStream4, null); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({audio:{mandatory:{}, optional:[]}, video:true}, gotStream4, error); did not throw exception.
 PASS Stream generated.
 PASS stream.getAudioTracks().length is 1
 PASS stream.getVideoTracks().length is 1
+PASS navigator.webkitGetUserMedia({audio:{mandatory:{'valid_but_unsupported_1':0}, optional:[]}, video:true}, gotStreamInError, null); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({audio:{mandatory:{'valid_but_unsupported_1':0}, optional:[]}, video:true}, gotStreamInError, error1); did not throw exception.
 PASS Error callback called.
 PASS errorArg.name is "ConstraintNotSatisfiedError"
 PASS errorArg.constraintName is "valid_but_unsupported_1"
+PASS navigator.webkitGetUserMedia({audio:{mandatory:{'valid_and_supported_1':1}, optional:[{'valid_but_unsupported_1':0}]}, video:true}, gotStream5, 0); threw exception TypeError: Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function.
 PASS navigator.webkitGetUserMedia({audio:{mandatory:{'valid_and_supported_1':1}, optional:[{'valid_but_unsupported_1':0}]}, video:true}, gotStream5, error); did not throw exception.
 PASS Stream generated.
 PASS stream.getAudioTracks().length is 1
index c817e99..13fae13 100644 (file)
@@ -9,6 +9,13 @@
         <script>
             description("Tests webkitGetUserMedia.");
 
+            function setUserMediaPermission(isGranted) {
+                if (window.testRunner)
+                    testRunner.setUserMediaPermission(isGranted);
+                else
+                    debug("This test can not be run without the testRunner");
+            }
+
             var stream;
             var errorArg;
 
@@ -82,6 +89,8 @@
 
             shouldThrow("navigator.webkitGetUserMedia({audio:false, video:false}, error, error);")
             shouldThrow("navigator.webkitGetUserMedia({audio:false, video:false}, error, null);")
+
+            setUserMediaPermission(true);
             shouldNotThrow("navigator.webkitGetUserMedia({audio:true}, gotStream1, error);");
 
             window.jsTestIsAsync = true;
index ac13dd6..11adf89 100644 (file)
@@ -23,7 +23,7 @@ var emptyFunction = function() {};
 // No arguments
 test('navigator.webkitGetUserMedia()', true);
 
-// 1 Argument (getUserMedia requires at least 2 arguments).
+// 1 Argument (Navigtor.webkitGetUserMedia requires at least 3 arguments).
 test('navigator.webkitGetUserMedia(undefined)', true);
 test('navigator.webkitGetUserMedia(null)', true);
 test('navigator.webkitGetUserMedia({ })', true);
@@ -35,32 +35,32 @@ test('navigator.webkitGetUserMedia(-Infinity)', true);
 test('navigator.webkitGetUserMedia(emptyFunction)', true);
 
 // 2 Arguments.
-test('navigator.webkitGetUserMedia({video: true}, emptyFunction)', false);
-test('navigator.webkitGetUserMedia(undefined, emptyFunction)', true, invalidDictionaryError);
-test('navigator.webkitGetUserMedia(null, emptyFunction)', true, invalidDictionaryError);
-test('navigator.webkitGetUserMedia({ }, emptyFunction)', true, notSupportedError);
-test('navigator.webkitGetUserMedia(true, emptyFunction)', true, invalidDictionaryError);
-test('navigator.webkitGetUserMedia(42, emptyFunction)', true, invalidDictionaryError);
-test('navigator.webkitGetUserMedia(Infinity, emptyFunction)', true, invalidDictionaryError);
-test('navigator.webkitGetUserMedia(-Infinity, emptyFunction)', true, invalidDictionaryError);
-test('navigator.webkitGetUserMedia(emptyFunction, emptyFunction)', true, notSupportedError);
-test('navigator.webkitGetUserMedia({video: true}, "foobar")', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, undefined)', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, null)', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, {})', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, true)', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, 42)', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, Infinity)', true, successCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, -Infinity)', true, successCallbackError);
+test('navigator.webkitGetUserMedia({video: true}, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(undefined, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(null, emptyFunction)', true);
+test('navigator.webkitGetUserMedia({ }, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(true, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(42, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(Infinity, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(-Infinity, emptyFunction)', true);
+test('navigator.webkitGetUserMedia(emptyFunction, emptyFunction)', true);
+test('navigator.webkitGetUserMedia({video: true}, "foobar")', true);
+test('navigator.webkitGetUserMedia({video: true}, undefined)', true);
+test('navigator.webkitGetUserMedia({video: true}, null)', true);
+test('navigator.webkitGetUserMedia({video: true}, {})', true);
+test('navigator.webkitGetUserMedia({video: true}, true)', true);
+test('navigator.webkitGetUserMedia({video: true}, 42)', true);
+test('navigator.webkitGetUserMedia({video: true}, Infinity)', true);
+test('navigator.webkitGetUserMedia({video: true}, -Infinity)', true);
 
 // 3 Arguments.
 test('navigator.webkitGetUserMedia({ }, emptyFunction, emptyFunction)', true, notSupportedError);
 test('navigator.webkitGetUserMedia({video: true}, emptyFunction, emptyFunction)', false);
-test('navigator.webkitGetUserMedia({video: true}, emptyFunction, undefined)', false);
-test('navigator.webkitGetUserMedia({audio:true, video:true}, emptyFunction, undefined)', false);
-test('navigator.webkitGetUserMedia({audio:true}, emptyFunction, undefined)', false);
+test('navigator.webkitGetUserMedia({video: true}, emptyFunction, undefined)', true, errorCallbackError);
+test('navigator.webkitGetUserMedia({audio:true, video:true}, emptyFunction, undefined)', true, errorCallbackError);
+test('navigator.webkitGetUserMedia({audio:true}, emptyFunction, undefined)', true, errorCallbackError);
 test('navigator.webkitGetUserMedia({video: true}, emptyFunction, "video")', true, errorCallbackError);
-test('navigator.webkitGetUserMedia({video: true}, emptyFunction, null)', false );
+test('navigator.webkitGetUserMedia({video: true}, emptyFunction, null)', true, errorCallbackError );
 test('navigator.webkitGetUserMedia({video: true}, emptyFunction, {})', true, errorCallbackError);
 test('navigator.webkitGetUserMedia({video: true}, emptyFunction, true)', true, errorCallbackError);
 test('navigator.webkitGetUserMedia({video: true}, emptyFunction, 42)', true, errorCallbackError);
index 4dce9db..8d51e35 100644 (file)
@@ -314,8 +314,6 @@ webkit.org/b/85211 ietestcenter/css3/flexbox/flexbox-align-stretch-001.htm [ Ima
 webkit.org/b/85212 ietestcenter/css3/flexbox/flexbox-layout-002.htm [ ImageOnlyFailure ]
 
 # Mediastream implementation is not complete yet.
-webkit.org/b/79203 fast/mediastream/argument-types.html [ Skip ]
-webkit.org/b/79203 fast/mediastream/getusermedia.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/MediaStream-add-ended-tracks.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/MediaStream-add-remove-tracks.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/MediaStream-add-tracks-to-inactive-stream.html [ Skip ]
@@ -328,7 +326,6 @@ webkit.org/b/79203 fast/mediastream/MediaStreamTrackEvent-constructor.html [ Ski
 webkit.org/b/79203 fast/mediastream/MediaStreamTrack-getSources.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/MediaStreamTrack.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/MediaStreamTrack-onended.html [ Skip ]
-webkit.org/b/79203 fast/mediastream/no-interface-object.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/RTCIceCandidate.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/RTCPeerConnection-AddRemoveStream.html [ Skip ]
 webkit.org/b/79203 fast/mediastream/RTCPeerConnection-createAnswer.html [ Skip ]
index c2543c0..89e2115 100644 (file)
@@ -1,3 +1,16 @@
+2015-06-22  Adam Bergkvist  <adam.bergkvist@ericsson.com>
+
+        WebRTC: Navigator.webkitGetUserMedia() requires three arguments
+        https://bugs.webkit.org/show_bug.cgi?id=146022
+
+        Reviewed by Eric Carlson.
+
+        Updated custom binding to make the third error callback argument
+        mandatory. Updated and unskipped three tests (for the GTK+ port).
+
+        * bindings/js/JSNavigatorCustom.cpp:
+        (WebCore::JSNavigator::webkitGetUserMedia):
+
 2015-06-22  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed. Fix GTK+ build after r185818.
index 0f75894..1f09d74 100644 (file)
@@ -40,7 +40,7 @@ namespace WebCore {
 
 JSValue JSNavigator::webkitGetUserMedia(ExecState* exec)
 {
-    if (exec->argumentCount() < 2) {
+    if (exec->argumentCount() < 3) {
         throwVMError(exec, createNotEnoughArgumentsError(exec));
         return jsUndefined();
     }
@@ -59,20 +59,16 @@ JSValue JSNavigator::webkitGetUserMedia(ExecState* exec)
         return jsUndefined();
     }
 
-    JSNavigator* castedThis = jsDynamicCast<JSNavigator*>(exec->thisValue());
-    RefPtr<NavigatorUserMediaErrorCallback> errorCallback;
-    if (!exec->argument(2).isUndefinedOrNull()) {
-        if (!exec->uncheckedArgument(2).isFunction()) {
-            throwVMTypeError(exec, "Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function");
-            return jsUndefined();
-        }
-        errorCallback = JSNavigatorUserMediaErrorCallback::create(asObject(exec->uncheckedArgument(2)), castedThis->globalObject());
+    if (!exec->argument(2).isFunction()) {
+        throwVMTypeError(exec, "Argument 3 ('errorCallback') to Navigator.webkitGetUserMedia must be a function");
+        return jsUndefined();
     }
 
-    RefPtr<NavigatorUserMediaSuccessCallback> successCallback = JSNavigatorUserMediaSuccessCallback::create(asObject(exec->uncheckedArgument(1)), castedThis->globalObject());
-    Navigator& impl = castedThis->impl();
+    RefPtr<NavigatorUserMediaSuccessCallback> successCallback = JSNavigatorUserMediaSuccessCallback::create(asObject(exec->uncheckedArgument(1)), globalObject());
+    RefPtr<NavigatorUserMediaErrorCallback> errorCallback = JSNavigatorUserMediaErrorCallback::create(asObject(exec->uncheckedArgument(2)), globalObject());
+
     ExceptionCode ec = 0;
-    NavigatorUserMedia::webkitGetUserMedia(&impl, options, successCallback, errorCallback, ec);
+    NavigatorUserMedia::webkitGetUserMedia(&impl(), options, successCallback, errorCallback, ec);
     setDOMException(exec, ec);
     return jsUndefined();
 }