OLD | NEW |
| (Empty) |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
4 | |
5 function hook(obj, name, func, cleanup) | |
6 { | |
7 let orig = obj[name]; | |
8 let origDesc = Object.getOwnPropertyDescriptor(obj, name); | |
9 let dumbOverrideAttempt = false; | |
10 | |
11 let newFunc = function() | |
12 { | |
13 let params = arguments; | |
14 try | |
15 { | |
16 let result = func.apply(this, params); | |
17 if (typeof result == "object") | |
18 params = result; | |
19 } | |
20 catch(e) | |
21 { | |
22 Cu.reportError(e); | |
23 } | |
24 | |
25 try | |
26 { | |
27 return orig.apply(this, params); | |
28 } | |
29 finally | |
30 { | |
31 if (typeof cleanup == "function") | |
32 cleanup(); | |
33 } | |
34 }; | |
35 newFunc.toString = function() | |
36 { | |
37 dumbOverrideAttempt = true; | |
38 return orig.toString(); | |
39 }; | |
40 newFunc.toSource = function() | |
41 { | |
42 dumbOverrideAttempt = true; | |
43 return orig.toSource(); | |
44 }; | |
45 | |
46 Object.defineProperty(obj, name, { | |
47 get: function() | |
48 { | |
49 dumbOverrideAttempt = false; | |
50 return newFunc; | |
51 }, | |
52 set: function(value) | |
53 { | |
54 if (dumbOverrideAttempt) | |
55 { | |
56 orig = value; | |
57 } | |
58 else | |
59 { | |
60 delete obj[name]; | |
61 obj[name] = value; | |
62 } | |
63 }, | |
64 enumerable: true, | |
65 configurable: true | |
66 }); | |
67 | |
68 return function() | |
69 { | |
70 Object.defineProperty(obj, name, origDesc); | |
71 }; | |
72 } | |
73 exports.hook = hook; | |
OLD | NEW |