diff --git a/components/config/opts.rs b/components/config/opts.rs index ea1173c6443..f4da0658011 100644 --- a/components/config/opts.rs +++ b/components/config/opts.rs @@ -889,14 +889,7 @@ pub fn from_cmdline_args(args: &[String]) -> ArgumentParsingResult { prefs::add_user_prefs(); for pref in opt_match.opt_strs("pref").iter() { - let split: Vec<&str> = pref.splitn(2, '=').collect(); - let pref_name = split[0]; - let value = split.get(1); - match value { - Some(&"false") => PREFS.set(pref_name, PrefValue::Boolean(false)), - Some(&"true") | None => PREFS.set(pref_name, PrefValue::Boolean(true)), - _ => PREFS.set(pref_name, PrefValue::String(value.unwrap().to_string())) - }; + parse_pref_from_command_line(pref); } if let Some(layout_threads) = layout_threads { @@ -946,6 +939,20 @@ pub fn set_defaults(opts: Opts) { } } +pub fn parse_pref_from_command_line(pref: &str) { + let split: Vec<&str> = pref.splitn(2, '=').collect(); + let pref_name = split[0]; + let value = split.get(1); + match value { + Some(&"false") => PREFS.set(pref_name, PrefValue::Boolean(false)), + Some(&"true") | None => PREFS.set(pref_name, PrefValue::Boolean(true)), + Some(value) => match value.parse::() { + Ok(v) => PREFS.set(pref_name, PrefValue::Number(v)), + Err(_) => PREFS.set(pref_name, PrefValue::String(value.to_string())) + } + }; +} + #[inline] pub fn get() -> &'static Opts { &OPTIONS diff --git a/tests/unit/servo_config/opts.rs b/tests/unit/servo_config/opts.rs index a6827fd05e9..b533429df5b 100644 --- a/tests/unit/servo_config/opts.rs +++ b/tests/unit/servo_config/opts.rs @@ -2,7 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use servo_config::opts::parse_url_or_filename; +use servo_config::opts::{parse_url_or_filename, parse_pref_from_command_line}; +use servo_config::prefs::{PrefValue, PREFS}; use std::path::Path; #[cfg(not(target_os = "windows"))] @@ -67,3 +68,26 @@ fn test_argument_parsing_special() { assert_eq!(url.query(), None); assert_eq!(url.fragment(), None); } + +#[test] +fn test_parse_pref_from_command_line() { + // Test with boolean values. + parse_pref_from_command_line("testtrue=true"); + assert_eq!(*PREFS.get("testtrue"), PrefValue::Boolean(true)); + parse_pref_from_command_line("testfalse=false"); + assert_eq!(*PREFS.get("testfalse"), PrefValue::Boolean(false)); + + // Test with numbers. + parse_pref_from_command_line("testint=42"); + assert_eq!(*PREFS.get("testint"), PrefValue::Number(42 as f64)); + parse_pref_from_command_line("testfloat=4.2"); + assert_eq!(*PREFS.get("testfloat"), PrefValue::Number(4.2)); + + // Test default (string). + parse_pref_from_command_line("teststr=str"); + assert_eq!(*PREFS.get("teststr"), PrefValue::String("str".to_owned())); + + // Test with no value. + parse_pref_from_command_line("testempty"); + assert_eq!(*PREFS.get("testempty"), PrefValue::Boolean(true)); +}