diff options
-rw-r--r-- | components/util/opts.rs | 6 | ||||
-rw-r--r-- | components/util/prefs.rs | 48 | ||||
-rw-r--r-- | tests/unit/util/lib.rs | 1 | ||||
-rw-r--r-- | tests/unit/util/prefs.rs | 44 |
4 files changed, 89 insertions, 10 deletions
diff --git a/components/util/opts.rs b/components/util/opts.rs index 4ceafd26438..37253c60540 100644 --- a/components/util/opts.rs +++ b/components/util/opts.rs @@ -805,8 +805,12 @@ pub fn from_cmdline_args(args: &[String]) -> ArgumentParsingResult { set_defaults(opts); - // This must happen after setting the default options, since the prefs rely on + // These must happen after setting the default options, since the prefs rely on // on the resource path. + // Note that command line preferences have the highest precedence + if get().profile_dir.is_some() { + 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]; diff --git a/components/util/prefs.rs b/components/util/prefs.rs index 0d6a4c94660..ff7fbbe5a7e 100644 --- a/components/util/prefs.rs +++ b/components/util/prefs.rs @@ -2,11 +2,14 @@ * 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 opts; use resource_files::resources_dir_path; use rustc_serialize::json::{Json, ToJson}; use std::borrow::ToOwned; use std::collections::HashMap; use std::fs::File; +use std::io::{Read, Write, stderr}; +use std::path::PathBuf; use std::sync::{Arc, Mutex}; lazy_static! { @@ -66,7 +69,8 @@ impl ToJson for PrefValue { } } -enum Pref { +#[derive(Debug)] +pub enum Pref { NoDefault(Arc<PrefValue>), WithDefault(Arc<PrefValue>, Option<Arc<PrefValue>>) } @@ -118,14 +122,8 @@ impl ToJson for Pref { } } -fn read_prefs() -> Result<HashMap<String, Pref>, ()> { - let mut path = resources_dir_path(); - path.push("prefs.json"); - - let mut file = try!(File::open(path).or_else(|e| { - println!("Error opening preferences: {:?}.", e); - Err(()) - })); +pub fn read_prefs_from_file<T>(mut file: T) + -> Result<HashMap<String, Pref>, ()> where T: Read { let json = try!(Json::from_reader(&mut file).or_else(|e| { println!("Ignoring invalid JSON in preferences: {:?}.", e); Err(()) @@ -145,6 +143,38 @@ fn read_prefs() -> Result<HashMap<String, Pref>, ()> { Ok(prefs) } +pub fn extend_prefs(extension: HashMap<String, Pref>) { + PREFS.lock().unwrap().extend(extension); +} + +pub fn add_user_prefs() { + if let Some(ref dir) = opts::get().profile_dir { + let mut path = PathBuf::from(dir); + path.push("prefs.json"); + if let Ok(file) = File::open(path) { + if let Ok(prefs) = read_prefs_from_file(file) { + extend_prefs(prefs); + } + } else { + writeln!(&mut stderr(), "Error opening prefs.json from profile_dir") + .expect("failed printing to stderr"); + } + } +} + +fn read_prefs() -> Result<HashMap<String, Pref>, ()> { + let mut path = resources_dir_path(); + path.push("prefs.json"); + + let file = try!(File::open(path).or_else(|e| { + writeln!(&mut stderr(), "Error opening preferences: {:?}.", e) + .expect("failed printing to stderr"); + Err(()) + })); + + read_prefs_from_file(file) +} + pub fn get_pref(name: &str) -> Arc<PrefValue> { PREFS.lock().unwrap().get(name).map_or(Arc::new(PrefValue::Missing), |x| x.value().clone()) } diff --git a/tests/unit/util/lib.rs b/tests/unit/util/lib.rs index a844057a4b0..d124036bef2 100644 --- a/tests/unit/util/lib.rs +++ b/tests/unit/util/lib.rs @@ -16,3 +16,4 @@ extern crate util; #[cfg(test)] mod opts; #[cfg(test)] mod str; #[cfg(test)] mod thread; +#[cfg(test)] mod prefs; diff --git a/tests/unit/util/prefs.rs b/tests/unit/util/prefs.rs new file mode 100644 index 00000000000..bb0226a7d25 --- /dev/null +++ b/tests/unit/util/prefs.rs @@ -0,0 +1,44 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 util::prefs::{PrefValue, extend_prefs, read_prefs_from_file, get_pref, set_pref, reset_pref, reset_all_prefs}; + +#[test] +fn test_create_pref() { + let json_str = "{\ + \"layout.writing-mode.enabled\": true,\ + \"net.mime.sniff\": false,\ + \"shell.homepage\": \"http://servo.org\"\ +}"; + + let prefs = read_prefs_from_file(json_str.as_bytes()); + assert!(prefs.is_ok()); + let prefs = prefs.unwrap(); + + assert_eq!(prefs.len(), 3); +} + +#[test] +fn test_get_set_reset_extend() { + let json_str = "{\ + \"layout.writing-mode.enabled\": true,\ + \"extra.stuff\": false,\ + \"shell.homepage\": \"https://google.com\"\ +}"; + + assert_eq!(*get_pref("test"), PrefValue::Missing); + set_pref("test", PrefValue::String("hi".to_owned())); + assert_eq!(*get_pref("test"), PrefValue::String("hi".to_owned())); + assert_eq!(*get_pref("shell.homepage"), PrefValue::String("http://servo.org".to_owned())); + set_pref("shell.homepage", PrefValue::Boolean(true)); + assert_eq!(*get_pref("shell.homepage"), PrefValue::Boolean(true)); + reset_pref("shell.homepage"); + assert_eq!(*get_pref("shell.homepage"), PrefValue::String("http://servo.org".to_owned())); + + let extension = read_prefs_from_file(json_str.as_bytes()).unwrap(); + extend_prefs(extension); + assert_eq!(*get_pref("shell.homepage"), PrefValue::String("https://google.com".to_owned())); + assert_eq!(*get_pref("layout.writing-mode.enabled"), PrefValue::Boolean(true)); + assert_eq!(*get_pref("extra.stuff"), PrefValue::Boolean(false)); +} |