mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 23:59:59 -05:00
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:
parent
23bb0abc23
commit
1a0c7edeba
11 changed files with 102 additions and 1 deletions
2
cli/dts/lib.deno.window.d.ts
vendored
2
cli/dts/lib.deno.window.d.ts
vendored
|
@ -97,6 +97,8 @@ declare class Navigator {
|
||||||
readonly gpu: GPU;
|
readonly gpu: GPU;
|
||||||
readonly hardwareConcurrency: number;
|
readonly hardwareConcurrency: number;
|
||||||
readonly userAgent: string;
|
readonly userAgent: string;
|
||||||
|
readonly language: string;
|
||||||
|
readonly languages: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @category Web APIs */
|
/** @category Web APIs */
|
||||||
|
|
2
cli/dts/lib.deno.worker.d.ts
vendored
2
cli/dts/lib.deno.worker.d.ts
vendored
|
@ -61,6 +61,8 @@ declare class WorkerNavigator {
|
||||||
readonly gpu: GPU;
|
readonly gpu: GPU;
|
||||||
readonly hardwareConcurrency: number;
|
readonly hardwareConcurrency: number;
|
||||||
readonly userAgent: string;
|
readonly userAgent: string;
|
||||||
|
readonly language: string;
|
||||||
|
readonly languages: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @category Web APIs */
|
/** @category Web APIs */
|
||||||
|
|
|
@ -276,6 +276,7 @@ pub async fn run(
|
||||||
.unwrap_or(1),
|
.unwrap_or(1),
|
||||||
debug_flag: metadata.log_level.map_or(false, |l| l == Level::Debug),
|
debug_flag: metadata.log_level.map_or(false, |l| l == Level::Debug),
|
||||||
enable_testing_features: false,
|
enable_testing_features: false,
|
||||||
|
locale: deno_core::v8::icu::get_language_tag(),
|
||||||
location: metadata.location,
|
location: metadata.location,
|
||||||
no_color: !colors::use_color(),
|
no_color: !colors::use_color(),
|
||||||
is_tty: colors::is_tty(),
|
is_tty: colors::is_tty(),
|
||||||
|
|
|
@ -2377,6 +2377,59 @@ itest!(eval_context_throw_dom_exception {
|
||||||
output: "run/eval_context_throw_dom_exception.js.out",
|
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.
|
/// Regression test for https://github.com/denoland/deno/issues/12740.
|
||||||
#[test]
|
#[test]
|
||||||
fn issue12740() {
|
fn issue12740() {
|
||||||
|
|
1
cli/tests/testdata/navigator_language.ts
vendored
Normal file
1
cli/tests/testdata/navigator_language.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log(navigator.language);
|
1
cli/tests/testdata/navigator_languages.ts
vendored
Normal file
1
cli/tests/testdata/navigator_languages.ts
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
console.log(navigator.languages);
|
|
@ -418,6 +418,7 @@ pub async fn create_main_worker(
|
||||||
.log_level()
|
.log_level()
|
||||||
.map_or(false, |l| l == log::Level::Debug),
|
.map_or(false, |l| l == log::Level::Debug),
|
||||||
enable_testing_features: ps.options.enable_testing_features(),
|
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),
|
location: ps.options.location_flag().map(ToOwned::to_owned),
|
||||||
no_color: !colors::use_color(),
|
no_color: !colors::use_color(),
|
||||||
is_tty: colors::is_tty(),
|
is_tty: colors::is_tty(),
|
||||||
|
@ -534,6 +535,7 @@ fn create_web_worker_callback(
|
||||||
.log_level()
|
.log_level()
|
||||||
.map_or(false, |l| l == log::Level::Debug),
|
.map_or(false, |l| l == log::Level::Debug),
|
||||||
enable_testing_features: ps.options.enable_testing_features(),
|
enable_testing_features: ps.options.enable_testing_features(),
|
||||||
|
locale: deno_core::v8::icu::get_language_tag(),
|
||||||
location: Some(args.main_module.clone()),
|
location: Some(args.main_module.clone()),
|
||||||
no_color: !colors::use_color(),
|
no_color: !colors::use_color(),
|
||||||
is_tty: colors::is_tty(),
|
is_tty: colors::is_tty(),
|
||||||
|
|
|
@ -32,6 +32,7 @@ async fn main() -> Result<(), AnyError> {
|
||||||
cpu_count: 1,
|
cpu_count: 1,
|
||||||
debug_flag: false,
|
debug_flag: false,
|
||||||
enable_testing_features: false,
|
enable_testing_features: false,
|
||||||
|
locale: deno_core::v8::icu::get_language_tag(),
|
||||||
location: None,
|
location: None,
|
||||||
no_color: false,
|
no_color: false,
|
||||||
is_tty: false,
|
is_tty: false,
|
||||||
|
|
|
@ -335,7 +335,7 @@ delete Intl.v8BreakIterator;
|
||||||
|
|
||||||
const navigator = webidl.createBranded(Navigator);
|
const navigator = webidl.createBranded(Navigator);
|
||||||
|
|
||||||
let numCpus, userAgent;
|
let numCpus, userAgent, language;
|
||||||
|
|
||||||
ObjectDefineProperties(Navigator.prototype, {
|
ObjectDefineProperties(Navigator.prototype, {
|
||||||
gpu: {
|
gpu: {
|
||||||
|
@ -362,6 +362,22 @@ delete Intl.v8BreakIterator;
|
||||||
return userAgent;
|
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;
|
const NavigatorPrototype = Navigator.prototype;
|
||||||
|
|
||||||
|
@ -393,6 +409,22 @@ delete Intl.v8BreakIterator;
|
||||||
webidl.assertBranded(this, WorkerNavigatorPrototype);
|
webidl.assertBranded(this, WorkerNavigatorPrototype);
|
||||||
return numCpus;
|
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;
|
const WorkerNavigatorPrototype = WorkerNavigator.prototype;
|
||||||
|
@ -705,6 +737,7 @@ delete Intl.v8BreakIterator;
|
||||||
|
|
||||||
numCpus = runtimeOptions.cpuCount;
|
numCpus = runtimeOptions.cpuCount;
|
||||||
userAgent = runtimeOptions.userAgent;
|
userAgent = runtimeOptions.userAgent;
|
||||||
|
language = runtimeOptions.locale;
|
||||||
|
|
||||||
const internalSymbol = Symbol("Deno.internal");
|
const internalSymbol = Symbol("Deno.internal");
|
||||||
|
|
||||||
|
@ -793,6 +826,7 @@ delete Intl.v8BreakIterator;
|
||||||
|
|
||||||
location.setLocationHref(runtimeOptions.location);
|
location.setLocationHref(runtimeOptions.location);
|
||||||
numCpus = runtimeOptions.cpuCount;
|
numCpus = runtimeOptions.cpuCount;
|
||||||
|
language = runtimeOptions.locale;
|
||||||
|
|
||||||
globalThis.pollForMessages = pollForMessages;
|
globalThis.pollForMessages = pollForMessages;
|
||||||
|
|
||||||
|
|
|
@ -549,6 +549,7 @@ mod tests {
|
||||||
cpu_count: 1,
|
cpu_count: 1,
|
||||||
debug_flag: false,
|
debug_flag: false,
|
||||||
enable_testing_features: false,
|
enable_testing_features: false,
|
||||||
|
locale: deno_core::v8::icu::get_language_tag(),
|
||||||
location: None,
|
location: None,
|
||||||
no_color: true,
|
no_color: true,
|
||||||
is_tty: false,
|
is_tty: false,
|
||||||
|
|
|
@ -16,6 +16,7 @@ pub struct BootstrapOptions {
|
||||||
pub cpu_count: usize,
|
pub cpu_count: usize,
|
||||||
pub debug_flag: bool,
|
pub debug_flag: bool,
|
||||||
pub enable_testing_features: bool,
|
pub enable_testing_features: bool,
|
||||||
|
pub locale: String,
|
||||||
pub location: Option<ModuleSpecifier>,
|
pub location: Option<ModuleSpecifier>,
|
||||||
/// Sets `Deno.noColor` in JS runtime.
|
/// Sets `Deno.noColor` in JS runtime.
|
||||||
pub no_color: bool,
|
pub no_color: bool,
|
||||||
|
@ -47,6 +48,7 @@ impl Default for BootstrapOptions {
|
||||||
enable_testing_features: Default::default(),
|
enable_testing_features: Default::default(),
|
||||||
debug_flag: Default::default(),
|
debug_flag: Default::default(),
|
||||||
ts_version: Default::default(),
|
ts_version: Default::default(),
|
||||||
|
locale: "en-EN".to_string(),
|
||||||
location: Default::default(),
|
location: Default::default(),
|
||||||
unstable: Default::default(),
|
unstable: Default::default(),
|
||||||
inspect: Default::default(),
|
inspect: Default::default(),
|
||||||
|
@ -63,6 +65,7 @@ impl BootstrapOptions {
|
||||||
"cpuCount": self.cpu_count,
|
"cpuCount": self.cpu_count,
|
||||||
"debugFlag": self.debug_flag,
|
"debugFlag": self.debug_flag,
|
||||||
"denoVersion": self.runtime_version,
|
"denoVersion": self.runtime_version,
|
||||||
|
"locale": self.locale,
|
||||||
"location": self.location,
|
"location": self.location,
|
||||||
"noColor": self.no_color,
|
"noColor": self.no_color,
|
||||||
"isTty": self.is_tty,
|
"isTty": self.is_tty,
|
||||||
|
|
Loading…
Reference in a new issue