script: Add a Constraint DOMException for IndexedDB (#37605)

Add Constraint DOMException to handle the name conflict error in
`IDBDatabase::createObjectStore` method.

Testing: `./mach test-wpt tests/wpt/tests/IndexedDB/`, but it seems
there are many test failures even in main branch already ([related
comment](https://github.com/servo/servo/pull/37605#issuecomment-2993889163)).
Fixes: #37571

---------

Signed-off-by: iamlockon <xdddxyyyxzzz123@gmail.com>
This commit is contained in:
Jay Wang 2025-07-12 19:08:40 +09:00 committed by GitHub
parent 12d262ec23
commit 204af81d2c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 9 additions and 2 deletions

View file

@ -98,6 +98,7 @@ pub(crate) fn throw_dom_exception(
Error::Operation => DOMErrorName::OperationError,
Error::NotAllowed => DOMErrorName::NotAllowedError,
Error::Encoding => DOMErrorName::EncodingError,
Error::Constraint => DOMErrorName::ConstraintError,
Error::Type(message) => unsafe {
assert!(!JS_IsExceptionPending(*cx));
throw_type_error(*cx, &message);

View file

@ -57,6 +57,7 @@ pub(crate) enum DOMErrorName {
NotReadableError,
OperationError,
NotAllowedError,
ConstraintError,
}
impl DOMErrorName {
@ -92,6 +93,7 @@ impl DOMErrorName {
"NotReadableError" => Some(DOMErrorName::NotReadableError),
"OperationError" => Some(DOMErrorName::OperationError),
"NotAllowedError" => Some(DOMErrorName::NotAllowedError),
"ConstraintError" => Some(DOMErrorName::ConstraintError),
_ => None,
}
}
@ -156,6 +158,9 @@ impl DOMException {
r#"The request is not allowed by the user agent or the platform in the current context,
possibly because the user denied permission."#
},
DOMErrorName::ConstraintError => {
"A mutation operation in a transaction failed because a constraint was not satisfied."
},
};
(

View file

@ -213,8 +213,7 @@ impl IDBDatabaseMethods<crate::DomTypeHolder> for IDBDatabase {
.iter()
.any(|store_name| store_name.to_string() == name.to_string())
{
// TODO: Add constraint as an dom exception and throw that instead
return Err(Error::InvalidState);
return Err(Error::Constraint);
}
// Step 7