@@ -399,7 +399,7 @@ MaybeLocal<Value> URLPattern::URLPatternResult::ToJSValue(
399399
400400 auto tmpl = env->urlpatternresult_template ();
401401 if (tmpl.IsEmpty ()) {
402- std::string_view namesVec[] = {
402+ static constexpr std::string_view namesVec[] = {
403403 " inputs" ,
404404 " protocol" ,
405405 " username" ,
@@ -417,29 +417,59 @@ MaybeLocal<Value> URLPattern::URLPatternResult::ToJSValue(
417417 size_t index = 0 ;
418418 auto context = isolate->GetCurrentContext ();
419419
420+ // We are using a DictionaryTemplate to create the URLPatternResult
421+ // object. We want to make sure that the properties are created without
422+ // errors before we call NewInstance, and bail out early if any fail.
423+
424+ v8::Local<v8::Array> inputs;
425+ if (!Array::New (context,
426+ result.inputs .size (),
427+ [&index, &inputs = result.inputs , env]() {
428+ auto & input = inputs[index++];
429+ if (std::holds_alternative<std::string_view>(input)) {
430+ auto input_str = std::get<std::string_view>(input);
431+ return ToV8Value (env->context (), input_str);
432+ } else {
433+ DCHECK (
434+ std::holds_alternative<ada::url_pattern_init>(input));
435+ auto init = std::get<ada::url_pattern_init>(input);
436+ return URLPatternInit::ToJsObject (env, init);
437+ }
438+ })
439+ .ToLocal (&inputs)) {
440+ return {};
441+ }
442+
443+ Local<Object> results[8 ];
444+ if (!URLPatternComponentResult::ToJSObject (env, result.protocol )
445+ .ToLocal (&results[0 ]) ||
446+ !URLPatternComponentResult::ToJSObject (env, result.username )
447+ .ToLocal (&results[1 ]) ||
448+ !URLPatternComponentResult::ToJSObject (env, result.password )
449+ .ToLocal (&results[2 ]) ||
450+ !URLPatternComponentResult::ToJSObject (env, result.hostname )
451+ .ToLocal (&results[3 ]) ||
452+ !URLPatternComponentResult::ToJSObject (env, result.port )
453+ .ToLocal (&results[4 ]) ||
454+ !URLPatternComponentResult::ToJSObject (env, result.pathname )
455+ .ToLocal (&results[5 ]) ||
456+ !URLPatternComponentResult::ToJSObject (env, result.search )
457+ .ToLocal (&results[6 ]) ||
458+ !URLPatternComponentResult::ToJSObject (env, result.hash )
459+ .ToLocal (&results[7 ])) {
460+ return {};
461+ }
462+
420463 MaybeLocal<Value> vals[] = {
421- Array::New (context,
422- result.inputs .size (),
423- [&index, &inputs = result.inputs , env]() {
424- auto & input = inputs[index++];
425- if (std::holds_alternative<std::string_view>(input)) {
426- auto input_str = std::get<std::string_view>(input);
427- return ToV8Value (env->context (), input_str);
428- } else {
429- DCHECK (
430- std::holds_alternative<ada::url_pattern_init>(input));
431- auto init = std::get<ada::url_pattern_init>(input);
432- return URLPatternInit::ToJsObject (env, init);
433- }
434- }),
435- URLPatternComponentResult::ToJSObject (env, result.protocol ),
436- URLPatternComponentResult::ToJSObject (env, result.username ),
437- URLPatternComponentResult::ToJSObject (env, result.password ),
438- URLPatternComponentResult::ToJSObject (env, result.hostname ),
439- URLPatternComponentResult::ToJSObject (env, result.port ),
440- URLPatternComponentResult::ToJSObject (env, result.pathname ),
441- URLPatternComponentResult::ToJSObject (env, result.search ),
442- URLPatternComponentResult::ToJSObject (env, result.hash ),
464+ inputs,
465+ results[0 ], /* * protocol */
466+ results[1 ], /* * username */
467+ results[2 ], /* * password */
468+ results[3 ], /* * hostname */
469+ results[4 ], /* * port */
470+ results[5 ], /* * pathname */
471+ results[6 ], /* * search */
472+ results[7 ], /* * hash */
443473 };
444474 return tmpl->NewInstance (env->context (), vals);
445475}
0 commit comments