diff --git a/common/content/buffer.js b/common/content/buffer.js index 5c2f0c97..9e8b565c 100644 --- a/common/content/buffer.js +++ b/common/content/buffer.js @@ -1217,6 +1217,13 @@ var Buffer = Module("buffer", { return elem || doc.body || doc.documentElement; }, + scrollTo: function scrollTo(elem, left, top) { + if (left != null) + elem.scrollLeft = left; + if (top != null) + elem.scrollTop = top; + }, + scrollVertical: function scrollVertical(elem, increment, number) { elem = elem || Buffer.findScrollable(number, false); let fontSize = parseInt(util.computedStyle(elem).fontSize); @@ -1227,10 +1234,8 @@ var Buffer = Module("buffer", { else throw Error(); - if (number < 0 ? elem.scrollTop > 0 : elem.scrollTop < elem.scrollHeight - elem.clientHeight) - elem.scrollTop += number * increment; - else - dactyl.beep(); + dactyl.assert(number < 0 ? elem.scrollTop > 0 : elem.scrollTop < elem.scrollHeight - elem.clientHeight); + Buffer.scrollTo(elem, null, elem.scrollTop + number * increment); }, scrollHorizontal: function scrollHorizontal(elem, increment, number) { @@ -1243,21 +1248,19 @@ var Buffer = Module("buffer", { else throw Error(); - if (number < 0 ? elem.scrollLeft > 0 : elem.scrollLeft < elem.scrollWidth - elem.clientWidth) - elem.scrollLeft += number * increment; - else - dactyl.beep(); + dactyl.assert(number < 0 ? elem.scrollLeft > 0 : elem.scrollLeft < elem.scrollWidth - elem.clientWidth); + Buffer.scrollTo(elem, elem.scrollLeft + number * increment, null); }, scrollToPercent: function scrollElemToPercent(elem, horizontal, vertical) { elem = elem || Buffer.findScrollable(0, vertical == null); marks.add("'", true); - if (horizontal != null) - elem.scrollLeft = (elem.scrollWidth - elem.clientWidth) * (horizontal / 100); - - if (vertical != null) - elem.scrollTop = (elem.scrollHeight - elem.clientHeight) * (vertical / 100); + Buffer.scrollTo(elem, + horizontal == null ? null + : (elem.scrollWidth - elem.clientWidth) * (horizontal / 100), + vertical == null ? null + : (elem.scrollHeight - elem.clientHeight) * (vertical / 100)); }, openUploadPrompt: function openUploadPrompt(elem) { diff --git a/common/modules/base.jsm b/common/modules/base.jsm index bbae6553..daee9992 100644 --- a/common/modules/base.jsm +++ b/common/modules/base.jsm @@ -690,10 +690,11 @@ function update(target) { desc = desc.value.init(k) || desc.value; if (typeof desc.value == "function" && Object.getPrototypeOf(target)) { let func = desc.value; - desc.value.superapply = function (self, args) + desc.value.__defineGetter__("super", function () Object.getPrototypeOf(target)[k]); + desc.value.superapply = function superapply(self, args) let (meth = Object.getPrototypeOf(target)[k]) meth && meth.apply(self, args); - desc.value.supercall = function (self) + desc.value.supercall = function supercall(self) func.superapply(self, Array.slice(arguments, 1)); } Object.defineProperty(target, k, desc); diff --git a/common/modules/util.jsm b/common/modules/util.jsm index 50ed3c9a..4c769000 100644 --- a/common/modules/util.jsm +++ b/common/modules/util.jsm @@ -988,6 +988,27 @@ var Util = Module("Util", XPCOM([Ci.nsIObserver, Ci.nsISupportsWeakReference]), }), true); }, + overlayObject: function (object, overrides) { + let original = Object.create(object); + overrides = update(Object.create(original), overrides); + + for each (let k in Object.getOwnPropertyNames(overrides)) { + let orig, desc = Object.getOwnPropertyDescriptor(overrides, k); + if (desc.value instanceof Class.Property) + desc = desc.value.init(k) || desc.value; + + for (let obj = object; obj && !orig; obj = Object.getPrototypeOf(obj)) + if (orig = Object.getOwnPropertyDescriptor(obj, k)) + Object.defineProperty(original, k, orig); + + Object.defineProperty(object, k, desc); + } + return function unwrap() { + for each (let k in Object.getOwnPropertyNames(original)) + Object.defineProperty(object, k, Object.getOwnPropertyDescriptor(original, k)); + } + }, + overlayWindow: function (url, fn) { if (url instanceof Ci.nsIDOMWindow) util._loadOverlay(url, fn);