Parcourir la source

LibJS: Disallow calendar display names which contain an underscore

This is a normative change in the Intl spec. See:
https://github.com/tc39/ecma402/commit/2703d06
Timothy Flynn il y a 3 ans
Parent
commit
f8e7701cf3

+ 6 - 2
Userland/Libraries/LibJS/Runtime/Intl/DisplayNames.cpp

@@ -150,8 +150,12 @@ ThrowCompletionOr<Value> canonical_code_for_display_names(GlobalObject& global_o
         if (!Unicode::is_type_identifier(code))
             return vm.throw_completion<RangeError>(global_object, ErrorType::OptionIsNotValidValue, code, "calendar"sv);
 
-        // b. Let code be the result of mapping code to lower case as described in 6.1.
-        // c. Return code.
+        // b. If code uses any of the backwards compatibility syntax described in Unicode Technical Standard #35 LDML § 3.3 BCP 47 Conformance, throw a RangeError exception.
+        if (code.contains('_'))
+            return vm.throw_completion<RangeError>(global_object, ErrorType::OptionIsNotValidValue, code, "calendar"sv);
+
+        // c. Let code be the result of mapping code to lower case as described in 6.1.
+        // d. Return code.
         return js_string(vm, code.to_lowercase_string());
     }
 

+ 4 - 0
Userland/Libraries/LibJS/Tests/builtins/Intl/DisplayNames/DisplayNames.prototype.of.js

@@ -27,6 +27,10 @@ describe("errors", () => {
         expect(() => {
             new Intl.DisplayNames("en", { type: "calendar" }).of("hello!");
         }).toThrowWithMessage(RangeError, "hello! is not a valid value for option calendar");
+
+        expect(() => {
+            new Intl.DisplayNames("en", { type: "calendar" }).of("abc_def");
+        }).toThrowWithMessage(RangeError, "abc_def is not a valid value for option calendar");
     });
 
     test("invalid dateTimeField", () => {