WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-161787-20160916163307.patch (text/plain), 78.12 KB, created by
youenn fablet
on 2016-09-16 07:35:49 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2016-09-16 07:35:49 PDT
Size:
78.12 KB
patch
obsolete
>Subversion Revision: 206022 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 5d1a410e1ff75bf135cbd51ae0c396537bd61d7b..934d25e91024c2571fb31408bb8e6dc1cb9e925a 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,134 @@ >+2016-09-16 Youenn Fablet <youenn@apple.com> >+ >+ Improve DeferredWrapper code >+ https://bugs.webkit.org/show_bug.cgi?id=161787 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No change of behavior. >+ >+ Renaming DeferredWrapper to DOMPromiseDeferred. >+ Introduced DOMGenericPromise as a ref of DOMPromiseDeferred to improve readability of code. >+ Adding create method that creates the underlying JSC::JSPromiseDeferred in non-worker environments. >+ Updated create method to take references. >+ Introducing domWindow helper accessor into JSDOMObject to ease creation of promise in non-worker environments. >+ Doing some minor clean up (renaming of m_wrapper to m_promiseDeferred, accessor change). >+ >+ * Modules/applepay/ApplePaySession.cpp: >+ (WebCore::ApplePaySession::canMakePaymentsWithActiveCard): >+ * Modules/applepay/ApplePaySession.h: >+ * Modules/fetch/DOMWindowFetch.cpp: >+ (WebCore::DOMWindowFetch::fetch): >+ * Modules/fetch/DOMWindowFetch.h: Updated to take a DOMPromiseDeferred to make it consistent with WorkerGlobalScopeFetch. >+ * Modules/fetch/FetchBody.cpp: >+ (WebCore::FetchBody::arrayBuffer): >+ (WebCore::FetchBody::blob): >+ (WebCore::FetchBody::json): >+ (WebCore::FetchBody::text): >+ (WebCore::FetchBody::consume): >+ (WebCore::FetchBody::consumeArrayBuffer): >+ (WebCore::FetchBody::consumeArrayBufferView): >+ (WebCore::FetchBody::consumeText): >+ (WebCore::FetchBody::consumeBlob): >+ * Modules/fetch/FetchBody.h: >+ (WebCore::FetchBody::formData): >+ * Modules/fetch/FetchBodyConsumer.cpp: >+ (WebCore::FetchBodyConsumer::resolveWithData): >+ (WebCore::FetchBodyConsumer::resolve): >+ * Modules/fetch/FetchBodyConsumer.h: >+ * Modules/fetch/FetchBodyOwner.cpp: >+ (WebCore::FetchBodyOwner::arrayBuffer): >+ (WebCore::FetchBodyOwner::blob): >+ (WebCore::FetchBodyOwner::formData): >+ (WebCore::FetchBodyOwner::json): >+ (WebCore::FetchBodyOwner::text): >+ * Modules/fetch/FetchBodyOwner.h: >+ * Modules/fetch/FetchResponse.cpp: >+ (WebCore::FetchResponse::consume): >+ (WebCore::FetchResponse::finishConsumingStream): >+ * Modules/fetch/FetchResponse.h: >+ * Modules/fetch/WorkerGlobalScopeFetch.cpp: >+ (WebCore::WorkerGlobalScopeFetch::fetch): >+ * Modules/fetch/WorkerGlobalScopeFetch.h: >+ * bindings/js/JSCustomElementRegistryCustom.cpp: >+ (WebCore::whenDefinedPromise): >+ (WebCore::JSCustomElementRegistry::whenDefined): >+ * bindings/js/JSDOMGlobalObject.cpp: >+ (WebCore::JSDOMGlobalObject::visitChildren): >+ * bindings/js/JSDOMGlobalObject.h: >+ * bindings/js/JSDOMPromise.cpp: >+ (WebCore::DOMDeferredPromise::DOMDeferredPromise): >+ (WebCore::DOMDeferredPromise::~DOMDeferredPromise): >+ (WebCore::DOMDeferredPromise::clear): >+ (WebCore::DOMDeferredPromise::contextDestroyed): >+ (WebCore::DOMDeferredPromise::promise): >+ (WebCore::DOMDeferredPromise::callFunction): >+ (WebCore::DOMDeferredPromise::reject): >+ (WebCore::rejectPromiseWithExceptionIfAny): >+ (WebCore::fulfillPromiseWithJSON): >+ (WebCore::fulfillPromiseWithArrayBuffer): >+ (WebCore::DeferredWrapper::DeferredWrapper): Deleted. >+ (WebCore::DeferredWrapper::~DeferredWrapper): Deleted. >+ (WebCore::DeferredWrapper::clear): Deleted. >+ (WebCore::DeferredWrapper::contextDestroyed): Deleted. >+ (WebCore::DeferredWrapper::promise): Deleted. >+ (WebCore::DeferredWrapper::callFunction): Deleted. >+ (WebCore::DeferredWrapper::reject): Deleted. >+ * bindings/js/JSDOMPromise.h: >+ (WebCore::DOMDeferredPromise::create): >+ (WebCore::callPromiseFunction): >+ (WebCore::DOMPromise::DOMPromise): >+ (WebCore::DOMPromise::deferredPromise): >+ (WebCore::DOMDeferredPromise::resolveWithValue): >+ (WebCore::DOMDeferredPromise::resolveWithNewlyCreated): >+ (WebCore::DOMDeferredPromise::rejectWithValue): >+ (WebCore::DOMDeferredPromise::resolve): >+ (WebCore::DOMDeferredPromise::reject): >+ (WebCore::DeferredWrapper::create): Deleted. >+ (WebCore::DOMPromise::deferredWrapper): Deleted. >+ (WebCore::DeferredWrapper::resolveWithValue): Deleted. >+ (WebCore::DeferredWrapper::resolveWithNewlyCreated): Deleted. >+ (WebCore::DeferredWrapper::rejectWithValue): Deleted. >+ (WebCore::DeferredWrapper::resolve): Deleted. >+ (WebCore::DeferredWrapper::reject): Deleted. >+ * bindings/js/JSDOMWrapper.cpp: Introducing domWindow() accessor. >+ * bindings/js/JSDOMWrapper.h: >+ * bindings/js/JSFontFaceCustom.cpp: >+ (WebCore::JSFontFace::loaded): >+ * bindings/js/JSFontFaceSetCustom.cpp: >+ (WebCore::JSFontFaceSet::ready): >+ * bindings/js/JSMediaDevicesCustom.cpp: >+ (WebCore::JSMediaDevices::getUserMedia): >+ * bindings/js/JSMediaStreamTrackCustom.cpp: >+ (WebCore::JSMediaStreamTrack::applyConstraints): >+ * bindings/js/JSReadableStreamSourceCustom.cpp: >+ (WebCore::JSReadableStreamSource::start): >+ * bindings/js/JSWebKitSubtleCryptoCustom.cpp: >+ (WebCore::JSWebKitSubtleCrypto::encrypt): >+ (WebCore::JSWebKitSubtleCrypto::decrypt): >+ (WebCore::JSWebKitSubtleCrypto::sign): >+ (WebCore::JSWebKitSubtleCrypto::verify): >+ (WebCore::JSWebKitSubtleCrypto::digest): >+ (WebCore::JSWebKitSubtleCrypto::generateKey): >+ (WebCore::JSWebKitSubtleCrypto::importKey): >+ (WebCore::JSWebKitSubtleCrypto::exportKey): >+ (WebCore::JSWebKitSubtleCrypto::wrapKey): >+ (WebCore::JSWebKitSubtleCrypto::unwrapKey): >+ * bindings/scripts/CodeGeneratorJS.pm: >+ (GenerateImplementation): >+ (GenerateReturnParameters): >+ * bindings/scripts/test/JS/JSTestObj.cpp: >+ (WebCore::jsTestObjPrototypeFunctionTestPromiseFunctionPromise): >+ (WebCore::jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgumentPromise): >+ (WebCore::jsTestObjPrototypeFunctionTestPromiseFunctionWithExceptionPromise): >+ (WebCore::jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgumentPromise): >+ (WebCore::jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1Promise): >+ (WebCore::jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2Promise): >+ (WebCore::jsTestObjConstructorFunctionTestStaticPromiseFunctionPromise): >+ (WebCore::jsTestObjConstructorFunctionTestStaticPromiseFunctionWithExceptionPromise): >+ * dom/CustomElementRegistry.h: >+ (WebCore::CustomElementRegistry::promiseMap): >+ > 2016-09-16 Javier Fernandez <jfernandez@igalia.com> > > [GTK] Unreviewed build fix after r206007. >diff --git a/Source/WebCore/Modules/applepay/ApplePaySession.cpp b/Source/WebCore/Modules/applepay/ApplePaySession.cpp >index c8c069250ce2bb634925c0fdce30fecfc5cf086c..9e20ba38a74557fd412b4c0a1c056ff96c42ca92 100644 >--- a/Source/WebCore/Modules/applepay/ApplePaySession.cpp >+++ b/Source/WebCore/Modules/applepay/ApplePaySession.cpp >@@ -733,7 +733,7 @@ bool ApplePaySession::canMakePayments(ScriptExecutionContext& scriptExecutionCon > return paymentCoordinator.canMakePayments(); > } > >-void ApplePaySession::canMakePaymentsWithActiveCard(ScriptExecutionContext& scriptExecutionContext, const String& merchantIdentifier, Ref<DeferredWrapper>&& passedPromise, ExceptionCode& ec) >+void ApplePaySession::canMakePaymentsWithActiveCard(ScriptExecutionContext& scriptExecutionContext, const String& merchantIdentifier, Ref<DOMPromiseDeferred>&& passedPromise, ExceptionCode& ec) > { > auto& document = downcast<Document>(scriptExecutionContext); > DOMWindow& window = *document.domWindow(); >@@ -745,7 +745,7 @@ void ApplePaySession::canMakePaymentsWithActiveCard(ScriptExecutionContext& scri > return; > } > >- RefPtr<DeferredWrapper> promise(WTFMove(passedPromise)); >+ RefPtr<DOMPromiseDeferred> promise(WTFMove(passedPromise)); > if (!shouldDiscloseApplePayCapability(document)) { > auto& paymentCoordinator = document.frame()->mainFrame().paymentCoordinator(); > bool canMakePayments = paymentCoordinator.canMakePayments(); >diff --git a/Source/WebCore/Modules/applepay/ApplePaySession.h b/Source/WebCore/Modules/applepay/ApplePaySession.h >index f6339b4cbcba2de61b944ae289d724d7e118e48d..17a829c5d299bae50a5693667827847b139a4034 100644 >--- a/Source/WebCore/Modules/applepay/ApplePaySession.h >+++ b/Source/WebCore/Modules/applepay/ApplePaySession.h >@@ -37,7 +37,7 @@ > namespace WebCore { > > class ArrayValue; >-class DeferredWrapper; >+class DOMPromiseDeferred; > class Dictionary; > class Document; > class Payment; >@@ -63,7 +63,7 @@ public: > > static bool supportsVersion(ScriptExecutionContext&, unsigned version, ExceptionCode&); > static bool canMakePayments(ScriptExecutionContext&, ExceptionCode&); >- static void canMakePaymentsWithActiveCard(ScriptExecutionContext&, const String& merchantIdentifier, Ref<DeferredWrapper>&&, ExceptionCode&); >+ static void canMakePaymentsWithActiveCard(ScriptExecutionContext&, const String& merchantIdentifier, Ref<DOMPromiseDeferred>&&, ExceptionCode&); > > void begin(ExceptionCode&); > void abort(ExceptionCode&); >diff --git a/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp b/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp >index c480a7db98ef15aa420eba34eba8f9d0174898bc..5a6b7d9cb0e1fa12c728b4b371da107ad4643de5 100644 >--- a/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp >+++ b/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp >@@ -37,7 +37,7 @@ > > namespace WebCore { > >-void DOMWindowFetch::fetch(DOMWindow& window, FetchRequest& request, DOMPromise<FetchResponse>&& promise) >+void DOMWindowFetch::fetch(DOMWindow& window, FetchRequest& request, DOMGenericPromise&& promise) > { > if (!window.scriptExecutionContext()) > return; >diff --git a/Source/WebCore/Modules/fetch/DOMWindowFetch.h b/Source/WebCore/Modules/fetch/DOMWindowFetch.h >index d371f2c38b682ddea083a6aff2e347a01d9afa4b..7b3425f5b304ec76f4340e1705b224df115c7435 100644 >--- a/Source/WebCore/Modules/fetch/DOMWindowFetch.h >+++ b/Source/WebCore/Modules/fetch/DOMWindowFetch.h >@@ -36,14 +36,12 @@ > namespace WebCore { > > class DOMWindow; >-class DeferredWrapper; > class Dictionary; > class FetchRequest; >-class FetchResponse; > > class DOMWindowFetch { > public: >- static void fetch(DOMWindow&, FetchRequest&, DOMPromise<FetchResponse>&&); >+ static void fetch(DOMWindow&, FetchRequest&, DOMGenericPromise&&); > }; > > } // namespace WebCore >diff --git a/Source/WebCore/Modules/fetch/FetchBody.cpp b/Source/WebCore/Modules/fetch/FetchBody.cpp >index 25ed1f381dec46ec3ddb06ad25631aa4bdea6106..af36f7d74adb9b136ee24afc49c5dbb34a43221c 100644 >--- a/Source/WebCore/Modules/fetch/FetchBody.cpp >+++ b/Source/WebCore/Modules/fetch/FetchBody.cpp >@@ -124,14 +124,14 @@ void FetchBody::updateContentType(FetchHeaders& headers) > headers.fastSet(HTTPHeaderName::ContentType, m_contentType); > } > >-void FetchBody::arrayBuffer(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) >+void FetchBody::arrayBuffer(FetchBodyOwner& owner, DOMGenericPromise&& promise) > { > ASSERT(m_type != Type::None); > m_consumer.setType(FetchBodyConsumer::Type::ArrayBuffer); > consume(owner, WTFMove(promise)); > } > >-void FetchBody::blob(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) >+void FetchBody::blob(FetchBodyOwner& owner, DOMGenericPromise&& promise) > { > ASSERT(m_type != Type::None); > m_consumer.setType(FetchBodyConsumer::Type::Blob); >@@ -139,7 +139,7 @@ void FetchBody::blob(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) > consume(owner, WTFMove(promise)); > } > >-void FetchBody::json(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) >+void FetchBody::json(FetchBodyOwner& owner, DOMGenericPromise&& promise) > { > ASSERT(m_type != Type::None); > >@@ -151,7 +151,7 @@ void FetchBody::json(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) > consume(owner, WTFMove(promise)); > } > >-void FetchBody::text(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) >+void FetchBody::text(FetchBodyOwner& owner, DOMGenericPromise&& promise) > { > ASSERT(m_type != Type::None); > >@@ -163,7 +163,7 @@ void FetchBody::text(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) > consume(owner, WTFMove(promise)); > } > >-void FetchBody::consume(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) >+void FetchBody::consume(FetchBodyOwner& owner, DOMGenericPromise&& promise) > { > // This should be handled by FetchBodyOwner > ASSERT(m_type != Type::None); >@@ -246,28 +246,28 @@ void FetchBody::consumeAsStream(FetchBodyOwner& owner, FetchResponseSource& sour > } > #endif > >-void FetchBody::consumeArrayBuffer(Ref<DeferredWrapper>&& promise) >+void FetchBody::consumeArrayBuffer(DOMGenericPromise&& promise) > { > ASSERT(m_data); > m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_data->data()), m_data->byteLength()); > m_data = nullptr; > } > >-void FetchBody::consumeArrayBufferView(Ref<DeferredWrapper>&& promise) >+void FetchBody::consumeArrayBufferView(DOMGenericPromise&& promise) > { > ASSERT(m_dataView); > m_consumer.resolveWithData(WTFMove(promise), static_cast<const uint8_t*>(m_dataView->baseAddress()), m_dataView->byteLength()); > m_dataView = nullptr; > } > >-void FetchBody::consumeText(Ref<DeferredWrapper>&& promise) >+void FetchBody::consumeText(DOMGenericPromise&& promise) > { > Vector<uint8_t> data = extractFromText(); > m_consumer.resolveWithData(WTFMove(promise), data.data(), data.size()); > m_text = { }; > } > >-void FetchBody::consumeBlob(FetchBodyOwner& owner, Ref<DeferredWrapper>&& promise) >+void FetchBody::consumeBlob(FetchBodyOwner& owner, DOMGenericPromise&& promise) > { > ASSERT(m_blob); > >diff --git a/Source/WebCore/Modules/fetch/FetchBody.h b/Source/WebCore/Modules/fetch/FetchBody.h >index 850e664b4f275d57639bc757dd67151041199622..537938c1397fef1ab8580a59d732d150770d91a0 100644 >--- a/Source/WebCore/Modules/fetch/FetchBody.h >+++ b/Source/WebCore/Modules/fetch/FetchBody.h >@@ -52,11 +52,11 @@ class ScriptExecutionContext; > > class FetchBody { > public: >- void arrayBuffer(FetchBodyOwner&, Ref<DeferredWrapper>&&); >- void blob(FetchBodyOwner&, Ref<DeferredWrapper>&&); >- void json(FetchBodyOwner&, Ref<DeferredWrapper>&&); >- void text(FetchBodyOwner&, Ref<DeferredWrapper>&&); >- void formData(FetchBodyOwner&, Ref<DeferredWrapper>&& promise) { promise.get().reject(0); } >+ void arrayBuffer(FetchBodyOwner&, DOMGenericPromise&&); >+ void blob(FetchBodyOwner&, DOMGenericPromise&&); >+ void json(FetchBodyOwner&, DOMGenericPromise&&); >+ void text(FetchBodyOwner&, DOMGenericPromise&&); >+ void formData(FetchBodyOwner&, DOMGenericPromise&& promise) { promise.get().reject(0); } > > #if ENABLE(READABLE_STREAM_API) > void consumeAsStream(FetchBodyOwner&, FetchResponseSource&); >@@ -93,13 +93,13 @@ private: > FetchBody(String&&); > FetchBody(Type type) : m_type(type) { } > >- void consume(FetchBodyOwner&, Ref<DeferredWrapper>&&); >+ void consume(FetchBodyOwner&, DOMGenericPromise&&); > > Vector<uint8_t> extractFromText() const; >- void consumeArrayBuffer(Ref<DeferredWrapper>&&); >- void consumeArrayBufferView(Ref<DeferredWrapper>&&); >- void consumeText(Ref<DeferredWrapper>&&); >- void consumeBlob(FetchBodyOwner&, Ref<DeferredWrapper>&&); >+ void consumeArrayBuffer(DOMGenericPromise&&); >+ void consumeArrayBufferView(DOMGenericPromise&&); >+ void consumeText(DOMGenericPromise&&); >+ void consumeBlob(FetchBodyOwner&, DOMGenericPromise&&); > > Type m_type { Type::None }; > String m_contentType; >@@ -112,7 +112,7 @@ private: > String m_text; > > FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::None }; >- RefPtr<DeferredWrapper> m_consumePromise; >+ RefPtr<DOMPromiseDeferred> m_consumePromise; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp b/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp >index 7264b8d2d979402f920dcf5056fd31c6b69cb20a..50e521b90b3cf21b806257b2c0410deb0447f5e3 100644 >--- a/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp >+++ b/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp >@@ -59,7 +59,7 @@ static String textFromUTF8(const unsigned char* data, unsigned length) > return decoder->decodeAndFlush(reinterpret_cast<const char*>(data), length); > } > >-void FetchBodyConsumer::resolveWithData(Ref<DeferredWrapper>&& promise, const unsigned char* data, unsigned length) >+void FetchBodyConsumer::resolveWithData(DOMGenericPromise&& promise, const unsigned char* data, unsigned length) > { > switch (m_type) { > case Type::ArrayBuffer: >@@ -80,7 +80,7 @@ void FetchBodyConsumer::resolveWithData(Ref<DeferredWrapper>&& promise, const un > } > } > >-void FetchBodyConsumer::resolve(Ref<DeferredWrapper>&& promise) >+void FetchBodyConsumer::resolve(DOMGenericPromise&& promise) > { > ASSERT(m_type != Type::None); > switch (m_type) { >diff --git a/Source/WebCore/Modules/fetch/FetchBodyConsumer.h b/Source/WebCore/Modules/fetch/FetchBodyConsumer.h >index f949ac086713b98438effe1ee90bf28954779bbb..e7ac7e575a6e00ce5979e3e157c65f9cb9945b5c 100644 >--- a/Source/WebCore/Modules/fetch/FetchBodyConsumer.h >+++ b/Source/WebCore/Modules/fetch/FetchBodyConsumer.h >@@ -30,12 +30,12 @@ > > #if ENABLE(FETCH_API) > >+#include "JSDOMPromise.h" > #include "SharedBuffer.h" > > namespace WebCore { > > class Blob; >-class DeferredWrapper; > > class FetchBodyConsumer { > public: >@@ -57,8 +57,8 @@ public: > > void clean() { m_buffer = nullptr; } > >- void resolve(Ref<DeferredWrapper>&&); >- void resolveWithData(Ref<DeferredWrapper>&&, const unsigned char*, unsigned); >+ void resolve(DOMGenericPromise&&); >+ void resolveWithData(DOMGenericPromise&&, const unsigned char*, unsigned); > > bool hasData() const { return !!m_buffer; } > >diff --git a/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp b/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp >index c29434f351b621e6994abf55c04ba03b25dee28a..89005938e11736515e9cf39a39e843e50395b99e 100644 >--- a/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp >+++ b/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp >@@ -71,7 +71,7 @@ bool FetchBodyOwner::isDisturbedOrLocked() const > return false; > } > >-void FetchBodyOwner::arrayBuffer(Ref<DeferredWrapper>&& promise) >+void FetchBodyOwner::arrayBuffer(DOMGenericPromise&& promise) > { > if (m_body.isEmpty()) { > fulfillPromiseWithArrayBuffer(WTFMove(promise), nullptr, 0); >@@ -85,7 +85,7 @@ void FetchBodyOwner::arrayBuffer(Ref<DeferredWrapper>&& promise) > m_body.arrayBuffer(*this, WTFMove(promise)); > } > >-void FetchBodyOwner::blob(Ref<DeferredWrapper>&& promise) >+void FetchBodyOwner::blob(DOMGenericPromise&& promise) > { > if (m_body.isEmpty()) { > promise->resolve(Blob::create(Vector<uint8_t>(), Blob::normalizedContentType(extractMIMETypeFromMediaType(m_body.contentType())))); >@@ -99,7 +99,7 @@ void FetchBodyOwner::blob(Ref<DeferredWrapper>&& promise) > m_body.blob(*this, WTFMove(promise)); > } > >-void FetchBodyOwner::formData(Ref<DeferredWrapper>&& promise) >+void FetchBodyOwner::formData(DOMGenericPromise&& promise) > { > if (m_body.isEmpty()) { > promise->reject(0); >@@ -113,7 +113,7 @@ void FetchBodyOwner::formData(Ref<DeferredWrapper>&& promise) > m_body.formData(*this, WTFMove(promise)); > } > >-void FetchBodyOwner::json(Ref<DeferredWrapper>&& promise) >+void FetchBodyOwner::json(DOMGenericPromise&& promise) > { > if (m_body.isEmpty()) { > promise->reject(SYNTAX_ERR); >@@ -127,7 +127,7 @@ void FetchBodyOwner::json(Ref<DeferredWrapper>&& promise) > m_body.json(*this, WTFMove(promise)); > } > >-void FetchBodyOwner::text(Ref<DeferredWrapper>&& promise) >+void FetchBodyOwner::text(DOMGenericPromise&& promise) > { > if (m_body.isEmpty()) { > promise->resolve(String()); >diff --git a/Source/WebCore/Modules/fetch/FetchBodyOwner.h b/Source/WebCore/Modules/fetch/FetchBodyOwner.h >index 0df30b75482eda880bfc7a977d74a29086f695bb..f37a5dd9664e1ff44736d256832135291a4d8067 100644 >--- a/Source/WebCore/Modules/fetch/FetchBodyOwner.h >+++ b/Source/WebCore/Modules/fetch/FetchBodyOwner.h >@@ -46,11 +46,11 @@ public: > // Exposed Body API > bool isDisturbed() const { return m_isDisturbed; }; > >- void arrayBuffer(Ref<DeferredWrapper>&&); >- void blob(Ref<DeferredWrapper>&&); >- void formData(Ref<DeferredWrapper>&&); >- void json(Ref<DeferredWrapper>&&); >- void text(Ref<DeferredWrapper>&&); >+ void arrayBuffer(DOMGenericPromise&&); >+ void blob(DOMGenericPromise&&); >+ void formData(DOMGenericPromise&&); >+ void json(DOMGenericPromise&&); >+ void text(DOMGenericPromise&&); > > bool isDisturbedOrLocked() const; > >diff --git a/Source/WebCore/Modules/fetch/FetchResponse.cpp b/Source/WebCore/Modules/fetch/FetchResponse.cpp >index b8641d43f0e5178c2d4580c11c57f1dc78a440fe..679d665377c7717bf0b82f3bd242f2d5fdafb8d7 100644 >--- a/Source/WebCore/Modules/fetch/FetchResponse.cpp >+++ b/Source/WebCore/Modules/fetch/FetchResponse.cpp >@@ -206,7 +206,7 @@ void FetchResponse::BodyLoader::stop() > m_loader->stop(); > } > >-void FetchResponse::consume(unsigned type, Ref<DeferredWrapper>&& wrapper) >+void FetchResponse::consume(unsigned type, DOMGenericPromise&& wrapper) > { > ASSERT(type <= static_cast<unsigned>(FetchBodyConsumer::Type::Text)); > >@@ -241,7 +241,7 @@ void FetchResponse::consumeChunk(Ref<JSC::Uint8Array>&& chunk) > m_consumer.append(chunk->data(), chunk->byteLength()); > } > >-void FetchResponse::finishConsumingStream(Ref<DeferredWrapper>&& promise) >+void FetchResponse::finishConsumingStream(DOMGenericPromise&& promise) > { > m_consumer.resolve(WTFMove(promise)); > } >diff --git a/Source/WebCore/Modules/fetch/FetchResponse.h b/Source/WebCore/Modules/fetch/FetchResponse.h >index ee9936885bcbc968fcbdbc920e4f5e77122c1cee..0d66722380dab5dc7f9292def0ec2f8c9f995a66 100644 >--- a/Source/WebCore/Modules/fetch/FetchResponse.h >+++ b/Source/WebCore/Modules/fetch/FetchResponse.h >@@ -60,11 +60,11 @@ public: > using FetchPromise = DOMPromise<FetchResponse>; > static void fetch(ScriptExecutionContext&, FetchRequest&, FetchPromise&&); > >- void consume(unsigned, Ref<DeferredWrapper>&&); >+ void consume(unsigned, DOMGenericPromise&&); > #if ENABLE(READABLE_STREAM_API) > void startConsumingStream(unsigned); > void consumeChunk(Ref<JSC::Uint8Array>&&); >- void finishConsumingStream(Ref<DeferredWrapper>&&); >+ void finishConsumingStream(DOMGenericPromise&&); > #endif > > void setStatus(int, const String&, ExceptionCode&); >diff --git a/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp b/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp >index 535516c11cb34c3cc70c4c72116e69dda3e5b8f5..3e51261e8da36230534a599d05e6f401997552b6 100644 >--- a/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp >+++ b/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp >@@ -36,7 +36,7 @@ > > namespace WebCore { > >-void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope& scope, FetchRequest& request, Ref<DeferredWrapper>&& promise) >+void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope& scope, FetchRequest& request, DOMGenericPromise&& promise) > { > if (!scope.scriptExecutionContext()) > return; >diff --git a/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h b/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h >index 20b262576e7dc090712df3da98308de2a0ecbe0a..6529b13f11ff1f3a8ab3c7f000ed829521943a64 100644 >--- a/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h >+++ b/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h >@@ -31,17 +31,15 @@ > #if ENABLE(FETCH_API) > > #include "JSDOMPromise.h" >-#include <wtf/Forward.h> > > namespace WebCore { > >-class WorkerGlobalScope; >-class DeferredWrapper; > class FetchRequest; >+class WorkerGlobalScope; > > class WorkerGlobalScopeFetch { > public: >- static void fetch(WorkerGlobalScope&, FetchRequest&, Ref<DeferredWrapper>&&); >+ static void fetch(WorkerGlobalScope&, FetchRequest&, DOMGenericPromise&&); > }; > > } // namespace WebCore >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 45aa8add3ce7656db09904f075e0986f0b0cec6f..40c7c038a1ef6ea19049c053a9987ae09dde782b 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -1530,6 +1530,7 @@ > 416E6FE81BBD12DF000A6053 /* WritableStreamInternalsBuiltins.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B03D8061BB3110D00B764E9 /* WritableStreamInternalsBuiltins.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 416E6FE91BBD12E5000A6043 /* ReadableStreamBuiltins.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B03D8061BB3110D00B764D8 /* ReadableStreamBuiltins.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 416E6FE91BBD12E5000A6053 /* WritableStreamBuiltins.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B03D8061BB3110D00B764E8 /* WritableStreamBuiltins.h */; settings = {ATTRIBUTES = (Private, ); }; }; >+ 4170A2EA1D8C0CCA00318452 /* JSDOMWrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4170A2E91D8C0CC000318452 /* JSDOMWrapper.cpp */; }; > 417253AA1354BBBC00360F2A /* MediaControlElements.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 417253A81354BBBC00360F2A /* MediaControlElements.cpp */; }; > 417253AB1354BBBC00360F2A /* MediaControlElements.h in Headers */ = {isa = PBXBuildFile; fileRef = 417253A91354BBBC00360F2A /* MediaControlElements.h */; }; > 417DA6D913734E6E007C57FB /* Internals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 417DA4CF13734326007C57FB /* Internals.cpp */; }; >@@ -8454,6 +8455,7 @@ > 4162A4551011464700DFF3ED /* JSDedicatedWorkerGlobalScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDedicatedWorkerGlobalScope.cpp; sourceTree = "<group>"; }; > 4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDedicatedWorkerGlobalScope.h; sourceTree = "<group>"; }; > 416E29A5102FA962007FC14E /* WorkerReportingProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerReportingProxy.h; sourceTree = "<group>"; }; >+ 4170A2E91D8C0CC000318452 /* JSDOMWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMWrapper.cpp; sourceTree = "<group>"; }; > 417253A81354BBBC00360F2A /* MediaControlElements.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaControlElements.cpp; sourceTree = "<group>"; }; > 417253A91354BBBC00360F2A /* MediaControlElements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaControlElements.h; sourceTree = "<group>"; }; > 417DA4CE13734326007C57FB /* Internals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Internals.h; sourceTree = "<group>"; }; >@@ -21039,6 +21041,7 @@ > 460CBF341D4BCCFE0092E88E /* JSDOMWindowProperties.h */, > BCBFB53A0DCD29CF0019B3E5 /* JSDOMWindowShell.cpp */, > BCBFB53B0DCD29CF0019B3E5 /* JSDOMWindowShell.h */, >+ 4170A2E91D8C0CC000318452 /* JSDOMWrapper.cpp */, > 65E0E9431133C89F00B4CB10 /* JSDOMWrapper.h */, > F3D461461161D53200CA0D09 /* JSErrorHandler.cpp */, > F3D461471161D53200CA0D09 /* JSErrorHandler.h */, >@@ -29464,6 +29467,7 @@ > 314BE3A61B3103FB00141982 /* NamedImageGeneratedImage.cpp in Sources */, > BCF34A3711A231CD00C71804 /* NamedNodeMap.cpp in Sources */, > A81872240977D3C0005826D9 /* NameNodeList.cpp in Sources */, >+ 4170A2EA1D8C0CCA00318452 /* JSDOMWrapper.cpp in Sources */, > 8306EFF11B8BCEA50031D032 /* NativeNodeFilter.cpp in Sources */, > E10B9B6D0B747599003ED890 /* NativeXPathNSResolver.cpp in Sources */, > 93CCF0600AF6CA7600018E89 /* NavigationAction.cpp in Sources */, >diff --git a/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp b/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp >index c97b93b0065897477064b2275e8833e2acb02111..b1217748d968418bdf4c9b0cbd0199c45fa80dce 100644 >--- a/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp >+++ b/Source/WebCore/bindings/js/JSCustomElementRegistryCustom.cpp >@@ -162,7 +162,7 @@ JSValue JSCustomElementRegistry::define(ExecState& state) > } > > // https://html.spec.whatwg.org/#dom-customelementregistry-whendefined >-static JSValue whenDefinedPromise(ExecState& state, JSDOMGlobalObject& globalObject, CustomElementRegistry& registry) >+static JSValue whenDefinedPromise(ExecState& state, JSDOMGlobalObject& globalObject, CustomElementRegistry& registry, JSPromiseDeferred& promiseDeferred) > { > auto scope = DECLARE_THROW_SCOPE(state.vm()); > >@@ -173,17 +173,18 @@ static JSValue whenDefinedPromise(ExecState& state, JSDOMGlobalObject& globalObj > if (UNLIKELY(scope.exception())) > return jsUndefined(); > >- if (!validateCustomElementNameAndThrowIfNeeded(state, localName)) >+ if (!validateCustomElementNameAndThrowIfNeeded(state, localName)) { >+ ASSERT(scope.exception()); > return jsUndefined(); >+ } > > if (registry.findInterface(localName)) { >- auto& jsPromise = *JSPromiseDeferred::create(&state, &globalObject); >- DeferredWrapper::create(&state, &globalObject, &jsPromise)->resolve(nullptr); >- return jsPromise.promise(); >+ DOMPromiseDeferred::create(globalObject, promiseDeferred)->resolve(nullptr); >+ return promiseDeferred.promise(); > } > > auto result = registry.promiseMap().ensure(localName, [&] { >- return DeferredWrapper::create(&state, &globalObject, JSPromiseDeferred::create(&state, &globalObject)); >+ return DOMPromiseDeferred::create(globalObject, promiseDeferred); > }); > > return result.iterator->value->promise(); >@@ -193,14 +194,15 @@ JSValue JSCustomElementRegistry::whenDefined(ExecState& state) > { > auto scope = DECLARE_CATCH_SCOPE(state.vm()); > >- JSDOMGlobalObject& globalObject = *jsCast<JSDOMGlobalObject*>(state.lexicalGlobalObject()); >- auto& promiseDeferred = *JSPromiseDeferred::create(&state, &globalObject); >- JSValue promise = whenDefinedPromise(state, globalObject, wrapped()); >+ ASSERT(globalObject()); >+ auto promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >+ ASSERT(promiseDeferred); >+ JSValue promise = whenDefinedPromise(state, *globalObject(), wrapped(), *promiseDeferred); > > if (UNLIKELY(scope.exception())) { >- rejectPromiseWithExceptionIfAny(state, globalObject, promiseDeferred); >+ rejectPromiseWithExceptionIfAny(state, *globalObject(), *promiseDeferred); > ASSERT(!scope.exception()); >- return promiseDeferred.promise(); >+ return promiseDeferred->promise(); > } > > return promise; >diff --git a/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp b/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp >index 35f895c80c75b79a096529f6c5dc191a260e56ad..e870aeb67f51d8c16482e1132ffe7cc8fca30bea 100644 >--- a/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp >+++ b/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp >@@ -178,8 +178,8 @@ void JSDOMGlobalObject::visitChildren(JSCell* cell, SlotVisitor& visitor) > for (auto& constructor : thisObject->constructors().values()) > visitor.append(&constructor); > >- for (auto& deferredWrapper : thisObject->deferredWrappers()) >- deferredWrapper->visitAggregate(visitor); >+ for (auto& deferredPromise : thisObject->deferredPromises()) >+ deferredPromise->visitAggregate(visitor); > > thisObject->m_builtinInternalFunctions.visit(visitor); > } >diff --git a/Source/WebCore/bindings/js/JSDOMGlobalObject.h b/Source/WebCore/bindings/js/JSDOMGlobalObject.h >index c672e4b92d2253785948b5da216afeab47bbb57c..79f17cb943da9913f2383c97cc69f6dd7eda4ac6 100644 >--- a/Source/WebCore/bindings/js/JSDOMGlobalObject.h >+++ b/Source/WebCore/bindings/js/JSDOMGlobalObject.h >@@ -34,7 +34,7 @@ > > namespace WebCore { > >- class DeferredWrapper; >+ class DOMPromiseDeferred; > class Document; > class Event; > class DOMWrapperWorld; >@@ -42,7 +42,7 @@ namespace WebCore { > > typedef HashMap<const JSC::ClassInfo*, JSC::WriteBarrier<JSC::Structure>> JSDOMStructureMap; > typedef HashMap<const JSC::ClassInfo*, JSC::WriteBarrier<JSC::JSObject>> JSDOMConstructorMap; >- typedef HashSet<DeferredWrapper*> DeferredWrapperSet; >+ typedef HashSet<DOMPromiseDeferred*> DOMPromiseDeferredSet; > > class WEBCORE_EXPORT JSDOMGlobalObject : public JSC::JSGlobalObject { > typedef JSC::JSGlobalObject Base; >@@ -58,7 +58,7 @@ namespace WebCore { > JSDOMStructureMap& structures() { return m_structures; } > JSDOMConstructorMap& constructors() { return m_constructors; } > >- DeferredWrapperSet& deferredWrappers() { return m_deferredWrappers; } >+ DOMPromiseDeferredSet& deferredPromises() { return m_deferredPromises; } > > ScriptExecutionContext* scriptExecutionContext() const; > >@@ -91,7 +91,7 @@ namespace WebCore { > protected: > JSDOMStructureMap m_structures; > JSDOMConstructorMap m_constructors; >- DeferredWrapperSet m_deferredWrappers; >+ DOMPromiseDeferredSet m_deferredPromises; > > Event* m_currentEvent; > Ref<DOMWrapperWorld> m_world; >diff --git a/Source/WebCore/bindings/js/JSDOMPromise.cpp b/Source/WebCore/bindings/js/JSDOMPromise.cpp >index bea7ee005b35e8a2539a646d48f5a3dd828425c0..1a04597219d0c5d51fa4ffc6f628f64a1ddfe719 100644 >--- a/Source/WebCore/bindings/js/JSDOMPromise.cpp >+++ b/Source/WebCore/bindings/js/JSDOMPromise.cpp >@@ -28,6 +28,7 @@ > > #include "ExceptionCode.h" > #include "JSDOMError.h" >+#include "JSDOMWindow.h" > #include <builtins/BuiltinNames.h> > #include <runtime/Exception.h> > #include <runtime/JSONObject.h> >@@ -37,41 +38,41 @@ using namespace JSC; > > namespace WebCore { > >-DeferredWrapper::DeferredWrapper(ExecState*, JSDOMGlobalObject* globalObject, JSPromiseDeferred* promiseDeferred) >- : ActiveDOMCallback(globalObject->scriptExecutionContext()) >- , m_deferred(promiseDeferred) >- , m_globalObject(globalObject) >+DOMPromiseDeferred::DOMPromiseDeferred(JSDOMGlobalObject& globalObject, JSPromiseDeferred& promiseDeferred) >+ : ActiveDOMCallback(globalObject.scriptExecutionContext()) >+ , m_deferred(&promiseDeferred) >+ , m_globalObject(&globalObject) > { >- globalObject->vm().heap.writeBarrier(globalObject, promiseDeferred); >- m_globalObject->deferredWrappers().add(this); >+ globalObject.vm().heap.writeBarrier(&globalObject, &promiseDeferred); >+ globalObject.deferredPromises().add(this); > } > >-DeferredWrapper::~DeferredWrapper() >+DOMPromiseDeferred::~DOMPromiseDeferred() > { > clear(); > } > >-void DeferredWrapper::clear() >+void DOMPromiseDeferred::clear() > { > ASSERT(!m_deferred || m_globalObject); > if (m_deferred && m_globalObject) >- m_globalObject->deferredWrappers().remove(this); >+ m_globalObject->deferredPromises().remove(this); > m_deferred.clear(); > } > >-void DeferredWrapper::contextDestroyed() >+void DOMPromiseDeferred::contextDestroyed() > { > ActiveDOMCallback::contextDestroyed(); > clear(); > } > >-JSC::JSValue DeferredWrapper::promise() const >+JSC::JSValue DOMPromiseDeferred::promise() const > { > ASSERT(m_deferred); > return m_deferred->promise(); > } > >-void DeferredWrapper::callFunction(ExecState& exec, JSValue function, JSValue resolution) >+void DOMPromiseDeferred::callFunction(ExecState& exec, JSValue function, JSValue resolution) > { > if (!canInvokeCallback()) > return; >@@ -88,7 +89,7 @@ void DeferredWrapper::callFunction(ExecState& exec, JSValue function, JSValue re > clear(); > } > >-void DeferredWrapper::reject(ExceptionCode ec, const String& message) >+void DOMPromiseDeferred::reject(ExceptionCode ec, const String& message) > { > if (isSuspended()) > return; >@@ -111,7 +112,15 @@ void rejectPromiseWithExceptionIfAny(JSC::ExecState& state, JSDOMGlobalObject& g > JSValue error = scope.exception()->value(); > scope.clearException(); > >- DeferredWrapper::create(&state, &globalObject, &promiseDeferred)->reject(error); >+ DOMPromiseDeferred::create(globalObject, promiseDeferred)->reject(error); >+} >+ >+DOMGenericPromise createDOMGenericPromise(JSC::ExecState& state, JSDOMWindow& domWindow) >+{ >+ JSC::JSPromiseDeferred* deferred = JSC::JSPromiseDeferred::create(&state, &domWindow); >+ // deferred can only be null in workers. >+ ASSERT(deferred); >+ return DOMPromiseDeferred::create(domWindow, *deferred); > } > > JSC::EncodedJSValue createRejectedPromiseWithTypeError(JSC::ExecState& state, const String& errorMessage) >@@ -139,7 +148,7 @@ static inline JSC::JSValue parseAsJSON(JSC::ExecState* state, const String& data > return JSC::JSONParse(state, data); > } > >-void fulfillPromiseWithJSON(Ref<DeferredWrapper>&& promise, const String& data) >+void fulfillPromiseWithJSON(DOMGenericPromise&& promise, const String& data) > { > JSC::JSValue value = parseAsJSON(promise->globalObject()->globalExec(), data); > if (!value) >@@ -148,7 +157,7 @@ void fulfillPromiseWithJSON(Ref<DeferredWrapper>&& promise, const String& data) > promise->resolve(value); > } > >-void fulfillPromiseWithArrayBuffer(Ref<DeferredWrapper>&& promise, ArrayBuffer* arrayBuffer) >+void fulfillPromiseWithArrayBuffer(DOMGenericPromise&& promise, ArrayBuffer* arrayBuffer) > { > if (!arrayBuffer) { > promise->reject<JSValue>(createOutOfMemoryError(promise->globalObject()->globalExec())); >@@ -157,7 +166,7 @@ void fulfillPromiseWithArrayBuffer(Ref<DeferredWrapper>&& promise, ArrayBuffer* > promise->resolve(arrayBuffer); > } > >-void fulfillPromiseWithArrayBuffer(Ref<DeferredWrapper>&& promise, const void* data, size_t length) >+void fulfillPromiseWithArrayBuffer(DOMGenericPromise&& promise, const void* data, size_t length) > { > fulfillPromiseWithArrayBuffer(WTFMove(promise), ArrayBuffer::tryCreate(data, length).get()); > } >diff --git a/Source/WebCore/bindings/js/JSDOMPromise.h b/Source/WebCore/bindings/js/JSDOMPromise.h >index 4d49ed9834fbc582adc792776edc7e0dadf2cf35..187d63ee55936153b853f06c6dd76639d7372e3c 100644 >--- a/Source/WebCore/bindings/js/JSDOMPromise.h >+++ b/Source/WebCore/bindings/js/JSDOMPromise.h >@@ -96,15 +96,14 @@ struct PromiseResultInspector<DOMClass, typename std::enable_if<TypeInspector<DO > static constexpr bool passByConstRef = false; > }; > >-class DeferredWrapper : public RefCounted<DeferredWrapper>, public ActiveDOMCallback { >+class DOMPromiseDeferred : public RefCounted<DOMPromiseDeferred>, public ActiveDOMCallback { > public: >- // FIXME: We should pass references here, not pointers, see bug 161787 >- static Ref<DeferredWrapper> create(JSC::ExecState* state, JSDOMGlobalObject* globalObject, JSC::JSPromiseDeferred* deferred) >+ static Ref<DOMPromiseDeferred> create(JSDOMGlobalObject& globalObject, JSC::JSPromiseDeferred& deferred) > { >- return adoptRef(*new DeferredWrapper(state, globalObject, deferred)); >+ return adoptRef(*new DOMPromiseDeferred(globalObject, deferred)); > } > >- ~DeferredWrapper(); >+ ~DOMPromiseDeferred(); > > template<class ResolveResultType> typename std::enable_if<PromiseResultInspector<ResolveResultType>::passByValue, void>::type > resolve(ResolveResultType result) { resolveWithValue(result); } >@@ -136,7 +135,7 @@ public: > void visitAggregate(JSC::SlotVisitor& visitor) { visitor.appendUnbarrieredWeak(&m_deferred); } > > private: >- DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*); >+ DOMPromiseDeferred(JSDOMGlobalObject&, JSC::JSPromiseDeferred&); > > void clear(); > void contextDestroyed() override; >@@ -152,9 +151,12 @@ private: > JSC::Weak<JSDOMGlobalObject> m_globalObject; > }; > >-void fulfillPromiseWithJSON(Ref<DeferredWrapper>&&, const String&); >-void fulfillPromiseWithArrayBuffer(Ref<DeferredWrapper>&&, ArrayBuffer*); >-void fulfillPromiseWithArrayBuffer(Ref<DeferredWrapper>&&, const void*, size_t); >+using DOMGenericPromise = Ref<DOMPromiseDeferred>; >+DOMGenericPromise createDOMGenericPromise(JSC::ExecState&, JSDOMWindow&); >+ >+void fulfillPromiseWithJSON(DOMGenericPromise&&, const String&); >+void fulfillPromiseWithArrayBuffer(DOMGenericPromise&&, ArrayBuffer*); >+void fulfillPromiseWithArrayBuffer(DOMGenericPromise&&, const void*, size_t); > void rejectPromiseWithExceptionIfAny(JSC::ExecState&, JSDOMGlobalObject&, JSC::JSPromiseDeferred&); > JSC::EncodedJSValue createRejectedPromiseWithTypeError(JSC::ExecState&, const String&); > >@@ -175,16 +177,16 @@ inline JSC::JSValue callPromiseFunction(JSC::ExecState& state) > if (executionScope == PromiseExecutionScope::WindowOrWorker && !promiseDeferred) > return JSC::jsUndefined(); > >- promiseFunction(state, DeferredWrapper::create(&state, &globalObject, promiseDeferred)); >+ promiseFunction(state, DOMPromiseDeferred::create(globalObject, *promiseDeferred)); > > rejectPromiseWithExceptionIfAny(state, globalObject, *promiseDeferred); > ASSERT_UNUSED(scope, !scope.exception()); > return promiseDeferred->promise(); > } > >-using BindingPromiseFunction = JSC::EncodedJSValue(JSC::ExecState*, Ref<DeferredWrapper>&&); >+using BindingPromiseFunction = JSC::EncodedJSValue(JSC::ExecState*, DOMGenericPromise&&); > template<BindingPromiseFunction bindingFunction> >-inline void bindingPromiseFunctionAdapter(JSC::ExecState& state, Ref<DeferredWrapper>&& promise) >+inline void bindingPromiseFunctionAdapter(JSC::ExecState& state, DOMGenericPromise&& promise) > { > bindingFunction(&state, WTFMove(promise)); > } >@@ -199,28 +201,25 @@ inline JSC::JSValue callPromiseFunction(JSC::ExecState& state) > template <typename Value> > class DOMPromise { > public: >- DOMPromise(Ref<DeferredWrapper>&& wrapper) >- : m_wrapper(WTFMove(wrapper)) >- { >- } >+ DOMPromise(DOMGenericPromise&& genericPromise) : m_promiseDeferred(WTFMove(genericPromise)) { } > >- DOMPromise(DOMPromise&& promise) : m_wrapper(WTFMove(promise.m_wrapper)) { } >+ DOMPromise(DOMPromise&& promise) : m_promiseDeferred(WTFMove(promise.m_promiseDeferred)) { } > > DOMPromise(const DOMPromise&) = default; > DOMPromise& operator=(DOMPromise const&) = default; > >- void resolve(typename PromiseResultInspector<Value>::Type value) { m_wrapper->resolve(value); } >+ void resolve(typename PromiseResultInspector<Value>::Type value) { m_promiseDeferred->resolve(value); } > >- template<typename... ErrorType> void reject(ErrorType&&... error) { m_wrapper->reject(std::forward<ErrorType>(error)...); } >+ template<typename... ErrorType> void reject(ErrorType&&... error) { m_promiseDeferred->reject(std::forward<ErrorType>(error)...); } > >- DeferredWrapper& deferredWrapper() { return m_wrapper; } >+ JSC::JSValue promise() const { return m_promiseDeferred->promise(); }; > > private: >- Ref<DeferredWrapper> m_wrapper; >+ DOMGenericPromise m_promiseDeferred; > }; > > template<class ResolveResultType> >-inline void DeferredWrapper::resolveWithValue(ResolveResultType&& result) >+inline void DOMPromiseDeferred::resolveWithValue(ResolveResultType&& result) > { > if (isSuspended()) > return; >@@ -231,7 +230,7 @@ inline void DeferredWrapper::resolveWithValue(ResolveResultType&& result) > } > > template<class ResolveResultType> >-inline void DeferredWrapper::resolveWithNewlyCreated(Ref<ResolveResultType>&& result) >+inline void DOMPromiseDeferred::resolveWithNewlyCreated(Ref<ResolveResultType>&& result) > { > if (isSuspended()) > return; >@@ -243,7 +242,7 @@ inline void DeferredWrapper::resolveWithNewlyCreated(Ref<ResolveResultType>&& re > } > > template<class RejectResultType> >-inline void DeferredWrapper::rejectWithValue(RejectResultType&& result) >+inline void DOMPromiseDeferred::rejectWithValue(RejectResultType&& result) > { > if (isSuspended()) > return; >@@ -255,7 +254,7 @@ inline void DeferredWrapper::rejectWithValue(RejectResultType&& result) > } > > template<> >-inline void DeferredWrapper::resolve(bool result) >+inline void DOMPromiseDeferred::resolve(bool result) > { > if (isSuspended()) > return; >@@ -267,7 +266,7 @@ inline void DeferredWrapper::resolve(bool result) > } > > template<> >-inline void DeferredWrapper::resolve(JSC::JSValue value) >+inline void DOMPromiseDeferred::resolve(JSC::JSValue value) > { > if (isSuspended()) > return; >@@ -279,7 +278,7 @@ inline void DeferredWrapper::resolve(JSC::JSValue value) > } > > template<> >-inline void DeferredWrapper::reject(JSC::JSValue value) >+inline void DOMPromiseDeferred::reject(JSC::JSValue value) > { > if (isSuspended()) > return; >@@ -291,7 +290,7 @@ inline void DeferredWrapper::reject(JSC::JSValue value) > } > > template<> >-inline void DeferredWrapper::resolve(std::nullptr_t) >+inline void DOMPromiseDeferred::resolve(std::nullptr_t) > { > if (isSuspended()) > return; >@@ -303,7 +302,7 @@ inline void DeferredWrapper::resolve(std::nullptr_t) > } > > template<> >-inline void DeferredWrapper::reject(std::nullptr_t) >+inline void DOMPromiseDeferred::reject(std::nullptr_t) > { > if (isSuspended()) > return; >@@ -315,7 +314,7 @@ inline void DeferredWrapper::reject(std::nullptr_t) > } > > template<> >-inline void DeferredWrapper::resolve(const String& result) >+inline void DOMPromiseDeferred::resolve(const String& result) > { > if (isSuspended()) > return; >@@ -327,7 +326,7 @@ inline void DeferredWrapper::resolve(const String& result) > } > > template<> >-inline void DeferredWrapper::reject(const String& result) >+inline void DOMPromiseDeferred::reject(const String& result) > { > if (isSuspended()) > return; >diff --git a/Source/WebCore/bindings/js/JSDOMWrapper.cpp b/Source/WebCore/bindings/js/JSDOMWrapper.cpp >index 45ac21d940e8848aa026b9299da2a1f6df56d8fc..325e72be877bffe2df4a939a16b1f6678b97040e 100644 >--- a/Source/WebCore/bindings/js/JSDOMWrapper.cpp >+++ b/Source/WebCore/bindings/js/JSDOMWrapper.cpp >@@ -27,6 +27,7 @@ > #include "JSDOMWrapper.h" > > #include "DOMWrapperWorld.h" >+#include "JSDOMWindow.h" > #include <runtime/Error.h> > > using namespace JSC; >@@ -35,4 +36,11 @@ namespace WebCore { > > STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSDOMObject); > >+JSDOMWindow& JSDOMObject::domWindow() const >+{ >+ auto* domWindow = JSC::jsCast<JSDOMWindow*>(JSC::JSNonFinalObject::globalObject()); >+ ASSERT(domWindow); >+ return *domWindow; >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/bindings/js/JSDOMWrapper.h b/Source/WebCore/bindings/js/JSDOMWrapper.h >index 22a2a2c2c01c94258e8e635f9a0bf977d91e26b8..cd50aef801b85929d67386ae626c7cae5872f4a4 100644 >--- a/Source/WebCore/bindings/js/JSDOMWrapper.h >+++ b/Source/WebCore/bindings/js/JSDOMWrapper.h >@@ -27,6 +27,7 @@ > > namespace WebCore { > >+class JSDOMWindow; > class ScriptExecutionContext; > > static const uint8_t JSNodeType = JSC::LastJSCObjectType + 1; >@@ -41,8 +42,10 @@ public: > JSDOMGlobalObject* globalObject() const { return JSC::jsCast<JSDOMGlobalObject*>(JSC::JSNonFinalObject::globalObject()); } > ScriptExecutionContext* scriptExecutionContext() const { return globalObject()->scriptExecutionContext(); } > >+ JSDOMWindow& domWindow() const; >+ > protected: >- JSDOMObject(JSC::Structure* structure, JSC::JSGlobalObject& globalObject) >+ JSDOMObject(JSC::Structure* structure, JSC::JSGlobalObject& globalObject) > : Base(globalObject.vm(), structure) > { > ASSERT(scriptExecutionContext()); >diff --git a/Source/WebCore/bindings/js/JSFontFaceCustom.cpp b/Source/WebCore/bindings/js/JSFontFaceCustom.cpp >index b741e5366b7f976e832482bc4cf20086f6826b8c..5de1dd40821590df3d6fcf1daa2fdd303f5327d0 100644 >--- a/Source/WebCore/bindings/js/JSFontFaceCustom.cpp >+++ b/Source/WebCore/bindings/js/JSFontFaceCustom.cpp >@@ -39,11 +39,11 @@ JSC::JSValue JSFontFace::loaded(JSC::ExecState& state) const > { > if (!m_loaded) { > if (!wrapped().promise()) { >- Ref<DeferredWrapper> promise = DeferredWrapper::create(&state, globalObject(), JSC::JSPromiseDeferred::create(&state, globalObject())); >+ auto promise = createDOMGenericPromise(state, domWindow()); > m_loaded.set(state.vm(), this, promise->promise()); > wrapped().registerLoaded(WTFMove(promise)); > } else >- m_loaded.set(state.vm(), this, wrapped().promise().value().deferredWrapper().promise()); >+ m_loaded.set(state.vm(), this, wrapped().promise().value().promise()); > } > return m_loaded.get(); > } >diff --git a/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp b/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp >index 2870b486d24c286d923eeecf4ea65fe62cc8091a..0930f20b88af5e5d3c846e496976dc77c932cafe 100644 >--- a/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp >+++ b/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp >@@ -34,7 +34,7 @@ namespace WebCore { > JSC::JSValue JSFontFaceSet::ready(JSC::ExecState& state) const > { > if (!m_ready) { >- Ref<DeferredWrapper> promise = DeferredWrapper::create(&state, globalObject(), JSC::JSPromiseDeferred::create(&state, globalObject())); >+ auto promise = createDOMGenericPromise(state, domWindow()); > m_ready.set(state.vm(), this, promise->promise()); > wrapped().registerReady(WTFMove(promise)); > } >diff --git a/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp b/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp >index c31e94e3e3e85cbc4d8755166ac2ddb889b84be7..2eff50af9eb9627fc3068eeb5b130dc0084c9878 100644 >--- a/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp >+++ b/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp >@@ -340,7 +340,7 @@ void parseMediaConstraintsDictionary(const Dictionary& mediaTrackConstraints, Me > } > } > >-static void JSMediaDevicesGetUserMediaPromiseFunction(ExecState& state, Ref<DeferredWrapper>&& promise) >+static void JSMediaDevicesGetUserMediaPromiseFunction(ExecState& state, DOMGenericPromise&& promise) > { > VM& vm = state.vm(); > auto scope = DECLARE_THROW_SCOPE(vm); >diff --git a/Source/WebCore/bindings/js/JSMediaStreamTrackCustom.cpp b/Source/WebCore/bindings/js/JSMediaStreamTrackCustom.cpp >index fdf66a7d0c38013402a5d2a0aebf7eb1fa295a26..9795e983598f07f0a15836920e33fa1536db1737 100644 >--- a/Source/WebCore/bindings/js/JSMediaStreamTrackCustom.cpp >+++ b/Source/WebCore/bindings/js/JSMediaStreamTrackCustom.cpp >@@ -184,11 +184,13 @@ JSValue JSMediaStreamTrack::applyConstraints(ExecState& state) > valid = !advancedConstraints.isEmpty() || !mandatoryConstraints.isEmpty(); > } > >- JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred::create(&state, globalObject()); >+ auto deferredPromise = createDOMGenericPromise(state, domWindow()); >+ auto promise = deferredPromise->promise(); >+ > auto constraints = MediaConstraintsImpl::create(WTFMove(mandatoryConstraints), WTFMove(advancedConstraints), valid); >- wrapped().applyConstraints(WTFMove(constraints), DeferredWrapper::create(&state, globalObject(), promiseDeferred)); >+ wrapped().applyConstraints(WTFMove(constraints), WTFMove(deferredPromise)); > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSMediaStreamTrack::getConstraints(ExecState& state) >diff --git a/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp b/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp >index 39a73f53748d10267012989605c7d532b8b10852..ae4adeecfc08b6b6aa028be2da0df4872ad5f97b 100644 >--- a/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp >+++ b/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp >@@ -43,8 +43,11 @@ JSValue JSReadableStreamSource::start(ExecState& state) > JSReadableStreamSource* jsSource = const_cast<JSReadableStreamSource*>(this); > m_controller.set(state.vm(), jsSource, state.argument(0)); > >+ ASSERT(globalObject()); > JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred::create(&state, globalObject()); >- wrapped().start(ReadableStreamDefaultController(controller), DeferredWrapper::create(&state, globalObject(), promiseDeferred)); >+ if (!promiseDeferred) >+ return jsUndefined(); >+ wrapped().start(ReadableStreamDefaultController(controller), DOMPromiseDeferred::create(*globalObject(), *promiseDeferred)); > return promiseDeferred->promise(); > } > >diff --git a/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp b/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp >index ca9e14b8b6646dd64a84a9293e6f9b89e93fb8c4..dd1a358bbe4cb21c730568f16d85e59e30b4d505 100644 >--- a/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp >+++ b/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp >@@ -173,9 +173,8 @@ JSValue JSWebKitSubtleCrypto::encrypt(ExecState& state) > if (!success) > return jsUndefined(); > >- >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { > fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size()); > }; >@@ -190,7 +189,7 @@ JSValue JSWebKitSubtleCrypto::encrypt(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::decrypt(ExecState& state) >@@ -227,8 +226,8 @@ JSValue JSWebKitSubtleCrypto::decrypt(ExecState& state) > if (!success) > return jsUndefined(); > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { > fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size()); > }; >@@ -243,7 +242,7 @@ JSValue JSWebKitSubtleCrypto::decrypt(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::sign(ExecState& state) >@@ -280,8 +279,8 @@ JSValue JSWebKitSubtleCrypto::sign(ExecState& state) > if (!success) > return jsUndefined(); > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { > fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size()); > }; >@@ -296,7 +295,7 @@ JSValue JSWebKitSubtleCrypto::sign(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::verify(ExecState& state) >@@ -339,8 +338,8 @@ JSValue JSWebKitSubtleCrypto::verify(ExecState& state) > if (!success) > return jsUndefined(); > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](bool result) mutable { > wrapper->resolve(result); > }; >@@ -355,7 +354,7 @@ JSValue JSWebKitSubtleCrypto::verify(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::digest(ExecState& state) >@@ -382,8 +381,8 @@ JSValue JSWebKitSubtleCrypto::digest(ExecState& state) > if (!success) > return jsUndefined(); > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { > fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size()); > }; >@@ -398,7 +397,7 @@ JSValue JSWebKitSubtleCrypto::digest(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::generateKey(ExecState& state) >@@ -434,8 +433,8 @@ JSValue JSWebKitSubtleCrypto::generateKey(ExecState& state) > return jsUndefined(); > } > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](CryptoKey* key, CryptoKeyPair* keyPair) mutable { > ASSERT(key || keyPair); > ASSERT(!key || !keyPair); >@@ -455,7 +454,7 @@ JSValue JSWebKitSubtleCrypto::generateKey(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > static void importKey(ExecState& state, CryptoKeyFormat keyFormat, CryptoOperationData data, RefPtr<CryptoAlgorithm> algorithm, RefPtr<CryptoAlgorithmParameters> parameters, bool extractable, CryptoKeyUsage keyUsages, CryptoAlgorithm::KeyCallback callback, CryptoAlgorithm::VoidCallback failureCallback) >@@ -570,8 +569,8 @@ JSValue JSWebKitSubtleCrypto::importKey(ExecState& state) > return jsUndefined(); > } > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](CryptoKey& result) mutable { > wrapper->resolve(result); > }; >@@ -583,7 +582,7 @@ JSValue JSWebKitSubtleCrypto::importKey(ExecState& state) > if (UNLIKELY(scope.exception())) > return jsUndefined(); > >- return promiseDeferred->promise(); >+ return promise; > } > > static void exportKey(ExecState& state, CryptoKeyFormat keyFormat, const CryptoKey& key, CryptoAlgorithm::VectorCallback callback, CryptoAlgorithm::VoidCallback failureCallback) >@@ -639,8 +638,8 @@ JSValue JSWebKitSubtleCrypto::exportKey(ExecState& state) > if (!key) > return throwTypeError(&state, scope); > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > auto successCallback = [wrapper](const Vector<uint8_t>& result) mutable { > fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size()); > }; >@@ -652,7 +651,7 @@ JSValue JSWebKitSubtleCrypto::exportKey(ExecState& state) > if (UNLIKELY(scope.exception())) > return jsUndefined(); > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::wrapKey(ExecState& state) >@@ -693,8 +692,8 @@ JSValue JSWebKitSubtleCrypto::wrapKey(ExecState& state) > if (!parameters) > return jsUndefined(); > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > > auto exportSuccessCallback = [keyFormat, algorithm, parameters, wrappingKey, wrapper](const Vector<uint8_t>& exportedKeyData) mutable { > auto encryptSuccessCallback = [wrapper](const Vector<uint8_t>& encryptedData) mutable { >@@ -722,7 +721,7 @@ JSValue JSWebKitSubtleCrypto::wrapKey(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > JSValue JSWebKitSubtleCrypto::unwrapKey(ExecState& state) >@@ -793,8 +792,8 @@ JSValue JSWebKitSubtleCrypto::unwrapKey(ExecState& state) > return jsUndefined(); > } > >- JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject()); >- RefPtr<DeferredWrapper> wrapper = DeferredWrapper::create(&state, globalObject(), promiseDeferred); >+ RefPtr<DOMPromiseDeferred> wrapper = createDOMGenericPromise(state, domWindow()); >+ auto promise = wrapper->promise(); > Strong<JSDOMGlobalObject> domGlobalObject(state.vm(), globalObject()); > > auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithm, unwrappedKeyAlgorithmParameters, extractable, keyUsages, wrapper](const Vector<uint8_t>& result) mutable { >@@ -828,7 +827,7 @@ JSValue JSWebKitSubtleCrypto::unwrapKey(ExecState& state) > return jsUndefined(); > } > >- return promiseDeferred->promise(); >+ return promise; > } > > } // namespace WebCore >diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm b/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm >index cb81ca059160ae1058fb585cb44cfa6e4dfa22a3..ea12514a9ed1f9a96ebb00870ccaeda7dfc3ca0a 100644 >--- a/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm >+++ b/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm >@@ -3425,7 +3425,7 @@ sub GenerateImplementation > > my $scope = $interface->extendedAttributes->{"Exposed"} ? "WindowOrWorker" : "WindowOnly"; > push(@implContent, <<END); >-static EncodedJSValue ${functionName}Promise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue ${functionName}Promise(ExecState*, DOMGenericPromise&&); > > ${functionReturn} ${functionName}(ExecState* state) > { >@@ -3433,7 +3433,7 @@ ${functionReturn} ${functionName}(ExecState* state) > return JSValue::encode(callPromiseFunction<${functionName}Promise, PromiseExecutionScope::${scope}>(*state)); > } > >-static inline EncodedJSValue ${functionName}Promise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue ${functionName}Promise(ExecState* state, DOMGenericPromise&& promise) > END > } > else { >@@ -4145,7 +4145,7 @@ sub GenerateReturnParameters > my @arguments; > > if (IsReturningPromise($function)) { >- push(@arguments, "WTFMove(deferredWrapper)"); >+ push(@arguments, "WTFMove(promise)"); > } > push(@arguments, "ec") if $function->signature->extendedAttributes->{"RaisesException"} || $function->signature->extendedAttributes->{"RaisesExceptionWithMessage"}; > return @arguments; >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp >index cd77115f943201fdc7508a35f739ef49fdd0a72b..4fa30e18ce967c8929a74334b06e74c8f16a58e5 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp >@@ -231,7 +231,7 @@ JSValue JSTestNode::getConstructor(VM& vm, const JSGlobalObject* globalObject) > return getDOMConstructor<JSTestNodeConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject)); > } > >-static EncodedJSValue jsTestNodePrototypeFunctionTestWorkerPromisePromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestNodePrototypeFunctionTestWorkerPromisePromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestNodePrototypeFunctionTestWorkerPromise(ExecState* state) > { >@@ -239,7 +239,7 @@ EncodedJSValue JSC_HOST_CALL jsTestNodePrototypeFunctionTestWorkerPromise(ExecSt > return JSValue::encode(callPromiseFunction<jsTestNodePrototypeFunctionTestWorkerPromisePromise, PromiseExecutionScope::WindowOrWorker>(*state)); > } > >-static inline EncodedJSValue jsTestNodePrototypeFunctionTestWorkerPromisePromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestNodePrototypeFunctionTestWorkerPromisePromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -250,7 +250,7 @@ static inline EncodedJSValue jsTestNodePrototypeFunctionTestWorkerPromisePromise > return throwThisTypeError(*state, throwScope, "TestNode", "testWorkerPromise"); > ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestNode::info()); > auto& impl = castedThis->wrapped(); >- impl.testWorkerPromise(WTFMove(deferredWrapper)); >+ impl.testWorkerPromise(WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp >index 19b45ae8ce0d66a669d9b5170f20c1494615182f..42223a9aca112be46ed3aa8f211121a5c9aab29d 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp >@@ -7159,7 +7159,7 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionAny(ExecState* state) > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionPromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionPromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunction(ExecState* state) > { >@@ -7167,7 +7167,7 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunction(ExecS > return JSValue::encode(callPromiseFunction<jsTestObjPrototypeFunctionTestPromiseFunctionPromise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionPromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionPromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -7178,11 +7178,11 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionPromis > return throwThisTypeError(*state, throwScope, "TestObject", "testPromiseFunction"); > ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestObj::info()); > auto& impl = castedThis->wrapped(); >- impl.testPromiseFunction(WTFMove(deferredWrapper)); >+ impl.testPromiseFunction(WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgumentPromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgumentPromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgument(ExecState* state) > { >@@ -7190,7 +7190,7 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunctionWithFl > return JSValue::encode(callPromiseFunction<jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgumentPromise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgumentPromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithFloatArgumentPromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -7206,11 +7206,11 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithFl > auto a = convert<float>(*state, state->argument(0), ShouldAllowNonFinite::No); > if (UNLIKELY(throwScope.exception())) > return JSValue::encode(jsUndefined()); >- impl.testPromiseFunctionWithFloatArgument(WTFMove(a), WTFMove(deferredWrapper)); >+ impl.testPromiseFunctionWithFloatArgument(WTFMove(a), WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithExceptionPromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithExceptionPromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunctionWithException(ExecState* state) > { >@@ -7218,7 +7218,7 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunctionWithEx > return JSValue::encode(callPromiseFunction<jsTestObjPrototypeFunctionTestPromiseFunctionWithExceptionPromise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithExceptionPromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithExceptionPromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -7230,12 +7230,12 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithEx > ASSERT_GC_OBJECT_INHERITS(castedThis, JSTestObj::info()); > auto& impl = castedThis->wrapped(); > ExceptionCode ec = 0; >- impl.testPromiseFunctionWithException(WTFMove(deferredWrapper), ec); >+ impl.testPromiseFunctionWithException(WTFMove(promise), ec); > setDOMException(state, ec); > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgumentPromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgumentPromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgument(ExecState* state) > { >@@ -7243,7 +7243,7 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseFunctionWithOp > return JSValue::encode(callPromiseFunction<jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgumentPromise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgumentPromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithOptionalIntArgumentPromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -7257,11 +7257,11 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseFunctionWithOp > auto a = state->argument(0).isUndefined() ? Optional<int32_t>() : convert<int32_t>(*state, state->uncheckedArgument(0), NormalConversion); > if (UNLIKELY(throwScope.exception())) > return JSValue::encode(jsUndefined()); >- impl.testPromiseFunctionWithOptionalIntArgument(WTFMove(a), WTFMove(deferredWrapper)); >+ impl.testPromiseFunctionWithOptionalIntArgument(WTFMove(a), WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1Promise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1Promise(ExecState*, DOMGenericPromise&&); > > static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1(ExecState* state) > { >@@ -7269,7 +7269,7 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunc > return JSValue::encode(callPromiseFunction<jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1Promise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1Promise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction1Promise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -7285,11 +7285,11 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunc > auto a = convert<float>(*state, state->argument(0), ShouldAllowNonFinite::No); > if (UNLIKELY(throwScope.exception())) > return JSValue::encode(jsUndefined()); >- impl.testPromiseOverloadedFunction(WTFMove(a), WTFMove(deferredWrapper)); >+ impl.testPromiseOverloadedFunction(WTFMove(a), WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2Promise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2Promise(ExecState*, DOMGenericPromise&&); > > static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2(ExecState* state) > { >@@ -7297,7 +7297,7 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunc > return JSValue::encode(callPromiseFunction<jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2Promise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2Promise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunction2Promise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); >@@ -7313,7 +7313,7 @@ static inline EncodedJSValue jsTestObjPrototypeFunctionTestPromiseOverloadedFunc > auto request = JSFetchRequest::toWrapped(state->argument(0)); > if (UNLIKELY(!request)) > return throwArgumentTypeError(*state, throwScope, 0, "request", "TestObject", "testPromiseOverloadedFunction", "FetchRequest"); >- impl.testPromiseOverloadedFunction(*request, WTFMove(deferredWrapper)); >+ impl.testPromiseOverloadedFunction(*request, WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >@@ -7334,7 +7334,7 @@ EncodedJSValue JSC_HOST_CALL jsTestObjPrototypeFunctionTestPromiseOverloadedFunc > return argsCount < 1 ? throwVMError(state, throwScope, createNotEnoughArgumentsError(state)) : throwVMTypeError(state, throwScope); > } > >-static EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionPromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionPromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestObjConstructorFunctionTestStaticPromiseFunction(ExecState* state) > { >@@ -7342,16 +7342,16 @@ EncodedJSValue JSC_HOST_CALL jsTestObjConstructorFunctionTestStaticPromiseFuncti > return JSValue::encode(callPromiseFunction<jsTestObjConstructorFunctionTestStaticPromiseFunctionPromise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionPromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionPromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); > UNUSED_PARAM(throwScope); >- TestObj::testStaticPromiseFunction(WTFMove(deferredWrapper)); >+ TestObj::testStaticPromiseFunction(WTFMove(promise)); > return JSValue::encode(jsUndefined()); > } > >-static EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionWithExceptionPromise(ExecState*, Ref<DeferredWrapper>&&); >+static EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionWithExceptionPromise(ExecState*, DOMGenericPromise&&); > > EncodedJSValue JSC_HOST_CALL jsTestObjConstructorFunctionTestStaticPromiseFunctionWithException(ExecState* state) > { >@@ -7359,13 +7359,13 @@ EncodedJSValue JSC_HOST_CALL jsTestObjConstructorFunctionTestStaticPromiseFuncti > return JSValue::encode(callPromiseFunction<jsTestObjConstructorFunctionTestStaticPromiseFunctionWithExceptionPromise, PromiseExecutionScope::WindowOnly>(*state)); > } > >-static inline EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionWithExceptionPromise(ExecState* state, Ref<DeferredWrapper>&& deferredWrapper) >+static inline EncodedJSValue jsTestObjConstructorFunctionTestStaticPromiseFunctionWithExceptionPromise(ExecState* state, DOMGenericPromise&& promise) > { > VM& vm = state->vm(); > auto throwScope = DECLARE_THROW_SCOPE(vm); > UNUSED_PARAM(throwScope); > ExceptionCode ec = 0; >- TestObj::testStaticPromiseFunctionWithException(WTFMove(deferredWrapper), ec); >+ TestObj::testStaticPromiseFunctionWithException(WTFMove(promise), ec); > setDOMException(state, ec); > return JSValue::encode(jsUndefined()); > } >diff --git a/Source/WebCore/dom/CustomElementRegistry.cpp b/Source/WebCore/dom/CustomElementRegistry.cpp >index e0dd103aa9d06922df1ca0609e2a967c9bebc7fd..81f7ca17237e718822c5811c90eaf57b7517abd2 100644 >--- a/Source/WebCore/dom/CustomElementRegistry.cpp >+++ b/Source/WebCore/dom/CustomElementRegistry.cpp >@@ -34,7 +34,6 @@ > #include "Element.h" > #include "ElementTraversal.h" > #include "JSCustomElementInterface.h" >-#include "JSDOMPromise.h" > #include "MathMLNames.h" > #include "QualifiedName.h" > #include "SVGNames.h" >diff --git a/Source/WebCore/dom/CustomElementRegistry.h b/Source/WebCore/dom/CustomElementRegistry.h >index 5761a474cf1608efd6fb552451d37c2c0cf5d3d4..9cf26d3538b18e4058d72ca350e7fbd5737c2276 100644 >--- a/Source/WebCore/dom/CustomElementRegistry.h >+++ b/Source/WebCore/dom/CustomElementRegistry.h >@@ -27,6 +27,7 @@ > > #if ENABLE(CUSTOM_ELEMENTS) > >+#include "JSDOMPromise.h" > #include "QualifiedName.h" > #include <wtf/HashMap.h> > #include <wtf/TemporaryChange.h> >@@ -44,7 +45,6 @@ namespace WebCore { > > class CustomElementRegistry; > class DOMWindow; >-class DeferredWrapper; > class Element; > class JSCustomElementInterface; > class QualifiedName; >@@ -66,7 +66,7 @@ public: > > JSC::JSValue get(const AtomicString&); > >- HashMap<AtomicString, Ref<DeferredWrapper>>& promiseMap() { return m_promiseMap; } >+ HashMap<AtomicString, DOMGenericPromise>& promiseMap() { return m_promiseMap; } > > private: > CustomElementRegistry(DOMWindow&); >@@ -74,7 +74,7 @@ private: > DOMWindow& m_window; > HashMap<AtomicString, Ref<JSCustomElementInterface>> m_nameMap; > HashMap<const JSC::JSObject*, JSCustomElementInterface*> m_constructorMap; >- HashMap<AtomicString, Ref<DeferredWrapper>> m_promiseMap; >+ HashMap<AtomicString, DOMGenericPromise> m_promiseMap; > > bool m_elementDefinitionIsRunning { false }; >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 161787
:
288784
|
288790
|
288791
|
288792
|
288808
|
288809
|
288810
|
288811
|
288816
|
289058
|
289061
|
289063
|
289439
|
289526