From db3078fde4c3428539041d1611c82977d5165b9e Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 4 Aug 2014 14:39:04 +0200 Subject: [PATCH 1/4] Fix the double indentation in CastableObjectUnwrapper. The current code indents the first line of codeOnFailure four spaces too far. --- .../script/dom/bindings/codegen/CodegenRust.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 42175de35e4..29d40b33ec7 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -101,19 +101,21 @@ class CastableObjectUnwrapper(): codeOnFailure is the code to run if unwrapping fails. """ def __init__(self, descriptor, source, codeOnFailure): - self.substitution = { "type" : descriptor.nativeType, - "depth": descriptor.interface.inheritanceDepth(), - "prototype": "PrototypeList::id::" + descriptor.name, - "protoID" : "PrototypeList::id::" + descriptor.name + " as uint", - "source" : source, - "codeOnFailure" : CGIndenter(CGGeneric(codeOnFailure), 4).define()} + self.substitution = { + "type": descriptor.nativeType, + "depth": descriptor.interface.inheritanceDepth(), + "prototype": "PrototypeList::id::" + descriptor.name, + "protoID": "PrototypeList::id::" + descriptor.name + " as uint", + "source": source, + "codeOnFailure": CGIndenter(CGGeneric(codeOnFailure), 4).define(), + } def __str__(self): return string.Template( """match unwrap_jsmanaged(${source}, ${prototype}, ${depth}) { Ok(val) => val, Err(()) => { - ${codeOnFailure} +${codeOnFailure} } }""").substitute(self.substitution) From 7f707020be88ea93474ffc66a0687d61af7d9771 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 4 Aug 2014 14:50:47 +0200 Subject: [PATCH 2/4] Remove FailureFatalCastableObjectUnwrapper. The inheritance pattern used here was not particularly enlightening, and only one caller uses FailureFatalCastableObjectUnwrapper. --- .../dom/bindings/codegen/CodegenRust.py | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 29d40b33ec7..5ee43b18e8c 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -119,20 +119,6 @@ ${codeOnFailure} } }""").substitute(self.substitution) -#"""{ -# nsresult rv = UnwrapObject<${protoID}, ${type}>(cx, ${source}, ${target}); -# if (NS_FAILED(rv)) { -#${codeOnFailure} -# } -#}""").substitute(self.substitution) - -class FailureFatalCastableObjectUnwrapper(CastableObjectUnwrapper): - """ - As CastableObjectUnwrapper, but defaulting to throwing if unwrapping fails - """ - def __init__(self, descriptor, source): - CastableObjectUnwrapper.__init__(self, descriptor, source, - "return 0; //XXXjdm return Throw(cx, rv);") class CGThing(): """ @@ -599,15 +585,15 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, raise TypeError("Consequential interface %s being used as an " "argument" % descriptor.interface.identifier.name) - if failureCode is not None: - templateBody = str(CastableObjectUnwrapper( - descriptor, - "(${val}).to_object()", - failureCode)) + if failureCode is None: + unwrapFailureCode = "return 0; //XXXjdm return Throw(cx, rv);" else: - templateBody = str(FailureFatalCastableObjectUnwrapper( - descriptor, - "(${val}).to_object()")) + unwrapFailureCode = failureCode + + templateBody = str(CastableObjectUnwrapper( + descriptor, + "(${val}).to_object()", + unwrapFailureCode)) declType = CGGeneric(descriptorType) if type.nullable(): From 715ae6ab553cdd960a588f85ec67bc3419e4dc1f Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 4 Aug 2014 15:27:56 +0200 Subject: [PATCH 3/4] Throw a TypeError when unwrapping an interface argument fails. --- .../script/dom/bindings/codegen/CodegenRust.py | 10 +++++++++- .../wpt/metadata/dom/nodes/Node-insertBefore.html.ini | 11 ++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 5ee43b18e8c..7de2d949efe 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -586,7 +586,15 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, "argument" % descriptor.interface.identifier.name) if failureCode is None: - unwrapFailureCode = "return 0; //XXXjdm return Throw(cx, rv);" + substitutions = { + "sourceDescription": sourceDescription, + "interface": descriptor.interface.identifier.name, + "exceptionCode": exceptionCode, + } + unwrapFailureCode = string.Template( + 'throw_type_error(cx, "${sourceDescription} does not ' + 'implement interface ${interface}.");\n' + '${exceptionCode}').substitute(substitutions) else: unwrapFailureCode = failureCode diff --git a/src/test/wpt/metadata/dom/nodes/Node-insertBefore.html.ini b/src/test/wpt/metadata/dom/nodes/Node-insertBefore.html.ini index abe89d60ac1..fa7f987c0dc 100644 --- a/src/test/wpt/metadata/dom/nodes/Node-insertBefore.html.ini +++ b/src/test/wpt/metadata/dom/nodes/Node-insertBefore.html.ini @@ -1,6 +1,11 @@ [Node-insertBefore.html] type: testharness - expected: TIMEOUT - [Calling insertBefore with a non-Node first argument must throw TypeError.] - expected: TIMEOUT + [If the context node is a document, inserting a document or text node should throw a HierarchyRequestError.] + expected: FAIL + + [If the context node is a DocumentFragment, inserting a document or a doctype should throw a HierarchyRequestError.] + expected: FAIL + + [If the context node is an element, inserting a document or a doctype should throw a HierarchyRequestError.] + expected: FAIL From be7ef50f27247c81cf02817ae0d87ec3e703898c Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 4 Aug 2014 15:43:04 +0200 Subject: [PATCH 4/4] Throw a TypeError when unwrapping a this object fails. --- src/components/script/dom/bindings/codegen/CodegenRust.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/script/dom/bindings/codegen/CodegenRust.py b/src/components/script/dom/bindings/codegen/CodegenRust.py index 7de2d949efe..dd05ac4f881 100644 --- a/src/components/script/dom/bindings/codegen/CodegenRust.py +++ b/src/components/script/dom/bindings/codegen/CodegenRust.py @@ -2377,7 +2377,10 @@ class CGAbstractBindingMethod(CGAbstractExternMethod): CGAbstractExternMethod.__init__(self, descriptor, name, "JSBool", args) if unwrapFailureCode is None: - self.unwrapFailureCode = "return 0; //XXXjdm return Throw(cx, rv);" + self.unwrapFailureCode = ( + 'throw_type_error(cx, "\\"this\\" object does not ' + 'implement interface %s.");\n' + 'return 0;' % descriptor.interface.identifier.name) else: self.unwrapFailureCode = unwrapFailureCode