aboutsummaryrefslogtreecommitdiffstats
path: root/lib/persistent-page-mod.js
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@redhat.com>2010-06-07 16:48:07 +0200
committerMatěj Cepl <mcepl@redhat.com>2010-06-07 16:48:07 +0200
commitad87ad529947e29adbee0dc2016069b71495a609 (patch)
tree1e92f8a955fb49cdc20747168021a81869071ad4 /lib/persistent-page-mod.js
parent2b95e7ae6cb53f987931de8f567870b9e69cdf9a (diff)
downloadbugzilla-triage-ad87ad529947e29adbee0dc2016069b71495a609.tar.gz
Adding JEP-10 support.
Diffstat (limited to 'lib/persistent-page-mod.js')
-rw-r--r--lib/persistent-page-mod.js56
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/persistent-page-mod.js b/lib/persistent-page-mod.js
new file mode 100644
index 0000000..5c00a8f
--- /dev/null
+++ b/lib/persistent-page-mod.js
@@ -0,0 +1,56 @@
+var timer = require("timer");
+
+function PersistentPageMod(window, callback) {
+ memory.track(this);
+ this.window = window;
+ this.callback = callback;
+ this.window.addEventListener("unload", this, false);
+ this.window.addEventListener("DOMSubtreeModified", this, false);
+ this.doMod();
+ require("unload-2").ensure(this);
+}
+
+PersistentPageMod.prototype = {
+ REPLACE_DELAY: 100,
+ doMod: function doMod() {
+ try {
+ this.callback.call(undefined, this.window);
+ } catch (e) {
+ console.exception(e);
+ }
+ this.timerID = null;
+ },
+ handleEvent: function handleEvent(event) {
+ switch (event.type) {
+ case "unload":
+ if (event.target == this.window.document)
+ this.unload();
+ break;
+ case "DOMSubtreeModified":
+ if (this.timerID == null) {
+ // Wait a bit to do the replacing. Otherwise, we just get called
+ // tons of times in a tiny period and end up hanging the browser
+ // for a while.
+ var self = this;
+ this.timerID = timer.setTimeout(function() self.doMod(),
+ this.REPLACE_DELAY);
+ }
+ break;
+ }
+ },
+ unload: function unload() {
+ if (this.timerID != null) {
+ timer.clearTimeout(this.timerID);
+ this.timerID = null;
+ }
+ this.window.removeEventListener("DOMSubtreeModified", this, false);
+ this.window.removeEventListener("unload", this, false);
+ }
+};
+
+require("errors").catchAndLogProps(PersistentPageMod.prototype,
+ "handleEvent");
+
+var register = exports.register = function register(window, callback) {
+ new PersistentPageMod(window, callback);
+};