aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/util/opts.rs6
-rw-r--r--components/util/prefs.rs48
-rw-r--r--tests/unit/util/lib.rs1
-rw-r--r--tests/unit/util/prefs.rs44
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));
+}