Bug 1319150 - allow function-style observers in Services shim; r?jdescottes
MozReview-Commit-ID: Zq687zNvyI
--- a/devtools/client/shared/shim/Services.js
+++ b/devtools/client/shared/shim/Services.js
@@ -310,18 +310,24 @@ PrefBranch.prototype = {
_notify: function (relativeName) {
for (let domain in this._observers) {
if (relativeName === domain || domain === "" ||
(domain.endsWith(".") && relativeName.startsWith(domain))) {
// Allow mutation while walking.
let localList = this._observers[domain].slice();
for (let observer of localList) {
try {
- observer.observe(this, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID,
- relativeName);
+ if ("observe" in observer) {
+ observer.observe(this, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID,
+ relativeName);
+ } else {
+ // Function-style observer -- these aren't mentioned in
+ // the IDL, but they're accepted and devtools uses them.
+ observer(this, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, relativeName);
+ }
} catch (e) {
console.error(e);
}
}
}
}
if (this._parent) {
--- a/devtools/client/shared/shim/test/test_service_prefs.html
+++ b/devtools/client/shared/shim/test/test_service_prefs.html
@@ -220,16 +220,24 @@ function do_tests() {
isDeeply(notifications, {
"someotherstring": true
}, "pref worked");
// Regression test for bug 1296427.
pref("devtools.hud.loglimit", 1000);
pref("devtools.hud.loglimit.network", 1000);
+ // Regression test for bug 1319150.
+ let seen = false;
+ let fnObserver = () => { seen = true; };
+ branch0.addObserver("devtools.branch1.somestring", fnObserver, false);
+ Services.prefs.setCharPref("devtools.branch1.somestring", "common merganser");
+ ok(seen, "function-style observer was called");
+ branch0.removeObserver("devtools.branch1.somestring", fnObserver);
+
// Clean up.
localStorage.clear();
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv(