Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/hooks.js

Issue 8433028: added hook function to appIntegration to handle function-overwrites from other extensions (Closed)
Patch Set: applied changes from code review Created Sept. 26, 2012, 1:53 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lib/hooks.js
===================================================================
new file mode 100644
--- /dev/null
+++ b/lib/hooks.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+function hook(obj, name, func)
+{
+ let orig = obj[name];
+ let origGet = obj.__lookupGetter__(name);
+ let origSet = obj.__lookupSetter__(name);
+ let dumbOverrideAttempt = false;
+
+ let newFunc = function()
+ {
+ try
+ {
+ func.apply(this, arguments);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ orig.apply(this, arguments);
Wladimir Palant 2012/09/27 14:36:01 This should be: return orig.apply(...) We don't wa
+ };
+ newFunc.toString = function()
+ {
+ dumbOverrideAttempt = true;
+ return orig.toString();
+ };
+
+ obj.__defineGetter__(name, function() {
Wladimir Palant 2012/09/27 14:36:01 This bracket should be on next line.
+ dumbOverrideAttempt = false;
+ return newFunc;
+ });
+
+ obj.__defineSetter__(name, function(value) {
Wladimir Palant 2012/09/27 14:36:01 This bracket should be on next line.
+ if (dumbOverrideAttempt)
+ {
+ orig = value;
+ }
+ else
+ {
+ delete obj[name];
+ obj[name] = value;
+ }
+ });
+
+ return function()
+ {
+ delete obj[name];
+ obj[name] = orig;
+ if (origGet)
+ {
+ obj.__defineGetter__(name, origGet);
+ }
+ if (origSet)
+ {
+ obj.__defineSetter__(name, origSet);
+ }
+ };
+}
+exports.hook = hook;
« lib/appIntegration.js ('K') | « lib/appIntegration.js ('k') | lib/main.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld