Add an implementation of Function.bind() to fix usage in Safari.
authorRobert Sesek <rsesek@bluestatic.org>
Mon, 2 Jan 2012 03:24:48 +0000 (22:24 -0500)
committerRobert Sesek <rsesek@bluestatic.org>
Mon, 2 Jan 2012 03:24:48 +0000 (22:24 -0500)
web_frontend/utils.js

index 991f339f6f226c9f57cd7d23de42e2ffa5fd1a18..f852bc42d7664d3e06b7728d7866434540ae873a 100644 (file)
@@ -28,3 +28,27 @@ $.extend({
     return this(document.createElement(elm));
   }
 });
+
+// Not all browsers (notably Safari) support ES5 Function.bind(). This is a
+// rough approximation from:
+// <https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind>.
+if (!Function.prototype.bind) {
+  Function.prototype.bind = function (oThis) {
+    if (typeof this !== "function") {
+      // closest thing possible to the ECMAScript 5 internal IsCallable function
+      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
+    }
+
+    var aArgs = Array.prototype.slice.call(arguments, 1);
+    var fToBind = this;
+    var fNOP = function () {};
+    var fBound = function () {
+      return fToBind.apply(this instanceof fNOP ? this : oThis || window,
+                           aArgs.concat(Array.prototype.slice.call(arguments)));
+    };
+
+    fNOP.prototype = this.prototype;
+    fBound.prototype = new fNOP();
+    return fBound;
+  };
+}