Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: chrome/content/tests/qunit.html

Issue 8433028: added hook function to appIntegration to handle function-overwrites from other extensions (Closed)
Left Patch Set: Created Sept. 25, 2012, 4:30 p.m.
Right Patch Set: added missing statement Created Sept. 28, 2012, 9:52 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « chrome/content/tests/qunit.css ('k') | chrome/content/tests/qunit.js » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 <html> 2 <html>
3 <head> 3 <head>
4 <link rel="stylesheet" href="qunit.css"/> 4 <link rel="stylesheet" href="qunit.css"/>
5 <script src="qunit.js"></script> 5 <script src="qunit.js"></script>
6 <script type="text/javascript"> 6 <script src="../common.js" type="text/javascript;version=1.7"></script>
7 (function() 7 <script src="tests/suffixTreeManipulation.js" type="text/javascript;version= 1.7"></script>
8 { 8 <script src="tests/hooks.js" type="text/javascript;version=1.7"></script>
9 var results = [];
10 var gBrowser = null;
11
12 var URLFixer = new (function()
13 {
14 this.hook = function(obj, name, func)
15 {
16 var orig = obj[name];
17 var origGet = obj.__lookupGetter__(name);
18 var origSet = obj.__lookupSetter__(name);
19 var dumbOverrideAttempt = false;
20
21 var newFunc = function()
22 {
23 try
24 {
25 func.apply(this, arguments);
26 }
27 catch(e)
28 {
29 Cu.reportError(e);
30 }
31 orig.apply(this, arguments);
32 }
33 newFunc.toString = function()
34 {
35 dumbOverrideAttempt = true;
36 return orig.toString();
37 }
38
39 obj.__defineGetter__(name, function()
40 {
41 dumbOverrideAttempt = false;
42 return newFunc;
43 }
44 );
45
46 obj.__defineSetter__(name, function(value)
47 {
48 if (dumbOverrideAttempt)
49 {
50 orig = value;
51 }
52 else
53 {
54 delete obj[name];
55 obj[name] = value;
56 }
57 }
58 );
59
60 return function() {
61 delete obj[name];
62 obj[name] = orig;
63 if (origGet) {
64 obj.__defineGetter__(name, origGet);
65 }
66 if (origSet) {
67 obj.__defineSetter__(name, origSet);
68 }
69 }
70 }
71 }
72 )();
73
74 module("function-overwrites",
75 {
76 setup: function()
77 {
78 gBrowser = new (function()
79 {
80 this.foo = function(value)
81 {
82 results.push(value);
83 }
84 }
85 )();
86 },
87 teardown: function()
88 {
89 results = [];
90 gBrowser = null;
91 }
92 }
93 );
94
95 test("no overwrite", function()
96 {
97 var unhook = URLFixer.hook(gBrowser, "foo", function()
98 {
99 results.push(-1);
100 }
101 );
102
103 gBrowser.foo(0);
104 deepEqual(results, [-1, 0]);
105
106 results = [];
107 unhook();
108 gBrowser.foo(0);
109 deepEqual(results, [0]);
110 }
111 );
112
113 test("well implemented overwrite", function()
114 {
115 var unhook = URLFixer.hook(gBrowser, "foo", function()
116 {
117 results.push(-1);
118 }
119 );
120
121 var orig = gBrowser.foo;
122 gBrowser.foo = function()
123 {
124 results.push(1);
125 orig.apply(this, arguments);
126 }
127
128 gBrowser.foo(0);
129 deepEqual(results, [1, -1, 0]);
130
131 results = [];
132 gBrowser.foo = orig;
133 gBrowser.foo(0);
134 deepEqual(results, [-1, 0]);
135
136 results = [];
137 unhook();
138 gBrowser.foo(0);
139 deepEqual(results, [0]);
140 }
141 );
142
143 test("poorly implemented overwrite", function()
144 {
145 var unhook = URLFixer.hook(gBrowser, "foo", function()
146 {
147 results.push(-1);
148 }
149 );
150
151 var func = "results.push(1);";
152 eval("gBrowser.foo = " + gBrowser.foo.toString().replace("{", "{" + func));
153
154 gBrowser.foo(0);
155 deepEqual(results, [-1, 1, 0]);
156
157 results = [];
158 eval("gBrowser.foo = "+gBrowser.foo.toString().replace(func, ""));
159 gBrowser.foo(0);
160 deepEqual(results, [-1, 0]);
161
162 results = [];
163 unhook();
164 gBrowser.foo(0);
165 deepEqual(results, [0]);
166 }
167 );
168
169 test("best implemented overwrite", function()
170 {
171 var unhook = URLFixer.hook(gBrowser, "foo", function()
172 {
173 results.push(-1);
174 }
175 );
176
177 var unhook2 = URLFixer.hook(gBrowser, "foo", function()
178 {
179 results.push(1);
180 }
181 );
182 gBrowser.foo(0);
183 deepEqual(results, [1, -1, 0]);
184
185 results = [];
186 unhook2();
187 gBrowser.foo(0);
188 deepEqual(results, [-1, 0]);
189
190 results = [];
191 unhook();
192 gBrowser.foo(0);
193 deepEqual(results, [0]);
194 }
195 );
196
197 }
198 )();
199 </script>
200 </head> 9 </head>
201 <body> 10 <body>
202 <h1 id="qunit-header">URL Fixer unit tests</h1> 11 <h1 id="qunit-header">URL Fixer unit tests</h1>
203 <h2 id="qunit-banner"></h2> 12 <h2 id="qunit-banner"></h2>
204 <div id="qunit-testrunner-toolbar"></div> 13 <div id="qunit-testrunner-toolbar"></div>
205 <h2 id="qunit-userAgent"></h2> 14 <h2 id="qunit-userAgent"></h2>
206 <ol id="qunit-tests"></ol> 15 <ol id="qunit-tests"></ol>
207 </body> 16 </body>
208 </html> 17 </html>
LEFTRIGHT

Powered by Google App Engine
This is Rietveld