From 302f20192c7717bdbdcf14cd4db1e30367892d17 Mon Sep 17 00:00:00 2001 From: KirtiRamchandani Date: Mon, 1 Jun 2026 21:54:11 +0530 Subject: [PATCH] Improve Engine.check argument errors --- js/src/lib.rs | 14 +++++++++++--- js/test/bindings.test.mjs | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/js/src/lib.rs b/js/src/lib.rs index d6577086..cdb15178 100644 --- a/js/src/lib.rs +++ b/js/src/lib.rs @@ -53,6 +53,14 @@ mod json_ffi { } } +fn string_argument(cx: &mut FunctionContext, index: i32, name: &str) -> NeonResult { + let value = cx.argument::(index)?; + match value.downcast::(cx) { + Ok(value) => Ok(value.value(cx)), + Err(_) => cx.throw_type_error(format!("{name} argument expected string")), + } +} + #[derive(Serialize, Deserialize)] struct EngineOptions { pub optimize: Option, @@ -181,9 +189,9 @@ fn engine_constructor(mut cx: FunctionContext) -> JsResult> { fn engine_check(mut cx: FunctionContext) -> JsResult { let this = cx.argument::>(0)?; - let url: String = cx.argument::(1)?.value(&mut cx); - let source_url: String = cx.argument::(2)?.value(&mut cx); - let request_type: String = cx.argument::(3)?.value(&mut cx); + let url = string_argument(&mut cx, 1, "url")?; + let source_url = string_argument(&mut cx, 2, "source_url")?; + let request_type = string_argument(&mut cx, 3, "request_type")?; let debug = match cx.argument_opt(4) { Some(arg) => { diff --git a/js/test/bindings.test.mjs b/js/test/bindings.test.mjs index 2cca2147..5cecc0e1 100644 --- a/js/test/bindings.test.mjs +++ b/js/test/bindings.test.mjs @@ -178,6 +178,22 @@ describe('Engine.check — basic blocking', () => { assert.throws(() => engine.check('not a url', 'https://publisher.com', 'script')); }); + it('throws descriptive errors for invalid argument types', () => { + const engine = new Engine(new FilterSet(), true); + assert.throws( + () => engine.check(undefined, 'https://publisher.com', 'script'), + /url argument expected string/, + ); + assert.throws( + () => engine.check('https://example.com', undefined, 'script'), + /source_url argument expected string/, + ); + assert.throws( + () => engine.check('https://example.com', 'https://publisher.com', undefined), + /request_type argument expected string/, + ); + }); + it('EngineOptions object works as alternative to boolean', () => { const fs = new FilterSet(); fs.addFilters(['||blocked.com^']);