Skip to content

Commit

Permalink
implemented missed constructor for DOMException; fixed the tests expe…
Browse files Browse the repository at this point in the history
…ctations
  • Loading branch information
cdeler committed Mar 19, 2019
1 parent 34fda66 commit 220a471
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 520 deletions.
123 changes: 90 additions & 33 deletions components/script/dom/domexception.rs
Expand Up @@ -5,6 +5,7 @@
use crate::dom::bindings::codegen::Bindings::DOMExceptionBinding;
use crate::dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionConstants;
use crate::dom::bindings::codegen::Bindings::DOMExceptionBinding::DOMExceptionMethods;
use crate::dom::bindings::error::Error;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
Expand Down Expand Up @@ -38,43 +39,46 @@ pub enum DOMErrorName {
NotReadableError = DOMExceptionConstants::NOT_READABLE_ERR,
}

impl DOMErrorName {
pub fn from(s: &DOMString) -> Option<DOMErrorName> {
match s.as_ref() {
"IndexSizeError" => Some(DOMErrorName::IndexSizeError),
"HierarchyRequestError" => Some(DOMErrorName::HierarchyRequestError),
"WrongDocumentError" => Some(DOMErrorName::WrongDocumentError),
"InvalidCharacterError" => Some(DOMErrorName::InvalidCharacterError),
"NoModificationAllowedError" => Some(DOMErrorName::NoModificationAllowedError),
"NotFoundError" => Some(DOMErrorName::NotFoundError),
"NotSupportedError" => Some(DOMErrorName::NotSupportedError),
"InUseAttributeError" => Some(DOMErrorName::InUseAttributeError),
"InvalidStateError" => Some(DOMErrorName::InvalidStateError),
"SyntaxError" => Some(DOMErrorName::SyntaxError),
"InvalidModificationError" => Some(DOMErrorName::InvalidModificationError),
"NamespaceError" => Some(DOMErrorName::NamespaceError),
"InvalidAccessError" => Some(DOMErrorName::InvalidAccessError),
"SecurityError" => Some(DOMErrorName::SecurityError),
"NetworkError" => Some(DOMErrorName::NetworkError),
"AbortError" => Some(DOMErrorName::AbortError),
"TypeMismatchError" => Some(DOMErrorName::TypeMismatchError),
"QuotaExceededError" => Some(DOMErrorName::QuotaExceededError),
"TimeoutError" => Some(DOMErrorName::TimeoutError),
"InvalidNodeTypeError" => Some(DOMErrorName::InvalidNodeTypeError),
"DataCloneError" => Some(DOMErrorName::DataCloneError),
"NotReadableError" => Some(DOMErrorName::NotReadableError),
_ => None,
}
}
}

#[dom_struct]
pub struct DOMException {
reflector_: Reflector,
code: DOMErrorName,
message: DOMString,
name: DOMString,
}

impl DOMException {
fn new_inherited(code: DOMErrorName) -> DOMException {
DOMException {
reflector_: Reflector::new(),
code: code,
}
}

pub fn new(global: &GlobalScope, code: DOMErrorName) -> DomRoot<DOMException> {
reflect_dom_object(
Box::new(DOMException::new_inherited(code)),
global,
DOMExceptionBinding::Wrap,
)
}
}

impl DOMExceptionMethods for DOMException {
// https://heycam.github.io/webidl/#dfn-DOMException
fn Code(&self) -> u16 {
self.code as u16
}

// https://heycam.github.io/webidl/#idl-DOMException-error-names
fn Name(&self) -> DOMString {
DOMString::from(format!("{:?}", self.code))
}

// https://heycam.github.io/webidl/#error-names
fn Message(&self) -> DOMString {
let message = match self.code {
fn get_error_data_by_code(code: DOMErrorName) -> (DOMString, DOMString) {
let message = match &code {
DOMErrorName::IndexSizeError => "The index is not in the allowed range.",
DOMErrorName::HierarchyRequestError => {
"The operation would yield an incorrect node tree."
Expand Down Expand Up @@ -105,11 +109,64 @@ impl DOMExceptionMethods for DOMException {
DOMErrorName::NotReadableError => "The I/O read operation failed.",
};

DOMString::from(message)
(
DOMString::from(message),
DOMString::from(format!("{:?}", code)),
)
}

fn new_inherited(message_: DOMString, name_: DOMString) -> DOMException {
DOMException {
reflector_: Reflector::new(),
message: message_,
name: name_,
}
}

pub fn new(global: &GlobalScope, code: DOMErrorName) -> DomRoot<DOMException> {
let (message, name) = DOMException::get_error_data_by_code(code);

reflect_dom_object(
Box::new(DOMException::new_inherited(message, name)),
global,
DOMExceptionBinding::Wrap,
)
}

pub fn Constructor(
global: &GlobalScope,
message: DOMString,
name: DOMString,
) -> Result<DomRoot<DOMException>, Error> {
Ok(reflect_dom_object(
Box::new(DOMException::new_inherited(message, name)),
global,
DOMExceptionBinding::Wrap,
))
}
}

impl DOMExceptionMethods for DOMException {
// https://heycam.github.io/webidl/#dfn-DOMException
fn Code(&self) -> u16 {
match DOMErrorName::from(&self.name) {
Some(code) => code as u16,
None => 0 as u16,
}
}

// https://heycam.github.io/webidl/#idl-DOMException-error-names
fn Name(&self) -> DOMString {
self.name.clone()
}

// https://heycam.github.io/webidl/#error-names
fn Message(&self) -> DOMString {
self.message.clone()
}

// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.tostring
fn Stringifier(&self) -> DOMString {
DOMString::from(format!("{}: {}", self.Name(), self.Message()))
DOMString::from(format!("{}: {}", self.name, self.message))
}
}
6 changes: 5 additions & 1 deletion components/script/dom/webidls/DOMException.webidl
Expand Up @@ -7,7 +7,11 @@
* https://heycam.github.io/webidl/#es-DOMException-constructor-object
*/

[ExceptionClass, Exposed=(Window,Worker)]
[
ExceptionClass,
Exposed=(Window,Worker),
Constructor(optional DOMString message="", optional DOMString name="Error")
]
interface DOMException {
const unsigned short INDEX_SIZE_ERR = 1;
const unsigned short DOMSTRING_SIZE_ERR = 2; // historical
Expand Down
@@ -1,197 +1,11 @@
[DOMException-constructor-behavior.any.worker.html]
type: testharness
[new DOMException()]
expected: FAIL

[new DOMException(): inherited-ness]
expected: FAIL

[new DOMException(null)]
expected: FAIL

[new DOMException(undefined)]
expected: FAIL

[new DOMException(undefined): inherited-ness]
expected: FAIL

[new DOMException("foo")]
expected: FAIL

[new DOMException("foo"): inherited-ness]
expected: FAIL

[new DOMException("bar", undefined)]
expected: FAIL

[new DOMException("bar", "NotSupportedError")]
expected: FAIL

[new DOMException("bar", "NotSupportedError"): inherited-ness]
expected: FAIL

[new DOMException("bar", "foo")]
expected: FAIL

[new DOMexception("msg", "IndexSizeError")]
expected: FAIL

[new DOMexception("msg", "HierarchyRequestError")]
expected: FAIL

[new DOMexception("msg", "WrongDocumentError")]
expected: FAIL

[new DOMexception("msg", "InvalidCharacterError")]
expected: FAIL

[new DOMexception("msg", "NoModificationAllowedError")]
expected: FAIL

[new DOMexception("msg", "NotFoundError")]
expected: FAIL

[new DOMexception("msg", "NotSupportedError")]
expected: FAIL

[new DOMexception("msg", "InUseAttributeError")]
expected: FAIL

[new DOMexception("msg", "InvalidStateError")]
expected: FAIL

[new DOMexception("msg", "SyntaxError")]
expected: FAIL

[new DOMexception("msg", "InvalidModificationError")]
expected: FAIL

[new DOMexception("msg", "NamespaceError")]
expected: FAIL

[new DOMexception("msg", "InvalidAccessError")]
expected: FAIL

[new DOMexception("msg", "SecurityError")]
expected: FAIL

[new DOMexception("msg", "NetworkError")]
expected: FAIL

[new DOMexception("msg", "AbortError")]
expected: FAIL

[new DOMexception("msg", "URLMismatchError")]
expected: FAIL

[new DOMexception("msg", "QuotaExceededError")]
expected: FAIL

[new DOMexception("msg", "TimeoutError")]
expected: FAIL

[new DOMexception("msg", "InvalidNodeTypeError")]
expected: FAIL

[new DOMexception("msg", "DataCloneError")]
expected: FAIL


[DOMException-constructor-behavior.any.html]
type: testharness
[new DOMException()]
expected: FAIL

[new DOMException(): inherited-ness]
expected: FAIL

[new DOMException(null)]
expected: FAIL

[new DOMException(undefined)]
expected: FAIL

[new DOMException(undefined): inherited-ness]
expected: FAIL

[new DOMException("foo")]
expected: FAIL

[new DOMException("foo"): inherited-ness]
expected: FAIL

[new DOMException("bar", undefined)]
expected: FAIL

[new DOMException("bar", "NotSupportedError")]
expected: FAIL

[new DOMException("bar", "NotSupportedError"): inherited-ness]
expected: FAIL

[new DOMException("bar", "foo")]
expected: FAIL

[new DOMexception("msg", "IndexSizeError")]
expected: FAIL

[new DOMexception("msg", "HierarchyRequestError")]
expected: FAIL

[new DOMexception("msg", "WrongDocumentError")]
expected: FAIL

[new DOMexception("msg", "InvalidCharacterError")]
expected: FAIL

[new DOMexception("msg", "NoModificationAllowedError")]
expected: FAIL

[new DOMexception("msg", "NotFoundError")]
expected: FAIL

[new DOMexception("msg", "NotSupportedError")]
expected: FAIL

[new DOMexception("msg", "InUseAttributeError")]
expected: FAIL

[new DOMexception("msg", "InvalidStateError")]
expected: FAIL

[new DOMexception("msg", "SyntaxError")]
expected: FAIL

[new DOMexception("msg", "InvalidModificationError")]
expected: FAIL

[new DOMexception("msg", "NamespaceError")]
expected: FAIL

[new DOMexception("msg", "InvalidAccessError")]
expected: FAIL

[new DOMexception("msg", "SecurityError")]
expected: FAIL

[new DOMexception("msg", "NetworkError")]
expected: FAIL

[new DOMexception("msg", "AbortError")]
expected: FAIL

[new DOMexception("msg", "URLMismatchError")]
expected: FAIL

[new DOMexception("msg", "QuotaExceededError")]
expected: FAIL

[new DOMexception("msg", "TimeoutError")]
expected: FAIL

[new DOMexception("msg", "InvalidNodeTypeError")]
expected: FAIL

[new DOMexception("msg", "DataCloneError")]
expected: FAIL

0 comments on commit 220a471

Please sign in to comment.