aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/main.js28
-rw-r--r--lib/persistent-page-mod.js56
-rw-r--r--tests/test-util.js2
3 files changed, 84 insertions, 2 deletions
diff --git a/lib/main.js b/lib/main.js
index eca533e..365d445 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -58,6 +58,18 @@ var bottomRow = {};
// /////////////////////////////////////////////////////////////////////////////
+function doReplace(window) {
+ for (var node in require("text-node").iterator(window.document.body)) {
+ var origText = node.textContent;
+ var newText = origText.replace("friend", "acquaintance", "g");
+ newText = newText.replace("Friend", "Acquaintance", "g");
+ if (newText != origText) {
+ node.textContent = newText;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
let config = {};
config.matches = [
"https://bugzilla.redhat.com/show_bug.cgi",
@@ -89,4 +101,18 @@ util.loadJSON(jetpack.storage.settings.JSONURL, function(parsedData) {
};
jetpack.pageMods.add(callback, config);
-}, this); \ No newline at end of file
+}, this);
+
+////////////////////////////////////////////////////////////////
+
+// FIXME What are the real values of options and callbacks parameters?
+exports.main = function main(options, callbacks) {
+ require("tab-browser").whenContentLoaded(
+ function(window) {
+ if (window.location.protocol == "http:" &&
+ // options.matches
+ window.location.host.match(/facebook.com$/))
+ require("persistent-page-mod").register(window, doReplace);
+ }
+ );
+};s \ No newline at end of file
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);
+};
diff --git a/tests/test-util.js b/tests/test-util.js
index a9d0e6a..6292e84 100644
--- a/tests/test-util.js
+++ b/tests/test-util.js
@@ -186,7 +186,7 @@ exports.ensureLoadText = function (test) {
// test.waitUntilDone();
// util.loadText(url, function (txt) {
// console.log(txt);
-// //test.assertEqual(txt, pushkinTestString);
+// test.assertEqual(txt, pushkinTestString);
// test.done();
// });
// };