| 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 |