Diff
Modified: trunk/Source/WebCore/ChangeLog (286495 => 286496)
--- trunk/Source/WebCore/ChangeLog 2021-12-03 17:19:47 UTC (rev 286495)
+++ trunk/Source/WebCore/ChangeLog 2021-12-03 17:35:24 UTC (rev 286496)
@@ -1,3 +1,33 @@
+2021-12-03 Youenn Fablet <[email protected]>
+
+ Improve dictionary-based DOMPromiseDeferred::settle
+ https://bugs.webkit.org/show_bug.cgi?id=233751
+
+ Reviewed by Chris Dumez.
+
+ Make settle a templated function so that it can adapt to any ExceptionOr based type.
+ Update call sites that use settle for non ExceptionOr types as they should either use reject or resolve directly.
+ Covered by existing tests.
+
+ * Modules/applepay/ApplePaySetup.cpp:
+ (WebCore::ApplePaySetup::getSetupFeatures):
+ (WebCore::ApplePaySetup::begin):
+ (WebCore::ApplePaySetup::stop):
+ * Modules/filesystemaccess/FileSystemDirectoryHandle.cpp:
+ (WebCore::FileSystemDirectoryHandle::getFileHandle):
+ (WebCore::FileSystemDirectoryHandle::getDirectoryHandle):
+ (WebCore::FileSystemDirectoryHandle::resolve):
+ * Modules/filesystemaccess/FileSystemFileHandle.cpp:
+ (WebCore::FileSystemFileHandle::createSyncAccessHandle):
+ * bindings/js/JSDOMPromiseDeferred.h:
+ (WebCore::DOMPromiseDeferred::settle):
+ (WebCore::DOMPromiseDeferred<IDLDictionary<T>>::resolve): Deleted.
+ (WebCore::DOMPromiseDeferred<IDLDictionary<T>>::settle): Deleted.
+ (WebCore::DOMPromiseDeferred<IDLInterface<T>>::resolve): Deleted.
+ (WebCore::DOMPromiseDeferred<IDLInterface<T>>::settle): Deleted.
+ * workers/service/ServiceWorkerContainer.cpp:
+ (WebCore::ServiceWorkerContainer::getNavigationPreloadState):
+
2021-12-03 Antti Koivisto <[email protected]>
[:has() pseudo-class] Improve result caching
Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySetup.cpp (286495 => 286496)
--- trunk/Source/WebCore/Modules/applepay/ApplePaySetup.cpp 2021-12-03 17:19:47 UTC (rev 286495)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySetup.cpp 2021-12-03 17:35:24 UTC (rev 286496)
@@ -53,7 +53,7 @@
{
auto canCall = PaymentSession::canCreateSession(document);
if (canCall.hasException()) {
- promise.settle(canCall.releaseException());
+ promise.reject(canCall.releaseException());
return;
}
@@ -78,7 +78,7 @@
page->paymentCoordinator().getSetupFeatures(m_configuration, document.url(), [this, pendingActivity = makePendingActivity(*this)](Vector<Ref<ApplePaySetupFeature>>&& setupFeatures) {
if (m_setupFeaturesPromise)
- std::exchange(m_setupFeaturesPromise, std::nullopt)->settle(WTFMove(setupFeatures));
+ std::exchange(m_setupFeaturesPromise, std::nullopt)->resolve(WTFMove(setupFeatures));
});
}
@@ -86,7 +86,7 @@
{
auto canCall = PaymentSession::canCreateSession(document);
if (canCall.hasException()) {
- promise.settle(canCall.releaseException());
+ promise.reject(canCall.releaseException());
return;
}
@@ -111,7 +111,7 @@
page->paymentCoordinator().beginApplePaySetup(m_configuration, document.url(), WTFMove(features), [this](bool result) {
if (m_beginPromise)
- std::exchange(m_beginPromise, std::nullopt)->settle(result);
+ std::exchange(m_beginPromise, std::nullopt)->resolve(result);
});
}
@@ -125,10 +125,10 @@
void ApplePaySetup::stop()
{
if (m_setupFeaturesPromise)
- std::exchange(m_setupFeaturesPromise, std::nullopt)->settle(Exception { AbortError });
+ std::exchange(m_setupFeaturesPromise, std::nullopt)->reject(Exception { AbortError });
if (m_beginPromise)
- std::exchange(m_beginPromise, std::nullopt)->settle(Exception { AbortError });
+ std::exchange(m_beginPromise, std::nullopt)->reject(Exception { AbortError });
if (auto page = downcast<Document>(*scriptExecutionContext()).page())
page->paymentCoordinator().endApplePaySetup();
Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp (286495 => 286496)
--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp 2021-12-03 17:19:47 UTC (rev 286495)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemDirectoryHandle.cpp 2021-12-03 17:35:24 UTC (rev 286496)
@@ -63,7 +63,7 @@
return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
}
- promise.settle(FileSystemFileHandle::create(*context, String { name }, result.returnValue(), WTFMove(connection)));
+ promise.resolve(FileSystemFileHandle::create(*context, String { name }, result.returnValue(), WTFMove(connection)));
});
}
@@ -84,7 +84,7 @@
return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
}
- promise.settle(FileSystemDirectoryHandle::create(*context, String { name }, identifier, WTFMove(connection)));
+ promise.resolve(FileSystemDirectoryHandle::create(*context, String { name }, identifier, WTFMove(connection)));
});
}
@@ -105,10 +105,7 @@
return promise.reject(Exception { InvalidStateError, "Handle is closed"_s });
connection().resolve(identifier(), handle.identifier(), [promise = WTFMove(promise)](auto result) mutable {
- if (result.hasException())
- return promise.reject(result.releaseException());
-
- promise.resolve(result.releaseReturnValue());
+ promise.settle(WTFMove(result));
});
}
Modified: trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp (286495 => 286496)
--- trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp 2021-12-03 17:19:47 UTC (rev 286495)
+++ trunk/Source/WebCore/Modules/filesystemaccess/FileSystemFileHandle.cpp 2021-12-03 17:35:24 UTC (rev 286496)
@@ -86,7 +86,7 @@
return promise.reject(Exception { InvalidStateError, "Context has stopped"_s });
}
- promise.settle(FileSystemSyncAccessHandle::create(*context, protectedThis.get(), identifier, file));
+ promise.resolve(FileSystemSyncAccessHandle::create(*context, protectedThis.get(), identifier, file));
});
}
Modified: trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h (286495 => 286496)
--- trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h 2021-12-03 17:19:47 UTC (rev 286495)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.h 2021-12-03 17:35:24 UTC (rev 286496)
@@ -274,7 +274,8 @@
m_promise->resolve<IDLType>(std::forward<typename IDLType::ParameterType>(value));
}
- void settle(ExceptionOr<typename IDLType::ParameterType>&& result)
+ template<typename U>
+ void settle(ExceptionOr<U>&& result)
{
if (result.hasException()) {
reject(result.releaseException());
@@ -284,39 +285,6 @@
}
};
-template<typename T>
-class DOMPromiseDeferred<IDLInterface<T>> : public DOMPromiseDeferredBase {
-public:
- using DOMPromiseDeferredBase::DOMPromiseDeferredBase;
- using DOMPromiseDeferredBase::operator=;
- using DOMPromiseDeferredBase::promise;
- using DOMPromiseDeferredBase::reject;
- using IDLType = IDLInterface<T>;
-
- void resolve(typename IDLType::InnerParameterType value)
- {
- m_promise->resolve<IDLType>(std::forward<typename IDLType::ParameterType>(value));
- }
-
- void settle(ExceptionOr<typename IDLType::InnerParameterType>&& result)
- {
- if (result.hasException()) {
- reject(result.releaseException());
- return;
- }
- resolve(result.releaseReturnValue());
- }
-
- void settle(ExceptionOr<typename IDLType::ParameterType>&& result)
- {
- if (result.hasException()) {
- reject(result.releaseException());
- return;
- }
- resolve(result.releaseReturnValue());
- }
-};
-
template<> class DOMPromiseDeferred<void> : public DOMPromiseDeferredBase {
public:
using DOMPromiseDeferredBase::DOMPromiseDeferredBase;
Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp (286495 => 286496)
--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp 2021-12-03 17:19:47 UTC (rev 286495)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp 2021-12-03 17:35:24 UTC (rev 286496)
@@ -671,11 +671,7 @@
void ServiceWorkerContainer::getNavigationPreloadState(ServiceWorkerRegistrationIdentifier identifier, NavigationPreloadStatePromise&& promise)
{
ensureSWClientConnection().getNavigationPreloadState(identifier, [promise = WTFMove(promise)](auto&& result) mutable {
- if (result.hasException()) {
- promise.reject(result.releaseException());
- return;
- }
- promise.resolve(result.releaseReturnValue());
+ promise.settle(WTFMove(result));
});
}