var pb = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);

// This pref is chosen somewhat arbitrarily --- we just need one
// that's guaranteed to have a default value.
const kPrefName = 'intl.accept_languages'; // of type char, which we
                                           // assume below
var initialValue = null;

function check_child_pref_info_eq(continuation) {
    sendCommand(
        'var pb = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);\n'+
        // Returns concatenation "[value],[isUser]"
        'pb.getCharPref("'+ kPrefName +'")+ "," +'+
        'pb.prefHasUserValue("'+ kPrefName +'");',
        function (info) {
            let [ value, isUser ] = info.split(',');
            Assert.equal(pb.getCharPref(kPrefName), value);
            Assert.equal(pb.prefHasUserValue(kPrefName), isUser == "true");
            continuation();
        });
}

function run_test() {
    // We finish in clean_up()
    do_test_pending();

    initialValue = pb.getCharPref(kPrefName);

    test_user_setting();
}

function test_user_setting() {
    // We rely on setting this before the content process starts up.
    // When it starts up, it should recognize this as a user pref, not
    // a default pref.
    pb.setCharPref(kPrefName, 'i-imaginarylanguage');
    // NB: processing of the value-change notification in the child
    // process triggered by the above set happens-before the remaining
    // code here
    check_child_pref_info_eq(function () {
            Assert.equal(pb.prefHasUserValue(kPrefName), true);

            test_cleared_is_default();
        });
}

function test_cleared_is_default() {
    pb.clearUserPref(kPrefName);
    // NB: processing of the value-change notification in the child
    // process triggered by the above set happens-before the remaining
    // code here
    check_child_pref_info_eq(function () {
            Assert.equal(pb.prefHasUserValue(kPrefName), false);

            clean_up();
        });
}

function clean_up() {
    pb.setCharPref(kPrefName, initialValue);
    // NB: processing of the value-change notification in the child
    // process triggered by the above set happens-before the remaining
    // code here
    check_child_pref_info_eq(function () {
            do_test_finished();
        });
}
