Unwrap function before calling IsConstructor

IsConstructor returns true for all wrappers that are callable. Wrapped
arrow functions are callable and thus IsConstructor will return true
if given one; however, if we unwrap the arrow function, IsConstructor
will return false. The latter is the correct behavior here.
This commit is contained in:
Connor Brewster 2017-06-08 23:37:56 -06:00
parent 82de4c49f3
commit d8510baa29
2 changed files with 10 additions and 6 deletions

View file

@ -26,6 +26,7 @@ use dom::window::Window;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use html5ever::{LocalName, Namespace, Prefix}; use html5ever::{LocalName, Namespace, Prefix};
use js::conversions::ToJSValConvertible; use js::conversions::ToJSValConvertible;
use js::glue::UnwrapObject;
use js::jsapi::{Construct1, IsCallable, IsConstructor, HandleValueArray, HandleObject, MutableHandleValue}; use js::jsapi::{Construct1, IsCallable, IsConstructor, HandleValueArray, HandleObject, MutableHandleValue};
use js::jsapi::{Heap, JS_GetProperty, JSAutoCompartment, JSContext}; use js::jsapi::{Heap, JS_GetProperty, JSAutoCompartment, JSContext};
use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue}; use js::jsval::{JSVal, NullValue, ObjectValue, UndefinedValue};
@ -193,7 +194,15 @@ impl CustomElementRegistryMethods for CustomElementRegistry {
let name = LocalName::from(&*name); let name = LocalName::from(&*name);
// Step 1 // Step 1
if unsafe { !IsConstructor(constructor.get()) } { // We must unwrap the constructor as all wrappers are constructable if they are callable.
rooted!(in(cx) let unwrapped_constructor = unsafe { UnwrapObject(constructor.get(), 1) });
if unwrapped_constructor.is_null() {
// We do not have permission to access the unwrapped constructor.
return Err(Error::Security);
}
if unsafe { !IsConstructor(unwrapped_constructor.get()) } {
return Err(Error::Type("Second argument of CustomElementRegistry.define is not a constructor".to_owned())); return Err(Error::Type("Second argument of CustomElementRegistry.define is not a constructor".to_owned()));
} }

View file

@ -1,5 +0,0 @@
[define.html]
type: testharness
[If constructor is arrow function, should throw a TypeError]
expected: FAIL