feat: introduce navigator.language (#12322)

Link to the spec:
https://html.spec.whatwg.org/multipage/system-state.html#dom-navigator-language-dev

Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
This commit is contained in:
Luca Matei Pintilie 2022-10-18 15:33:35 +02:00 committed by GitHub
parent 23bb0abc23
commit 1a0c7edeba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 102 additions and 1 deletions

View file

@ -97,6 +97,8 @@ declare class Navigator {
readonly gpu: GPU;
readonly hardwareConcurrency: number;
readonly userAgent: string;
readonly language: string;
readonly languages: string[];
}
/** @category Web APIs */

View file

@ -61,6 +61,8 @@ declare class WorkerNavigator {
readonly gpu: GPU;
readonly hardwareConcurrency: number;
readonly userAgent: string;
readonly language: string;
readonly languages: string[];
}
/** @category Web APIs */

View file

@ -276,6 +276,7 @@ pub async fn run(
.unwrap_or(1),
debug_flag: metadata.log_level.map_or(false, |l| l == Level::Debug),
enable_testing_features: false,
locale: deno_core::v8::icu::get_language_tag(),
location: metadata.location,
no_color: !colors::use_color(),
is_tty: colors::is_tty(),

View file

@ -2377,6 +2377,59 @@ itest!(eval_context_throw_dom_exception {
output: "run/eval_context_throw_dom_exception.js.out",
});
#[test]
#[cfg(unix)]
fn navigator_language_unix() {
let (res, _) = util::run_and_collect_output(
true,
"run navigator_language.ts",
None,
Some(vec![("LC_ALL".to_owned(), "pl_PL".to_owned())]),
false,
);
assert_eq!(res, "pl-PL\n")
}
#[test]
fn navigator_language() {
let (res, _) = util::run_and_collect_output(
true,
"run navigator_language.ts",
None,
None,
false,
);
assert!(!res.is_empty())
}
#[test]
#[cfg(unix)]
fn navigator_languages_unix() {
let (res, _) = util::run_and_collect_output(
true,
"run navigator_languages.ts",
None,
Some(vec![
("LC_ALL".to_owned(), "pl_PL".to_owned()),
("NO_COLOR".to_owned(), "1".to_owned()),
]),
false,
);
assert_eq!(res, "[ \"pl-PL\" ]\n")
}
#[test]
fn navigator_languages() {
let (res, _) = util::run_and_collect_output(
true,
"run navigator_languages.ts",
None,
None,
false,
);
assert!(!res.is_empty())
}
/// Regression test for https://github.com/denoland/deno/issues/12740.
#[test]
fn issue12740() {

View file

@ -0,0 +1 @@
console.log(navigator.language);

View file

@ -0,0 +1 @@
console.log(navigator.languages);

View file

@ -418,6 +418,7 @@ pub async fn create_main_worker(
.log_level()
.map_or(false, |l| l == log::Level::Debug),
enable_testing_features: ps.options.enable_testing_features(),
locale: deno_core::v8::icu::get_language_tag(),
location: ps.options.location_flag().map(ToOwned::to_owned),
no_color: !colors::use_color(),
is_tty: colors::is_tty(),
@ -534,6 +535,7 @@ fn create_web_worker_callback(
.log_level()
.map_or(false, |l| l == log::Level::Debug),
enable_testing_features: ps.options.enable_testing_features(),
locale: deno_core::v8::icu::get_language_tag(),
location: Some(args.main_module.clone()),
no_color: !colors::use_color(),
is_tty: colors::is_tty(),

View file

@ -32,6 +32,7 @@ async fn main() -> Result<(), AnyError> {
cpu_count: 1,
debug_flag: false,
enable_testing_features: false,
locale: deno_core::v8::icu::get_language_tag(),
location: None,
no_color: false,
is_tty: false,

View file

@ -335,7 +335,7 @@ delete Intl.v8BreakIterator;
const navigator = webidl.createBranded(Navigator);
let numCpus, userAgent;
let numCpus, userAgent, language;
ObjectDefineProperties(Navigator.prototype, {
gpu: {
@ -362,6 +362,22 @@ delete Intl.v8BreakIterator;
return userAgent;
},
},
language: {
configurable: true,
enumerable: true,
get() {
webidl.assertBranded(this, NavigatorPrototype);
return language;
},
},
languages: {
configurable: true,
enumerable: true,
get() {
webidl.assertBranded(this, NavigatorPrototype);
return [language];
},
},
});
const NavigatorPrototype = Navigator.prototype;
@ -393,6 +409,22 @@ delete Intl.v8BreakIterator;
webidl.assertBranded(this, WorkerNavigatorPrototype);
return numCpus;
},
language: {
configurable: true,
enumerable: true,
get() {
webidl.assertBranded(this, WorkerNavigatorPrototype);
return language;
},
},
languages: {
configurable: true,
enumerable: true,
get() {
webidl.assertBranded(this, WorkerNavigatorPrototype);
return [language];
},
},
},
});
const WorkerNavigatorPrototype = WorkerNavigator.prototype;
@ -705,6 +737,7 @@ delete Intl.v8BreakIterator;
numCpus = runtimeOptions.cpuCount;
userAgent = runtimeOptions.userAgent;
language = runtimeOptions.locale;
const internalSymbol = Symbol("Deno.internal");
@ -793,6 +826,7 @@ delete Intl.v8BreakIterator;
location.setLocationHref(runtimeOptions.location);
numCpus = runtimeOptions.cpuCount;
language = runtimeOptions.locale;
globalThis.pollForMessages = pollForMessages;

View file

@ -549,6 +549,7 @@ mod tests {
cpu_count: 1,
debug_flag: false,
enable_testing_features: false,
locale: deno_core::v8::icu::get_language_tag(),
location: None,
no_color: true,
is_tty: false,

View file

@ -16,6 +16,7 @@ pub struct BootstrapOptions {
pub cpu_count: usize,
pub debug_flag: bool,
pub enable_testing_features: bool,
pub locale: String,
pub location: Option<ModuleSpecifier>,
/// Sets `Deno.noColor` in JS runtime.
pub no_color: bool,
@ -47,6 +48,7 @@ impl Default for BootstrapOptions {
enable_testing_features: Default::default(),
debug_flag: Default::default(),
ts_version: Default::default(),
locale: "en-EN".to_string(),
location: Default::default(),
unstable: Default::default(),
inspect: Default::default(),
@ -63,6 +65,7 @@ impl BootstrapOptions {
"cpuCount": self.cpu_count,
"debugFlag": self.debug_flag,
"denoVersion": self.runtime_version,
"locale": self.locale,
"location": self.location,
"noColor": self.no_color,
"isTty": self.is_tty,