Changeset 184984 in webkit


Ignore:
Timestamp:
May 29, 2015 1:10:00 AM (9 years ago)
Author:
youenn.fablet@crf.canon.fr
Message:

MediaDevices.getUserMedia should reject promise instead of throwing exceptions
https://bugs.webkit.org/show_bug.cgi?id=145282

Reviewed by Darin Adler.

Source/WebCore:

Ensuring at the custom binding level that all potential errors are used to reject promise.
Cleaned up the wrappers by removing unneeded RefPtr.

Covered by modified test.

  • Modules/mediastream/MediaDevices.cpp:

(WebCore::MediaDevices::getUserMedia):

  • Modules/mediastream/MediaDevices.h:
  • Modules/mediastream/UserMediaRequest.cpp:

(WebCore::UserMediaRequest::create):

  • bindings/js/JSMediaDevicesCustom.cpp:

(WebCore::JSMediaDevices::getUserMedia):

LayoutTests:

Updating test to expect rejection and not error throwing.

  • fast/mediastream/MediaDevices-getUserMedia-expected.txt:
  • fast/mediastream/MediaDevices-getUserMedia.html:
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r184981 r184984  
     12015-05-29  Youenn Fablet  <youenn.fablet@crf.canon.fr>
     2
     3        MediaDevices.getUserMedia should reject promise instead of throwing exceptions
     4        https://bugs.webkit.org/show_bug.cgi?id=145282
     5
     6        Reviewed by Darin Adler.
     7
     8        Updating test to expect rejection and not error throwing.
     9
     10        * fast/mediastream/MediaDevices-getUserMedia-expected.txt:
     11        * fast/mediastream/MediaDevices-getUserMedia.html:
     12
    1132015-05-28  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
    214
  • trunk/LayoutTests/fast/mediastream/MediaDevices-getUserMedia-expected.txt

    r182275 r184984  
    44
    55
    6 PASS navigator.mediaDevices.getUserMedia(); threw exception TypeError: First argument of getUserMedia must be a valid Dictionary.
    7 PASS navigator.mediaDevices.getUserMedia({}); threw exception Error: NotSupportedError: DOM Exception 9.
    8 PASS navigator.mediaDevices.webkitGetUserMedia({audio:true}); threw exception TypeError: navigator.mediaDevices.webkitGetUserMedia is not a function. (In 'navigator.mediaDevices.webkitGetUserMedia({audio:true})', 'navigator.mediaDevices.webkitGetUserMedia' is undefined).
     6PASS typeof navigator.mediaDevices.webkitGetUserMedia is 'undefined'
    97PASS navigator.mediaDevices.getUserMedia({audio:true}).then(gotStream1); did not throw exception.
     8PASS navigator.mediaDevices.getUserMedia() rejected with error: TypeError: First argument of getUserMedia must be a valid Dictionary
     9PASS  navigator.mediaDevices.getUserMedia({}) rejected with error: Error: NotSupportedError: DOM Exception 9
    1010PASS Stream generated.
    1111PASS stream.getAudioTracks().length is 1
  • trunk/LayoutTests/fast/mediastream/MediaDevices-getUserMedia.html

    r182275 r184984  
    7676            }
    7777
    78             shouldThrow("navigator.mediaDevices.getUserMedia();");
    79             shouldThrow("navigator.mediaDevices.getUserMedia({});");
    80             shouldThrow("navigator.mediaDevices.webkitGetUserMedia({audio:true});");
     78            navigator.mediaDevices.getUserMedia().then(invalidGotStream, function(error) {
     79                testPassed("navigator.mediaDevices.getUserMedia() rejected with error: " + error);
     80            });
     81            navigator.mediaDevices.getUserMedia({}).then(invalidGotStream, function(error) {
     82                testPassed(" navigator.mediaDevices.getUserMedia({}) rejected with error: " + error);
     83            });
     84            shouldBe("typeof navigator.mediaDevices.webkitGetUserMedia", "'undefined'");
    8185            setUserMediaPermission(true);
    8286            shouldNotThrow("navigator.mediaDevices.getUserMedia({audio:true}).then(gotStream1);");
  • trunk/Source/WebCore/ChangeLog

    r184979 r184984  
     12015-05-29  Youenn Fablet  <youenn.fablet@crf.canon.fr>
     2
     3        MediaDevices.getUserMedia should reject promise instead of throwing exceptions
     4        https://bugs.webkit.org/show_bug.cgi?id=145282
     5
     6        Reviewed by Darin Adler.
     7
     8        Ensuring at the custom binding level that all potential errors are used to reject promise.
     9        Cleaned up the wrappers by removing unneeded RefPtr.
     10
     11        Covered by modified test.
     12
     13        * Modules/mediastream/MediaDevices.cpp:
     14        (WebCore::MediaDevices::getUserMedia):
     15        * Modules/mediastream/MediaDevices.h:
     16        * Modules/mediastream/UserMediaRequest.cpp:
     17        (WebCore::UserMediaRequest::create):
     18        * bindings/js/JSMediaDevicesCustom.cpp:
     19        (WebCore::JSMediaDevices::getUserMedia):
     20
    1212015-05-28  Hunseop Jeong  <hs85.jeong@samsung.com>
    222
  • trunk/Source/WebCore/Modules/mediastream/MediaDevices.cpp

    r182275 r184984  
    6565    UserMediaController* userMedia = UserMediaController::from(document() ? document()->page() : nullptr);
    6666    if (!userMedia) {
     67        // FIXME: We probably want to return a MediaStreamError here using the rejectCallback, and get rid off the ExceptionCode parameter.
    6768        ec = NOT_SUPPORTED_ERR;
    6869        return;
  • trunk/Source/WebCore/Modules/mediastream/MediaDevices.h

    r182314 r184984  
    5656    Document* document() const;
    5757
    58     typedef std::function<void(RefPtr<MediaStream>)> ResolveCallback;
    59     typedef std::function<void(RefPtr<NavigatorUserMediaError>)> RejectCallback;
     58    typedef std::function<void(MediaStream&)> ResolveCallback;
     59    typedef std::function<void(NavigatorUserMediaError&)> RejectCallback;
    6060
    6161    void getUserMedia(const Dictionary&, ResolveCallback, RejectCallback, ExceptionCode&) const;
  • trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp

    r184940 r184984  
    7676    ASSERT(successCallback);
    7777
    78     auto resolveCallback = [successCallback](RefPtr<MediaStream> stream) mutable {
    79         successCallback->handleEvent(stream.get());
     78    auto resolveCallback = [successCallback](MediaStream& stream) mutable {
     79        successCallback->handleEvent(&stream);
    8080    };
    81     auto rejectCallback = [errorCallback](RefPtr<NavigatorUserMediaError> error) mutable {
     81    auto rejectCallback = [errorCallback](NavigatorUserMediaError& error) mutable {
    8282        if (errorCallback)
    83             errorCallback->handleEvent(error.get());
     83            errorCallback->handleEvent(&error);
    8484    };
    8585
     
    178178            track->applyConstraints(protectedThis->m_videoConstraints);
    179179
    180         protectedThis->m_resolveCallback(stream.get());
     180        protectedThis->m_resolveCallback(*stream);
    181181    });
    182182}
     
    191191    RefPtr<NavigatorUserMediaError> error = NavigatorUserMediaError::create(NavigatorUserMediaError::constraintNotSatisfiedErrorName(), constraintName);
    192192    callOnMainThread([protectedThis, error] {
    193         protectedThis->m_rejectCallback(error.get());
     193        protectedThis->m_rejectCallback(*error);
    194194    });
    195195}
     
    204204    RefPtr<NavigatorUserMediaError> error = NavigatorUserMediaError::create(NavigatorUserMediaError::permissionDeniedErrorName(), emptyString());
    205205    callOnMainThread([protectedThis, error] {
    206         protectedThis->m_rejectCallback(error.get());
     206        protectedThis->m_rejectCallback(*error);
    207207    });
    208208}
  • trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp

    r182275 r184984  
    4747JSValue JSMediaDevices::getUserMedia(ExecState* exec)
    4848{
     49    DeferredWrapper wrapper(exec, globalObject());
     50
    4951    Dictionary options(exec, exec->argument(0));
    50     if (exec->hadException())
    51         return jsUndefined();
     52    if (exec->hadException()) {
     53        wrapper.reject(exec->exception());
     54        return wrapper.promise();
     55    }
    5256
    5357    if (!options.isObject()) {
    54         throwVMError(exec, createTypeError(exec, "First argument of getUserMedia must be a valid Dictionary"));
    55         return jsUndefined();
     58        JSValue error = createTypeError(exec, "First argument of getUserMedia must be a valid Dictionary");
     59        wrapper.reject(error);
     60        return wrapper.promise();
    5661    }
    5762
    58     DeferredWrapper wrapper(exec, globalObject());
    59     auto resolveCallback = [wrapper](RefPtr<MediaStream> stream) mutable {
    60         wrapper.resolve(stream.get());
     63    auto resolveCallback = [wrapper](MediaStream& stream) mutable {
     64        wrapper.resolve(&stream);
    6165    };
    62     auto rejectCallback = [wrapper](RefPtr<NavigatorUserMediaError> error) mutable {
    63         wrapper.reject(error.get());
     66    auto rejectCallback = [wrapper](NavigatorUserMediaError& error) mutable {
     67        wrapper.reject(&error);
    6468    };
    6569
    6670    ExceptionCode ec = 0;
    6771    impl().getUserMedia(options, WTF::move(resolveCallback), WTF::move(rejectCallback), ec);
    68     if (ec) {
    69         setDOMException(exec, ec);
    70         return jsUndefined();
    71     }
     72    if (ec)
     73        wrapper.reject(ec);
    7274
    7375    return wrapper.promise();
Note: See TracChangeset for help on using the changeset viewer.