From 204af81d2c18924aeb830c52a8463fbd76137ce4 Mon Sep 17 00:00:00 2001 From: Jay Wang Date: Sat, 12 Jul 2025 19:08:40 +0900 Subject: [PATCH] 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 --- components/script/dom/bindings/error.rs | 1 + components/script/dom/domexception.rs | 5 +++++ components/script/dom/idbdatabase.rs | 3 +-- components/script_bindings/error.rs | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 3cd70bdf0f8..01edba3bfb4 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -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); diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index 0e47bc56719..9309cabe75f 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -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." + }, }; ( diff --git a/components/script/dom/idbdatabase.rs b/components/script/dom/idbdatabase.rs index 18587394229..cf99446dcc1 100644 --- a/components/script/dom/idbdatabase.rs +++ b/components/script/dom/idbdatabase.rs @@ -213,8 +213,7 @@ impl IDBDatabaseMethods 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 diff --git a/components/script_bindings/error.rs b/components/script_bindings/error.rs index 2d9bee9a3d9..ac8b6c3123b 100644 --- a/components/script_bindings/error.rs +++ b/components/script_bindings/error.rs @@ -70,6 +70,8 @@ pub enum Error { NotAllowed, /// EncodingError DOMException Encoding, + /// ConstraintError DOMException + Constraint, /// TypeError JavaScript Error Type(String),