@@ -399,7 +399,7 @@ MaybeLocal<Value> URLPattern::URLPatternResult::ToJSValue(
399
399
400
400
auto tmpl = env->urlpatternresult_template ();
401
401
if (tmpl.IsEmpty ()) {
402
- std::string_view namesVec[] = {
402
+ static constexpr std::string_view namesVec[] = {
403
403
" inputs" ,
404
404
" protocol" ,
405
405
" username" ,
@@ -417,29 +417,59 @@ MaybeLocal<Value> URLPattern::URLPatternResult::ToJSValue(
417
417
size_t index = 0 ;
418
418
auto context = isolate->GetCurrentContext ();
419
419
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
+
420
463
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 */
443
473
};
444
474
return tmpl->NewInstance (env->context (), vals);
445
475
}
0 commit comments