| Index: chrome/content/tests/qunit.html |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/chrome/content/tests/qunit.html |
| @@ -0,0 +1,208 @@ |
| +<!DOCTYPE html> |
| +<html> |
| + <head> |
| + <link rel="stylesheet" href="qunit.css"/> |
| + <script src="qunit.js"></script> |
| + <script type="text/javascript"> |
| + (function() |
| + { |
| + var results = []; |
| + var gBrowser = null; |
| + |
| + var URLFixer = new (function() |
| + { |
| + this.hook = function(obj, name, func) |
| + { |
| + var orig = obj[name]; |
| + var origGet = obj.__lookupGetter__(name); |
| + var origSet = obj.__lookupSetter__(name); |
| + var dumbOverrideAttempt = false; |
| + |
| + var newFunc = function() |
| + { |
| + try |
| + { |
| + func.apply(this, arguments); |
| + } |
| + catch(e) |
| + { |
| + Cu.reportError(e); |
| + } |
| + orig.apply(this, arguments); |
| + } |
| + newFunc.toString = function() |
| + { |
| + dumbOverrideAttempt = true; |
| + return orig.toString(); |
| + } |
| + |
| + obj.__defineGetter__(name, function() |
| + { |
| + dumbOverrideAttempt = false; |
| + return newFunc; |
| + } |
| + ); |
| + |
| + obj.__defineSetter__(name, function(value) |
| + { |
| + if (dumbOverrideAttempt) |
| + { |
| + orig = value; |
| + } |
| + else |
| + { |
| + delete obj[name]; |
| + obj[name] = value; |
| + } |
| + } |
| + ); |
| + |
| + return function() { |
| + delete obj[name]; |
| + obj[name] = orig; |
| + if (origGet) { |
| + obj.__defineGetter__(name, origGet); |
| + } |
| + if (origSet) { |
| + obj.__defineSetter__(name, origSet); |
| + } |
| + } |
| + } |
| + } |
| + )(); |
| + |
| + module("function-overwrites", |
| + { |
| + setup: function() |
| + { |
| + gBrowser = new (function() |
| + { |
| + this.foo = function(value) |
| + { |
| + results.push(value); |
| + } |
| + } |
| + )(); |
| + }, |
| + teardown: function() |
| + { |
| + results = []; |
| + gBrowser = null; |
| + } |
| + } |
| + ); |
| + |
| + test("no overwrite", function() |
| + { |
| + var unhook = URLFixer.hook(gBrowser, "foo", function() |
| + { |
| + results.push(-1); |
| + } |
| + ); |
| + |
| + gBrowser.foo(0); |
| + deepEqual(results, [-1, 0]); |
| + |
| + results = []; |
| + unhook(); |
| + gBrowser.foo(0); |
| + deepEqual(results, [0]); |
| + } |
| + ); |
| + |
| + test("well implemented overwrite", function() |
| + { |
| + var unhook = URLFixer.hook(gBrowser, "foo", function() |
| + { |
| + results.push(-1); |
| + } |
| + ); |
| + |
| + var orig = gBrowser.foo; |
| + gBrowser.foo = function() |
| + { |
| + results.push(1); |
| + orig.apply(this, arguments); |
| + } |
| + |
| + gBrowser.foo(0); |
| + deepEqual(results, [1, -1, 0]); |
| + |
| + results = []; |
| + gBrowser.foo = orig; |
| + gBrowser.foo(0); |
| + deepEqual(results, [-1, 0]); |
| + |
| + results = []; |
| + unhook(); |
| + gBrowser.foo(0); |
| + deepEqual(results, [0]); |
| + } |
| + ); |
| + |
| + test("poorly implemented overwrite", function() |
| + { |
| + var unhook = URLFixer.hook(gBrowser, "foo", function() |
| + { |
| + results.push(-1); |
| + } |
| + ); |
| + |
| + var func = "results.push(1);"; |
| + eval("gBrowser.foo = " + gBrowser.foo.toString().replace("{", "{" + func)); |
| + |
| + gBrowser.foo(0); |
| + deepEqual(results, [-1, 1, 0]); |
| + |
| + results = []; |
| + eval("gBrowser.foo = "+gBrowser.foo.toString().replace(func, "")); |
| + gBrowser.foo(0); |
| + deepEqual(results, [-1, 0]); |
| + |
| + results = []; |
| + unhook(); |
| + gBrowser.foo(0); |
| + deepEqual(results, [0]); |
| + } |
| + ); |
| + |
| + test("best implemented overwrite", function() |
| + { |
| + var unhook = URLFixer.hook(gBrowser, "foo", function() |
| + { |
| + results.push(-1); |
| + } |
| + ); |
| + |
| + var unhook2 = URLFixer.hook(gBrowser, "foo", function() |
| + { |
| + results.push(1); |
| + } |
| + ); |
| + gBrowser.foo(0); |
| + deepEqual(results, [1, -1, 0]); |
| + |
| + results = []; |
| + unhook2(); |
| + gBrowser.foo(0); |
| + deepEqual(results, [-1, 0]); |
| + |
| + results = []; |
| + unhook(); |
| + gBrowser.foo(0); |
| + deepEqual(results, [0]); |
| + } |
| + ); |
| + |
| + } |
| + )(); |
| + </script> |
| + </head> |
| + <body> |
| + <h1 id="qunit-header">URL Fixer unit tests</h1> |
| + <h2 id="qunit-banner"></h2> |
| + <div id="qunit-testrunner-toolbar"></div> |
| + <h2 id="qunit-userAgent"></h2> |
| + <ol id="qunit-tests"></ol> |
| + </body> |
| +</html> |