| 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 file, |  | 
|   3  * 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 origGet = obj.__lookupGetter__(name); |  | 
|   9   let origSet = obj.__lookupSetter__(name); |  | 
|  10   let dumbOverrideAttempt = false; |  | 
|  11  |  | 
|  12   let newFunc = function() |  | 
|  13   { |  | 
|  14     let params = arguments; |  | 
|  15     try |  | 
|  16     { |  | 
|  17       let result = func.apply(this, params); |  | 
|  18       if (typeof result == "object") |  | 
|  19         params = result; |  | 
|  20     } |  | 
|  21     catch(e) |  | 
|  22     { |  | 
|  23       Cu.reportError(e); |  | 
|  24     } |  | 
|  25  |  | 
|  26     try |  | 
|  27     { |  | 
|  28       return orig.apply(this, params); |  | 
|  29     } |  | 
|  30     finally |  | 
|  31     { |  | 
|  32       if (typeof cleanup == "function") |  | 
|  33         cleanup(); |  | 
|  34     } |  | 
|  35   }; |  | 
|  36   newFunc.toString = function() |  | 
|  37   { |  | 
|  38     dumbOverrideAttempt = true; |  | 
|  39     return orig.toString(); |  | 
|  40   }; |  | 
|  41  |  | 
|  42   obj.__defineGetter__(name, function() |  | 
|  43   { |  | 
|  44     dumbOverrideAttempt = false; |  | 
|  45     return newFunc; |  | 
|  46   }); |  | 
|  47  |  | 
|  48   obj.__defineSetter__(name, function(value) |  | 
|  49   { |  | 
|  50     if (dumbOverrideAttempt) |  | 
|  51     { |  | 
|  52       orig = value; |  | 
|  53     } |  | 
|  54     else |  | 
|  55     { |  | 
|  56       delete obj[name]; |  | 
|  57       obj[name] = value; |  | 
|  58     } |  | 
|  59   }); |  | 
|  60  |  | 
|  61   return function() |  | 
|  62   { |  | 
|  63     delete obj[name]; |  | 
|  64     obj[name] = orig; |  | 
|  65     if (origGet) |  | 
|  66     { |  | 
|  67       obj.__defineGetter__(name, origGet); |  | 
|  68     } |  | 
|  69     if (origSet) |  | 
|  70     { |  | 
|  71       obj.__defineSetter__(name, origSet); |  | 
|  72     } |  | 
|  73   }; |  | 
|  74 } |  | 
|  75 exports.hook = hook; |  | 
| OLD | NEW |