diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index 1c4682225b0..4a343cbb115 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -414,18 +414,22 @@ unsafe fn generic_call(cx: *mut JSContext, -> bool) -> bool { let args = CallArgs::from_vp(vp, argc); + + let info = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp)); + let proto_id = (*info).protoID; + let thisobj = args.thisv(); if !thisobj.get().is_null_or_undefined() && !thisobj.get().is_object() { + throw_invalid_this(cx, proto_id); return false; } + let obj = if thisobj.get().is_object() { thisobj.get().to_object() } else { GetGlobalForObjectCrossCompartment(JS_CALLEE(cx, vp).to_object_or_null()) }; rooted!(in(cx) let obj = obj); - let info = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp)); - let proto_id = (*info).protoID; let depth = (*info).depth; let proto_check = |class: &'static DOMClass| { class.interface_chain[depth as usize] as u16 == proto_id diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index f400c7abdef..a451a31a9c2 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -14739,6 +14739,12 @@ {} ] ], + "mozilla/invalid-this.html": [ + [ + "/_mozilla/mozilla/invalid-this.html", + {} + ] + ], "mozilla/iterable.html": [ [ "/_mozilla/mozilla/iterable.html", @@ -28074,6 +28080,10 @@ "c9dcc4f24540914b3be1ef18f13b721773eb76be", "testharness" ], + "mozilla/invalid-this.html": [ + "4ed18511e6399b356fe196b92f72dd16a9019f55", + "testharness" + ], "mozilla/iterable.html": [ "66f05b1f12b8be392705f5ba4a96c70b9226721d", "testharness" diff --git a/tests/wpt/mozilla/tests/mozilla/invalid-this.html b/tests/wpt/mozilla/tests/mozilla/invalid-this.html new file mode 100644 index 00000000000..bc1e3505226 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/invalid-this.html @@ -0,0 +1,13 @@ + + +Test for #18535: Wrong type arguments to some JS functions abort the execution of the script. + + +