| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 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 | 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/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 function hook(obj, name, func, cleanup) | 5 function hook(obj, name, func, cleanup) |
| 6 { | 6 { |
| 7 let orig = obj[name]; | 7 let orig = obj[name]; |
| 8 let origGet = obj.__lookupGetter__(name); | 8 let origDesc = Object.getOwnPropertyDescriptor(obj, name); |
| 9 let origSet = obj.__lookupSetter__(name); | |
| 10 let dumbOverrideAttempt = false; | 9 let dumbOverrideAttempt = false; |
| 11 | 10 |
| 12 let newFunc = function() | 11 let newFunc = function() |
| 13 { | 12 { |
| 14 let params = arguments; | 13 let params = arguments; |
| 15 try | 14 try |
| 16 { | 15 { |
| 17 let result = func.apply(this, params); | 16 let result = func.apply(this, params); |
| 18 if (typeof result == "object") | 17 if (typeof result == "object") |
| 19 params = result; | 18 params = result; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 35 }; | 34 }; |
| 36 newFunc.toString = function() | 35 newFunc.toString = function() |
| 37 { | 36 { |
| 38 dumbOverrideAttempt = true; | 37 dumbOverrideAttempt = true; |
| 39 return orig.toString(); | 38 return orig.toString(); |
| 40 }; | 39 }; |
| 41 newFunc.toSource = function() | 40 newFunc.toSource = function() |
| 42 { | 41 { |
| 43 dumbOverrideAttempt = true; | 42 dumbOverrideAttempt = true; |
| 44 return orig.toSource(); | 43 return orig.toSource(); |
| 45 } | 44 }; |
| 46 | 45 |
| 47 obj.__defineGetter__(name, function() | 46 Object.defineProperty(obj, name, { |
| 48 { | 47 get: function() |
| 49 dumbOverrideAttempt = false; | |
| 50 return newFunc; | |
| 51 }); | |
| 52 | |
| 53 obj.__defineSetter__(name, function(value) | |
| 54 { | |
| 55 if (dumbOverrideAttempt) | |
| 56 { | 48 { |
| 57 orig = value; | 49 dumbOverrideAttempt = false; |
| 58 } | 50 return newFunc; |
| 59 else | 51 }, |
| 52 set: function(value) |
| 60 { | 53 { |
| 61 delete obj[name]; | 54 if (dumbOverrideAttempt) |
| 62 obj[name] = value; | 55 { |
| 63 } | 56 orig = value; |
| 57 } |
| 58 else |
| 59 { |
| 60 delete obj[name]; |
| 61 obj[name] = value; |
| 62 } |
| 63 }, |
| 64 enumerable: true, |
| 65 configurable: true |
| 64 }); | 66 }); |
| 65 | 67 |
| 66 return function() | 68 return function() |
| 67 { | 69 { |
| 68 delete obj[name]; | 70 Object.defineProperty(obj, name, origDesc); |
| 69 obj[name] = orig; | |
| 70 if (origGet) | |
| 71 { | |
| 72 obj.__defineGetter__(name, origGet); | |
| 73 } | |
| 74 if (origSet) | |
| 75 { | |
| 76 obj.__defineSetter__(name, origSet); | |
| 77 } | |
| 78 }; | 71 }; |
| 79 } | 72 } |
| 80 exports.hook = hook; | 73 exports.hook = hook; |
| OLD | NEW |