gecko/services/sync/FormNotifier.js
Edward Lee 885cffdc6b Bug 559130 - Can't clear search history with Weave 1.2.1 [r=mconnor]
Return any value provided by the base form implementation while making sure we still notify before and after the call.
2010-04-15 13:13:49 -07:00

56 lines
1.5 KiB
JavaScript

const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function FormNotifier() {
let baseForm = Components.classesByID["{a2059c0e-5a58-4c55-ab7c-26f0557546ef}"].
getService(Ci.nsIFormHistory2)
let obs = Cc["@mozilla.org/observer-service;1"].
getService(Ci.nsIObserverService);
for (let keyval in Iterator(baseForm)) {
// Make a local copy of these values
let [key, val] = keyval;
// Don't overwrite something we already have
if (key in this)
continue;
// Make a getter to grab non-functions
if (typeof val != "function") {
this.__defineGetter__(key, function() baseForm[key]);
continue;
}
// Wrap the function with notifications
this[key] = function() {
let args = Array.slice(arguments);
let notify = function(type) {
obs.notifyObservers(null, "form-notifier", JSON.stringify({
args: args,
func: key,
type: type
}));
};
notify("before");
try {
return val.apply(this, arguments);
}
finally {
notify("after");
}
};
}
}
FormNotifier.prototype = {
classDescription: "Form Notifier Wrapper",
contractID: "@mozilla.org/satchel/form-history;1",
classID: Components.ID("{be5a097b-6ee6-4c6a-8eca-6bce87d570e9}"),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIFormHistory2]),
};
let components = [FormNotifier];
function NSGetModule(compMgr, fileSpec) XPCOMUtils.generateModule(components);