haikuwebkit/LayoutTests/js/dom/promise-rejection-event-sho...

15 lines
412 B
Plaintext
Raw Permalink Normal View History

Handle IDLPromise<> properly https://bugs.webkit.org/show_bug.cgi?id=166752 Reviewed by Youenn Fablet. Source/JavaScriptCore: Add JSPromise::resolve static function. This applies `Promise.resolve()` conversion to a given value. * runtime/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): (JSC::JSGlobalObject::visitChildren): * runtime/JSGlobalObject.h: (JSC::JSGlobalObject::promiseResolveFunction): * runtime/JSPromise.cpp: (JSC::JSPromise::resolve): * runtime/JSPromise.h: Source/WebCore: This patch implements WebIDL Promise type conversion. According to the spec, Promise takes a value and convert it to Promise by using Promise.resolve function. We implement JSPromise::resolve in JSC and use it in JSDOMConvertPromise. In conversion phase, we just convert the value to JSC::JSPromise* and hold it in PromiseRejectionEvent. On the other hand, In this patch, we newly introduce a new type DOMPromise and use it in RejectedPromiseTracker. And we also rename the previous DOMPromise to DOMPromiseDeferred since it is corresponding to JSPromiseDeferred. DOMPromise is DOMGuarded object. So it is strongly referenced from ScriptExecutionContext and it is weakly referenced from the object itself. This is important since Strong<JSPromise> reference in C++ object that has a wrapper (in this case, PromiseRejectionEvent) easily causes cyclic reference. We hold it as DOMPromise instead of Strong<JSPromise> in RejectedPromiseTracker to break the cyclic reference edge with weak reference. In the meantime, we still use JSC::Strong<> in PromiseRejectionEvent. It leaks memory if promise refers the wrapper object of PromiseRejectionEvent. CustomEvent also has the same problem. This is a general problem that `attribute any` can create cyclic reference. And they should be fixed in a different patch. Currently, we do not take the following approach. e.g. There is C++ object that represents Promise. And its wrapper object is JSPromise thing. When exposing the C++ object, it will be converted to a wrapper object. We do not take this approach because PromiseRejectionEvent can take user-provided promise. For example, users can create PromiseRejectionEvent in a form `new PromiseRejectionEvent("...", { promise: promise })`. In this case, `event.promise === promise` is required. And this is not suitable for the above C++ object model. Large part of this patch is mechanical one to replace DOMPromise with DOMPromiseDeferred. * CMakeLists.txt: * Modules/applepay/ApplePaySession.cpp: * Modules/encryptedmedia/MediaKeySession.h: * Modules/encryptedmedia/MediaKeySystemAccess.h: * Modules/encryptedmedia/MediaKeys.h: * Modules/encryptedmedia/NavigatorEME.h: * Modules/fetch/DOMWindowFetch.h: * Modules/fetch/FetchBody.h: * Modules/fetch/FetchBodyConsumer.h: * Modules/fetch/FetchResponse.h: * Modules/fetch/WorkerGlobalScopeFetch.h: * Modules/mediastream/MediaDevices.h: * Modules/mediastream/MediaEndpointPeerConnection.cpp: (WebCore::MediaEndpointPeerConnection::replaceTrack): (WebCore::MediaEndpointPeerConnection::replaceTrackTask): * Modules/mediastream/MediaEndpointPeerConnection.h: * Modules/mediastream/MediaStreamTrack.cpp: (WebCore::MediaStreamTrack::applyConstraints): * Modules/mediastream/MediaStreamTrack.h: * Modules/mediastream/PeerConnectionBackend.cpp: (WebCore::PeerConnectionBackend::setLocalDescription): (WebCore::PeerConnectionBackend::setRemoteDescription): (WebCore::PeerConnectionBackend::addIceCandidate): * Modules/mediastream/PeerConnectionBackend.h: (WebCore::PeerConnectionBackend::endOfIceCandidates): * Modules/mediastream/RTCPeerConnection.cpp: (WebCore::RTCPeerConnection::queuedSetLocalDescription): (WebCore::RTCPeerConnection::queuedSetRemoteDescription): (WebCore::RTCPeerConnection::queuedAddIceCandidate): (WebCore::RTCPeerConnection::enqueueReplaceTrackTask): (WebCore::RTCPeerConnection::replaceTrack): * Modules/mediastream/RTCPeerConnection.h: * Modules/mediastream/RTCRtpSender.cpp: (WebCore::RTCRtpSender::replaceTrack): * Modules/mediastream/RTCRtpSender.h: * Modules/mediastream/UserMediaRequest.cpp: (WebCore::UserMediaRequest::start): (WebCore::UserMediaRequest::UserMediaRequest): * Modules/mediastream/UserMediaRequest.h: * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: (WebCore::LibWebRTCPeerConnectionBackend::replaceTrack): * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h: * Modules/streams/ReadableStreamSource.h: (WebCore::ReadableStreamSource::start): (WebCore::ReadableStreamSource::pull): * Modules/webaudio/AudioContext.cpp: (WebCore::AudioContext::addReaction): (WebCore::AudioContext::setState): (WebCore::AudioContext::suspend): (WebCore::AudioContext::resume): (WebCore::AudioContext::close): * Modules/webaudio/AudioContext.h: * WebCore.xcodeproj/project.pbxproj: * bindings/IDLTypes.h: * bindings/js/CachedModuleScriptLoaderClient.h: * bindings/js/JSBindingsAllInOne.cpp: * bindings/js/JSCustomElementRegistryCustom.cpp: * bindings/js/JSDOMConvertPromise.h: (WebCore::Converter<IDLPromise<T>>::convert): (WebCore::JSConverter<IDLPromise<T>>::convert): * bindings/js/JSDOMExceptionHandling.cpp: * bindings/js/JSDOMGlobalObject.cpp: * bindings/js/JSDOMGuardedObject.h: * bindings/js/JSDOMPromise.h: (WebCore::DOMPromise::create): (WebCore::DOMPromise::promise): (WebCore::DOMPromise::DOMPromise): (WebCore::DeferredPromise::create): Deleted. (WebCore::DeferredPromise::resolve): Deleted. (WebCore::DeferredPromise::resolveWithNewlyCreated): Deleted. (WebCore::DeferredPromise::reject): Deleted. (WebCore::DeferredPromise::resolveWithCallback): Deleted. (WebCore::DeferredPromise::rejectWithCallback): Deleted. (WebCore::DeferredPromise::DeferredPromise): Deleted. (WebCore::DeferredPromise::deferred): Deleted. (WebCore::DOMPromiseBase::DOMPromiseBase): Deleted. (WebCore::DOMPromiseBase::operator=): Deleted. (WebCore::DOMPromiseBase::reject): Deleted. (WebCore::DOMPromiseBase::rejectType): Deleted. (WebCore::DOMPromiseBase::promise): Deleted. (WebCore::DOMPromise::resolve): Deleted. (WebCore::DOMPromise<void>::resolve): Deleted. (WebCore::callPromiseFunction): Deleted. (WebCore::bindingPromiseFunctionAdapter): Deleted. * bindings/js/JSDOMPromiseDeferred.cpp: Renamed from Source/WebCore/bindings/js/JSDOMPromise.cpp. (WebCore::DeferredPromise::promise): (WebCore::DeferredPromise::callFunction): (WebCore::DeferredPromise::reject): (WebCore::rejectPromiseWithExceptionIfAny): (WebCore::createDeferredPromise): (WebCore::createRejectedPromiseWithTypeError): (WebCore::parseAsJSON): (WebCore::fulfillPromiseWithJSON): (WebCore::fulfillPromiseWithArrayBuffer): * bindings/js/JSDOMPromiseDeferred.h: Copied from Source/WebCore/bindings/js/JSDOMPromise.h. (WebCore::DeferredPromise::create): (WebCore::DeferredPromise::resolve): (WebCore::DeferredPromise::resolveWithNewlyCreated): (WebCore::DeferredPromise::reject): (WebCore::DeferredPromise::resolveWithCallback): (WebCore::DeferredPromise::rejectWithCallback): (WebCore::DeferredPromise::DeferredPromise): (WebCore::DeferredPromise::deferred): (WebCore::DOMPromiseDeferredBase::DOMPromiseDeferredBase): (WebCore::DOMPromiseDeferredBase::operator=): (WebCore::DOMPromiseDeferredBase::reject): (WebCore::DOMPromiseDeferredBase::rejectType): (WebCore::DOMPromiseDeferredBase::promise): (WebCore::DOMPromiseDeferred::resolve): (WebCore::DOMPromiseDeferred<void>::resolve): (WebCore::callPromiseFunction): (WebCore::bindingPromiseFunctionAdapter): * bindings/js/JSSubtleCryptoCustom.cpp: * bindings/js/JSWebGPUCommandBufferCustom.cpp: * bindings/js/JSWebKitSubtleCryptoCustom.cpp: * bindings/scripts/test/JS/JSTestPromiseRejectionEvent.cpp: Added. (WebCore::convertDictionary<TestPromiseRejectionEvent::Init>): (WebCore::JSTestPromiseRejectionEventPrototype::create): (WebCore::JSTestPromiseRejectionEventPrototype::createStructure): (WebCore::JSTestPromiseRejectionEventPrototype::JSTestPromiseRejectionEventPrototype): (WebCore::JSTestPromiseRejectionEventConstructor::construct): (WebCore::JSTestPromiseRejectionEventConstructor::prototypeForStructure): (WebCore::JSTestPromiseRejectionEventConstructor::initializeProperties): (WebCore::JSTestPromiseRejectionEventPrototype::finishCreation): (WebCore::JSTestPromiseRejectionEvent::JSTestPromiseRejectionEvent): (WebCore::JSTestPromiseRejectionEvent::finishCreation): (WebCore::JSTestPromiseRejectionEvent::createPrototype): (WebCore::JSTestPromiseRejectionEvent::prototype): (WebCore::BindingCaller<JSTestPromiseRejectionEvent>::castForAttribute): (WebCore::jsTestPromiseRejectionEventPromise): (WebCore::jsTestPromiseRejectionEventPromiseGetter): (WebCore::jsTestPromiseRejectionEventReason): (WebCore::jsTestPromiseRejectionEventReasonGetter): (WebCore::jsTestPromiseRejectionEventConstructor): (WebCore::setJSTestPromiseRejectionEventConstructor): (WebCore::JSTestPromiseRejectionEvent::getConstructor): (WebCore::toJSNewlyCreated): (WebCore::toJS): * bindings/scripts/test/JS/JSTestPromiseRejectionEvent.h: Added. (WebCore::JSTestPromiseRejectionEvent::create): (WebCore::JSTestPromiseRejectionEvent::createStructure): (WebCore::JSTestPromiseRejectionEvent::wrapped): (WebCore::toJS): (WebCore::toJSNewlyCreated): * bindings/scripts/test/TestPromiseRejectionEvent.idl: Copied from Source/WebCore/bindings/js/CachedModuleScriptLoaderClient.h. * css/FontFace.h: * css/FontFaceSet.h: * dom/CustomElementRegistry.h: * dom/PromiseRejectionEvent.h: * dom/RejectedPromiseTracker.cpp: (WebCore::UnhandledPromise::UnhandledPromise): (WebCore::UnhandledPromise::callStack): (WebCore::UnhandledPromise::promise): (WebCore::RejectedPromiseTracker::promiseRejected): (WebCore::RejectedPromiseTracker::promiseHandled): (WebCore::RejectedPromiseTracker::reportUnhandledRejections): (WebCore::RejectedPromiseTracker::reportRejectionHandled): (WebCore::RejectedPromise::RejectedPromise): Deleted. (WebCore::RejectedPromise::globalObject): Deleted. (WebCore::RejectedPromise::promise): Deleted. * dom/RejectedPromiseTracker.h: * html/HTMLMediaElement.cpp: (WebCore::HTMLMediaElement::rejectPendingPlayPromises): (WebCore::HTMLMediaElement::resolvePendingPlayPromises): (WebCore::HTMLMediaElement::play): * html/HTMLMediaElement.h: * platform/graphics/gpu/GPUCommandBuffer.h: * testing/Internals.h: LayoutTests: * js/dom/promise-rejection-event-should-follow-webidl-promise-conversion-rule-expected.txt: Added. * js/dom/promise-rejection-event-should-follow-webidl-promise-conversion-rule.html: Added. Canonical link: https://commits.webkit.org/188771@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216501 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-05-09 12:17:21 +00:00
Test PromiseRejectionEvent constructor follows WebIDL promise conversion rule.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS event.promise is an instance of Promise
PASS event.reason is "Cappuccino"
PASS value is 42
PASS event.promise is an instance of Promise
PASS event.promise is promise
PASS event.reason is "Cocoa"
PASS successfullyParsed is true
TEST COMPLETE