/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use js::error::throw_type_error; use js::jsapi::JS_IsExceptionPending; use crate::codegen::PrototypeList::proto_id_to_name; use crate::num::Finite; use crate::script_runtime::JSContext as SafeJSContext; /// DOM exceptions that can be thrown by a native DOM method. /// #[derive(Clone, Debug, MallocSizeOf)] pub enum Error { /// IndexSizeError DOMException IndexSize(Option), /// NotFoundError DOMException NotFound(Option), /// HierarchyRequestError DOMException HierarchyRequest(Option), /// WrongDocumentError DOMException WrongDocument(Option), /// InvalidCharacterError DOMException InvalidCharacter(Option), /// NotSupportedError DOMException NotSupported(Option), /// InUseAttributeError DOMException InUseAttribute(Option), /// InvalidStateError DOMException InvalidState(Option), /// SyntaxError DOMException Syntax(Option), /// NamespaceError DOMException Namespace(Option), /// InvalidAccessError DOMException InvalidAccess(Option), /// SecurityError DOMException Security(Option), /// NetworkError DOMException Network(Option), /// AbortError DOMException Abort(Option), /// TimeoutError DOMException Timeout(Option), /// InvalidNodeTypeError DOMException InvalidNodeType(Option), /// DataCloneError DOMException DataClone(Option), /// TransactionInactiveError DOMException TransactionInactive(Option), /// ReadOnlyError DOMException ReadOnly(Option), /// VersionError DOMException Version(Option), /// NoModificationAllowedError DOMException NoModificationAllowed(Option), /// QuotaExceededError DOMException QuotaExceeded { quota: Option>, requested: Option>, }, /// TypeMismatchError DOMException TypeMismatch(Option), /// InvalidModificationError DOMException InvalidModification(Option), /// NotReadableError DOMException NotReadable(Option), /// DataError DOMException Data(Option), /// OperationError DOMException Operation(Option), /// NotAllowedError DOMException NotAllowed(Option), /// EncodingError DOMException Encoding(Option), /// ConstraintError DOMException Constraint(Option), /// TypeError JavaScript Error Type(String), /// RangeError JavaScript Error Range(String), /// A JavaScript exception is already pending. JSFailed, } /// The return type for IDL operations that can throw DOM exceptions. pub type Fallible = Result; /// The return type for IDL operations that can throw DOM exceptions and /// return `()`. pub type ErrorResult = Fallible<()>; /// Throw an exception to signal that a `JSObject` can not be converted to a /// given DOM type. pub fn throw_invalid_this(cx: SafeJSContext, proto_id: u16) { debug_assert!(unsafe { !JS_IsExceptionPending(*cx) }); let error = format!( "\"this\" object does not implement interface {}.", proto_id_to_name(proto_id) ); unsafe { throw_type_error(*cx, &error) }; } pub fn throw_constructor_without_new(cx: SafeJSContext, name: &str) { debug_assert!(unsafe { !JS_IsExceptionPending(*cx) }); let error = format!("{} constructor: 'new' is required", name); unsafe { throw_type_error(*cx, &error) }; }