| LEFT | RIGHT | 
| (no file at all) |  | 
 |   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; | 
| LEFT | RIGHT |