@@ -93,6 +93,30 @@ void Parse(const FunctionCallbackInfo<Value>& args) {
9393 args.GetReturnValue ().Set (true );
9494}
9595
96+ void CanParse (const FunctionCallbackInfo<Value>& args) {
97+ CHECK_GE (args.Length (), 2 );
98+ CHECK (args[0 ]->IsString ()); // input
99+ // args[1] // base url
100+
101+ Environment* env = Environment::GetCurrent (args);
102+ HandleScope handle_scope (env->isolate ());
103+ Context::Scope context_scope (env->context ());
104+
105+ Utf8Value input (env->isolate (), args[0 ]);
106+ ada::result base;
107+ ada::url* base_pointer = nullptr ;
108+ if (args[1 ]->IsString ()) {
109+ base = ada::parse (Utf8Value (env->isolate (), args[1 ]).ToString ());
110+ if (!base) {
111+ return args.GetReturnValue ().Set (false );
112+ }
113+ base_pointer = &base.value ();
114+ }
115+ ada::result out = ada::parse (input.ToStringView (), base_pointer);
116+
117+ args.GetReturnValue ().Set (out.has_value ());
118+ }
119+
96120void DomainToASCII (const FunctionCallbackInfo<Value>& args) {
97121 Environment* env = Environment::GetCurrent (args);
98122 CHECK_GE (args.Length (), 1 );
@@ -285,6 +309,7 @@ void Initialize(Local<Object> target,
285309 void * priv) {
286310 SetMethod (context, target, " parse" , Parse);
287311 SetMethod (context, target, " updateUrl" , UpdateUrl);
312+ SetMethodNoSideEffect (context, target, " canParse" , CanParse);
288313 SetMethodNoSideEffect (context, target, " formatUrl" , FormatUrl);
289314
290315 SetMethodNoSideEffect (context, target, " domainToASCII" , DomainToASCII);
@@ -294,6 +319,7 @@ void Initialize(Local<Object> target,
294319
295320void RegisterExternalReferences (ExternalReferenceRegistry* registry) {
296321 registry->Register (Parse);
322+ registry->Register (CanParse);
297323 registry->Register (UpdateUrl);
298324 registry->Register (FormatUrl);
299325
0 commit comments