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